论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
大数据
›
数据仓库与分析
›
RabbitMQ高级篇之MQ可靠性 数据持久化
RabbitMQ高级篇之MQ可靠性 数据持久化
王柳
金牌会员
|
2025-1-10 00:44:08
|
显示全部楼层
|
阅读模式
楼主
主题
891
|
帖子
891
|
积分
2673
消息丢失的原因分析
RabbitMQ 默认使用内存存储消息,但这种方式带来了两个主要问题:
内存不是永世存储
:内存中的数据会随着 RabbitMQ 的重启丢失。如果消息存储在内存中,一旦 MQ 宕机或重启,全部未持久化的消息都会丢失。
内存空间有限
:如果消耗者处理消息的速度较慢,而生产者发送消息的速度过快,MQ 会堆积大量的消息,导致内存占满,终极可能导致 MQ 壅闭。当内存满时,RabbitMQ 会实验将内存中的部门消息写入磁盘,但此操纵非常耗时,会导致 MQ 无法处理更多的消息,进而发生壅闭。
内存存储的缺陷
消息丢失
:因为内存不是持久化存储,当 RabbitMQ 重启时,内存中的全部数据(包括互换机、队列、消息)都将丢失。
性能下降与壅闭
:内存满时,消息必要被转移到磁盘,磁盘的写入速度慢,导致消息处理速度下降。如果消息堆积,MQ 会壅闭,不能继续接收或处理消息,严重影响系统的实时性。
怎样确保 RabbitMQ 的消息可靠性?
要确保消息不丢失而且能够持续处理,必要采取
数据持久化
的措施。数据持久化意味着将消息、队列和互换机的元数据存储在磁盘中,确保纵然 RabbitMQ 重启,消息也不会丢失。
数据持久化的三个方面
为了确保数据在 RabbitMQ 中的可靠性,必要对以下三方面进行持久化配置:
互换机持久化
:
换机在 RabbitMQ 中负责路由消息。如果互换机丢失,消息会丢失,因此互换机必须持久化。
默认情况下,RabbitMQ 创建的互换机是持久化的。可以在创建互换机时,通过设置 durable=true 来指定互换机的持久化属性。
队列持久化
:
队列存储消息。如果队列丢失,全部未处理的消息都会丢失,因此队列也必须持久化。
与互换机类似,队列的 durable 属性应该设置为 true,这样队列会在 RabbitMQ 重启后保存下来。
消息持久化
:
纵然互换机和队列是持久化的,如果消息本身没有被持久化,消息依然会丢失。
在发送消息时,通过设置 delivery mode=persistent 来将消息标记为持久化。这样,消息就会被存储到磁盘中,纵然 RabbitMQ 重启,消息也不会丢失。
持久化对性能的影响
非持久化消息
:
如果消息没有设置持久化,RabbitMQ 会把消息存储在内存中。当内存满时,它会将数据写入磁盘(称为 paged out),这会导致性能下降,因为磁盘写入操纵较慢。
这种模式下,MQ 可能会出现
壅闭
,即消息发送速率骤降,甚至克制处理消息。
持久化消息
:
如果消息是持久化的,即每发送一条消息都立即写入磁盘,不会等待内存满了才写。这种方式保证了消息不会丢失,同时避免了 paged out 导致的壅闭问题。
持久化消息的写入速度相对较慢,但性能颠簸较小,不会出现壅闭。虽然会有一些性能开销,但不会像非持久化消息那样,处理速度大幅下降。
持久化实验验证
非持久化消息发送
:
当发送大量(例如 100 万条)非持久化消息时,如果队列或内存满了,RabbitMQ 会将内存中的消息写入磁盘。在此过程中,消息处理速度会显著下降,甚至停滞,导致性能严重下降。
paged out 操纵会导致消息的处理速度一度降为零,之后才恢复。
持久化消息发送
:
当发送持久化消息时,消息不但存储在内存中,还会立即写入磁盘。因此,无论内存怎样变化,磁盘中的数据都能保持一致,不会发生消息丢失。
持久化模式下,纵然有大量消息必要处理,RabbitMQ 仍旧能够保持较高的处理速率,没有明显的性能下降或壅闭。
性能对比
非持久化模式
:发送大量消息时,随着内存满了,系统会进行 paged out,导致性能颠簸,速率降低到零,造成壅闭。
持久化模式
:每条消息都会立即持久化到磁盘,因此没有发生内存满了才写入的情况,性能保持稳固,处理速度平稳。
Spring AMQP 默认持久化
Spring AMQP 配置
:默认情况下,Spring AMQP 创建的队列和互换机都是持久化的,发送的消息也是持久化的。因此,开发者不必要做额外的配置,默认举动即可保证消息的可靠性。
总结
为了确保 RabbitMQ 的消息可靠性,应采用以下措施:
确保互换机、队列和消息都做持久化,避免数据丢失。
通过 Spring AMQP 默认配置,可以确保消息的可靠性,但必要注意消息持久化的性能开销。
持久化虽然会带来一定的性能开销,但比起非持久化模式导致的壅闭问题,持久化更有利于系统的稳固性和可靠性。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
王柳
金牌会员
这个人很懒什么都没写!
楼主热帖
Keytool配置 Tomcat的HTTPS双向认证 ...
【小程序】图解小程序平台架构及其特征 ...
校园网组网方案的设计
NSIS官方认证插件集成安装包 ...
太方便了,钉钉上就可完成代码发布审批 ...
Google Earth Engine(GEE)——Kmeans ...
机加工行业MES系统模具行业MES系统CNCl ...
【 C++ 】类和对象(下)
利用Python生成随机密码,灰常简单 ...
微信为什么使用 SQLite 保存聊天记录? ...
标签云
存储
挺好的
服务器
快速回复
返回顶部
返回列表