20250106面试

rabbitmq如何保证消息不丢失

my:

持久化,包括消息持久化和队列持久化,重启不丢失。持久化到磁盘中的。

消息确认

死信队列:消费失败(业务异常/未确认,重试后,会放死信队列),TTL,满了

集群+队列镜像,即使一个节点挂了,其他节点还有数据,不会丢失。

重试

---

在 RabbitMQ 中,确保消息不丢失通常涉及多个层次的配置和实践,主要包括消息持久化、队列持久化、确认机制以及合理的高可用配置。下面是确保消息不丢失的几种常见方法:

1. 消息持久化(Message Durability)

RabbitMQ 默认情况下将消息存储在内存中,这意味着如果 RabbitMQ 守护进程崩溃,消息可能会丢失。为了避免这种情况,你需要将消息持久化到磁盘。

  • 消息持久化:在发送消息时,设置消息的 delivery_mode 属性为 2,表示消息应该被持久化到磁盘。

     

    python

    channel.basic_publish( exchange='', routing_key='queue_name', body='Hello World!', properties=pika.BasicProperties( delivery_mode=2 # 使消息持久化 ) )
  • 队列持久化:即使消息本身被持久化,如果队列本身没有设置持久化,RabbitMQ 在重启时仍然会丢失队列。为了避免这种情况,你需要确保队列本身也是持久化的。

    创建持久化队列的示例(使用 durable=True):

     

    python

    channel.queue_declare(queue='queue_name', durable=True)

    这确保了即使 RabbitMQ 重启,队列也不会丢失。

2. 交换器持久化(Exchange Durability)

为了确保交换器不丢失,在创建交换器时,也需要将其持久化。你可以通过将 durable=True 设置为交换器的属性来确保其持久化:

 

python

channel.exchange_declare(exchange='my_exchange', exchange_type='direct', durable=True)

3. 消费者确认机制(Message Acknowledgement)

消费者需要显式确认消息已经被正确处理,否则消息会被重新投递。如果消费者没有确认消息,而 RabbitMQ 又没有收到 ACK 确认,则消息会在队列中保留,直到消费者处理完并确认。

  • 自动确认:如果 auto_ack 设置为 True,RabbitMQ 会认为消息已经被消费者处理,无论消费者是否处理成功。这会导致消息丢失的风险。

     

    python

    channel.basic_consume(queue='queue_name', on_message_callback=callback, auto_ack=True)

    上面的设置是不安全的,因为它不能保证消息已经被处理。

  • 手动确认:最安全的做法是关闭 auto_ack,并在消费者处理完消息后手动发送 ack 确认消息。

     

    python

    def callback(ch, method, properties, body): print(f"Received message: {body}") ch.basic_ack(delivery_tag=method.delivery_tag) # 手动确认消息

    使用 basic_ack 进行消息确认,确保消息在消费者成功处理后才从队列中移除。

    你还可以设置 basic_nack 来拒绝消息并让它重新入队,避免消息丢失。

4. 未确认消息的处理(Dead Letter Exchange, DLX)

RabbitMQ 支持死信队列(Dead Letter Queue, DLX),即如果某个消息无法被消费者处理,可以将它放到另外一个队列,避免丢失。

配置死信队列(DLX)示例:

 

python

channel.queue_declare(queue='main_queue', durable=True, arguments={ 'x-dead-letter-exchange': 'dlx_exchange' }) channel.queue_declare(queue='dlx_queue', durable=True)

如果消息在主队列中被拒绝或过期,消息将会被送到 dlx_queue 中。

5. 高可用集群(Mirrored Queues)

为了避免单点故障,RabbitMQ 提供了集群和镜像队列(Mirrored Queues)功能,可以将消息复制到多个节点上。即使一个节点发生故障,消息也不会丢失,因为它已经被镜像到其他节点。

  • 镜像队列:镜像队列可以确保消息在多个 RabbitMQ 节点之间保持同步,这样即使一个节点崩溃,其他节点仍然可以提供服务。
 

python

channel.queue_declare(queue='queue_name', durable=True, arguments={ 'x-queue-type': 'quorum' # 使用 Quorum 队列提高消息可靠性 })

quorum 队列比传统的镜像队列提供更高的可靠性,适用于需要高可靠性的场景。

6. 事务机制(Transactional Publisher)

虽然事务机制可以确保消息在提交之前不丢失,但它的性能较低,一般不推荐用于高吞吐量的生产环境。可以通过将消息发布到事务中来确保消息的持久化。

 

python

channel.tx_select() # 开始事务 try: channel.basic_publish(...) channel.tx_commit() # 提交事务 except: channel.tx_rollback() # 回滚事务

7. 消息重试(Message Retry)

如果消费者无法处理消息(比如遇到临时问题),可以使用 消息重试机制(例如通过延时队列)来确保消息最终能够被处理,而不是直接丢失。

RabbitMQ 本身不直接提供消息重试功能,但你可以通过将消息重新发送到队列、设置消息的 x-delayed-message 属性,或者使用死信队列和延时插件来实现消息的重试机制。

总结

在 RabbitMQ 中,要保证消息不丢失,通常需要结合以下几个方面的配置:

  1. 持久化消息:设置消息 delivery_mode=2 使其持久化。
  2. 持久化队列和交换器:确保队列和交换器也都是持久化的。
  3. 消费者确认:确保消费者在处理完消息后发出确认(ack)。
  4. 高可用架构:使用镜像队列和集群来防止单点故障。
  5. 死信队列(DLX)和消息重试:使用死信队列和延时队列来确保消息不会因为暂时的处理失败而丢失。

通过结合这些策略,可以显著降低消息丢失的风险,并提高 RabbitMQ 系统的可靠性。

jvm调优,内存怎么分配,8G内存

在JVM调优过程中,合理分配内存是关键。Java应用的性能往往受到JVM内存分配策略的影响,尤其是当内存资源有限时。对于一个8GB的物理内存系统,如何合理配置JVM内存参数,可以有效避免内存溢出、频繁GC、长时间停顿等问题。

JVM内存的主要区域

JVM内存主要分为以下几个区域,每个区域的大小和管理方式都需要合理配置:

  1. 堆内存(Heap Memory)

    • 负责存储对象实例、数组等动态分配的内存。
    • 年轻代(Young Generation):用于存放新创建的对象。大部分对象在年轻代中迅速死亡,经过垃圾回收后会被清除。
    • 老年代(Old Generation):存放存活较长时间的对象。当年轻代无法容纳更多对象时,存活的对象会被晋升到老年代。
    • 永久代(PermGen) / 元空间(Metaspace):用于存放类的元数据(如类的结构信息)。在JVM 8以后,永久代被元空间取代,元空间使用本地内存而非JVM堆内存。
  2. 非堆内存(Non-Heap Memory)

    • 包括方法区、代码缓存、JVM内部的数据结构等。

8GB内存系统的JVM内存分配方案

对于一个总内存为 8GB 的物理内存系统,我们需要合理地分配给JVM的内存,确保既能提供足够的内存空间,又能避免超出物理内存限制导致的系统负载过高。

通常,8GB内存的机器可以将 JVM堆内存 配置为 4GB-6GB,留出一部分内存给操作系统和其他进程。以下是一个常见的配置方案:

JVM内存调优示例(假设使用8GB内存的机器)

  1. 最大堆内存

    • 设置最大堆内存为4GB。
     

    bash

    -Xmx4g
  2. 初始堆内存

    • 设置初始堆内存为2GB。这有助于提高程序启动时的性能,但过大的初始堆可能会浪费内存。
     

    bash

    -Xms2g
  3. 年轻代内存设置

    • 年轻代内存大小可以通过 -Xmn 参数设置,建议设置为堆内存的 1/3 左右,具体可以根据应用的实际需求调整。例如,将年轻代大小设置为1GB:
     

    bash

    -Xmn1g
  4. 老年代内存设置

    • 老年代内存的大小是通过调整堆的总大小和年轻代的大小来间接控制的。通常,老年代内存占堆的剩余部分。例如,设置最大堆内存为4GB,年轻代为1GB,那么老年代将是3GB。
  5. PermGen / Metaspace 设置(JVM 8之后使用Metaspace):

    • 如果使用JVM 8及以上版本,PermGen 已被 Metaspace 取代。Metaspace 的默认大小是动态增长的,但我们可以通过以下参数调整其大小:
     

    bash

    -XX:MaxMetaspaceSize=256m -XX:MetaspaceSize=128m
  6. 垃圾回收器选择

    • 如果需要优化垃圾回收的性能,可以根据应用的需求选择不同的垃圾回收器。例如,使用 G1 GC 或 CMS 来减少停顿时间。
    • 启用 G1 GC:
     

    bash

    -XX:+UseG1GC

其他相关JVM内存配置

  • 线程栈大小:每个线程会消耗一定的内存,用于保存栈帧。可以通过 -Xss 来调整每个线程的栈大小。默认值通常为1MB,对于线程较多的应用,可以适当调低栈大小以节省内存。

     

    bash

    -Xss512k
  • GC日志输出:调优过程中,查看GC日志能帮助我们分析和优化内存使用。可以通过以下参数输出GC日志:

     

    bash

    -Xlog:gc*:file=gc.log

具体的调优案例

假设我们有一台具有8GB内存的服务器,并且应用程序需要稳定的响应时间和低延迟。我们可以使用以下JVM参数进行调优:

 

bash

java -Xms2g -Xmx4g -Xmn1g -XX:+UseG1GC -XX:MaxMetaspaceSize=256m -XX:MetaspaceSize=128m -Xss512k -Xlog:gc*:file=gc.log -jar myapp.jar

这个配置做了以下优化:

  • 设置初始堆内存为2GB,最大堆内存为4GB,年轻代为1GB,确保有足够的内存空间。
  • 使用 G1 GC 来优化垃圾回收性能,避免长时间的Stop-the-World停顿。
  • 设置 Metaspace 内存限制,避免类加载和卸载时占用过多内存。
  • 限制每个线程的栈大小为512KB,减少线程栈内存占用。

调优原则

  1. 尽量保证堆内存不超出物理内存的一半:如果堆内存过大,会导致频繁的GC,或者直接导致 OutOfMemoryError。理想的堆内存配置是物理内存的50%-75%。
  2. 考虑操作系统和其他进程的内存占用:不要将JVM的内存配置得过大,否则操作系统和其他应用会受到影响。
  3. 选择合适的垃圾回收器:对于大部分高性能应用,G1 GC 是推荐的选择,它提供了较为平衡的延迟和吞吐量。对于低延迟要求的应用,也可以考虑 ZGC 或 Shenandoah
  4. 监控和分析:定期通过 GC 日志或其他性能监控工具(如 VisualVM 或 JConsole)来观察内存的使用情况,并根据实际运行情况进行调整。

总结

在8GB内存的机器上为JVM分配内存时,建议将堆内存设置为2GB-4GB,具体的配置需要根据应用的需求进行调整。合理设置年轻代、老年代、PermGen(或Metaspace)等内存区域的大小,选择适合的垃圾回收器,并优化线程栈大小,可以有效提升Java应用的性能并减少内存问题。

分布式事务解决方案:

比如在一个方法中涉及:订单 商品 库存

mq

补偿兜底

job补偿:分别查询订单,商品,库存,根据订单号,对比哪个缺了

Eureka原理

redis事务

垃圾回收:标记清理

redis clustomer节点挂了,如何防止数据丢失

设置过期时间大于,主从同步间隔时间,缩短这个时间

redis不设置从节点

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/503404.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

「Mac畅玩鸿蒙与硬件53」UI互动应用篇30 - 打卡提醒小应用

本篇教程将实现一个打卡提醒小应用,通过用户输入时间进行提醒设置,并展示实时提醒状态,实现提醒设置和取消等功能。 关键词 打卡提醒状态管理定时任务输入校验UI交互 一、功能说明 打卡提醒小应用包含以下功能: 提醒时间输入与…

Python递归(汉诺塔问题)

递归分析 递归:通过自我调用来解决问题的函数 递归通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。 递归要注意: 1.递归出口 2.当前问题如何变成子问题 利用递归写一个阶乘函数,F(n),求n的阶乘…

VS2022 C#创建Com组件和调用

生成一个类库项目 这里创建了一个.net 4.8的项目,添加了一个ComAIFaceTest类 如下图: ComAIFaceTest代码如下: [ComVisible(true)][Guid("12345678-ABCD-1234-EF00-0123456789AB")][ClassInterface(ClassInterfaceType.AutoDual)…

【GOOD】A Survey of Deep Graph Learning under Distribution Shifts

深度图学习在分布偏移下的综述:从图的分布外泛化到自适应 Northwestern University, USA Repository Abstract 图上的分布变化——训练和使用图机器学习模型之间的数据分布差异——在现实世界中普遍存在,并且通常不可避免。这些变化可能会严重恶化模…

ARM发布Armv9.5架构:迈向更强性能与灵活性的新时代

2024年11月30日,ARM正式发布了其最新的Armv9.5架构,这是Arm技术发展的又一重要里程碑。从表中信息来看,Armv9.5架构的发布标志着该公司的架构系列在性能、灵活性和可扩展性方面取得了进一步突破。本次发布不仅是技术上的提升,更是…

RAFT:随机退火森林

RAFT:随机退火森林 RAFT(Randomized Annealed Forests)是一种机器学习算法,主要用于分类和回归任务。以下是对它的介绍及原理举例说明: 一、RAFT简介 RAFT是一种基于随机森林的集成学习方法,它结合了随机森林的优点和退火算法的思想。随机森林通过构建多个决策树并综…

“AI智慧语言训练系统:让语言学习变得更简单有趣

大家好,我是你们的老朋友,一个热衷于探讨科技与教育结合的产品经理。今天,我想和大家聊聊一个让语言学习变得不再头疼的话题——AI智慧语言训练系统。这个系统可是我们语言学习者的福音,让我们一起来揭开它的神秘面纱吧&#xff0…

自动驾驶相关知识学习笔记

一、概要 因为想知道SIL、HIL是什么仿真工具,故而浏览了自动驾驶相关的知识。 资料来源《自动驾驶——人工智能理论与实践》胡波 林青 陈强 著;出版时间:2023年3月 二、图像的分类、分割与检测任务区别 如图所示,这些更高阶的…

1/7距离放假一周加1

要求在堆区连续申请5个int的大小空间用于存储5名学生的成绩&#xff0c;分别完成空间的申请、成绩的录入、升序排序、成绩输出函数以及空间释放函数&#xff0c;并在主程序中完成测试 要求使用new和delete完成 #include <iostream> #include<algorithm> using nam…

解锁编程智慧:23种设计模式案例分享

为什么要学习设计模式&#xff1f;你可以把设计模式想象成一些做饭的菜谱。当我们需要做一道菜&#xff08;开发一个功能&#xff09;时&#xff0c;如果按照自己的想法随意添加调料&#xff08;编写代码&#xff09;&#xff0c;很可能做出的菜味道不好&#xff08;功能不稳定…

UWB实操:用信号分析仪(频谱分析仪)抓取UWB频域的图像

连接好UWB设备和信号分析仪&#xff08;频谱分析仪&#xff09;&#xff0c;让UWB设备持续发送信号。我来演示如何一步一步获得下面的图像&#xff1a; 设置频率&#xff0c;FREQ&#xff0c;Center Freq 7987.2MHz 设置X轴&#xff0c;宽度&#xff0c;SPAN 2GHz设置Y轴&…

Kali系统(Debian 10.3) 遇到的问题

目录 问题一&#xff1a;非问题 kali 基础官网与安装 问题二&#xff1a; 问题三&#xff1a; Kali系统 MySQL问题Cant connect to local MySQL server through socket /run/mysqld/mysqld.sock (2) 问题四&#xff1a;重新安装MySQL 也就是MariaDB(MariaDB 含 MySQL相关…

2025最新版Visual Studio Code安装使用指南

2025最新版Visual Studio Code安装使用指南 Installation and Usage Guide for the Latest Visual Studio Code in 2024 By JacksonML 2025-1-7 1. Visual Studio Code背景 早在二十年前&#xff0c;通用的集成开发环境&#xff08;Integrated Deveopment Environment, 简称…

opencv 学习(1)

文章目录 opencv导学部分opencv的作用ffmpeg和 opencv的关系opencv的未来 计算机视觉是什么&#xff1f; opencv导学部分 opencv的作用 1 : 目标识别 人脸识别 车辆识别 2 : 自动驾驶技术 – 计算机视觉 进行车道的检测 3 : 医学图像分析 通过分析光片 来分析人到底得了什么病…

C/C++编程安全标准GJB-8114解读——初始化类

软件测试实验室在申请CMA测试认证时&#xff0c;需要根据相应的标准确定检测方法。GJB-8114是一部嵌入式软件安全测试相关的国家标准&#xff0c;本系列文章我们针对GJB-8114《C/C语言编程安全子集》的具体内容进行解读。GJB-8114标准规则中一共有124条强制性规则&#xff0c; …

Excel 做数据分析的好与不好

日常工作中&#xff0c;涉及到数据的计算分析&#xff0c;Excel 一定是使用最多的。但是也有不少小伙伴困惑于 Excel 的深入学习难度大&#xff0c;复杂问题不好做&#xff0c;相同问题重复烦&#xff0c;大数据跑不了等问题。这里我们就来聊一聊 Excel 做数据分的好与不好&…

ollama安装及本地部署开源大模型

Ollama官网&#xff1a;https://ollama.com/&#xff0c;官方网站的介绍就一句话&#xff1a;Get up and running with large language models. &#xff08;开始使用大语言模型。&#xff09; Ollama是一个开源的 LLM&#xff08;大型语言模型&#xff09;服务工具&#xff0c…

Vue3 + Vite + Electron + Ts 项目快速创建

一、创建 Vue 项目 1. 创建项目 pnpm create vite 2. 安装依赖 cd excel-electron pnpm install 3. 运行项目 pnpm dev 二、添加 Electron 1. 安装 electron pnpm add electron -D 2. 修改 package.json 添加入口 js 和执行命令。 {"main": "dist-ele…

网页数据如何正确copy到postman中

复制后&#xff0c;粘贴到postman就可以&#xff0c;相关的token及参数都会带过去的 postman怎么copy出地址及参数&#xff0c;给git bash使用&#xff1f; 右边有个两个反向箭头&#xff0c;copy就可以&#xff0c;选项中有java等各种程序语言

《Mcal》--MCU模块

一、MCU模块的主要功能 控制系统时钟的产生。控制系统通用模块&#xff0c;该模块会涉及到Adc、Ftm等外设的配置。控制外设时钟。控制MCU运行的模式。初始化定义RAM Section。 比较重要的是时钟的配置。 二、系统时钟的配置 1、芯片时钟树 要想弄明白时钟配置&#xff0c;需…