中间件1.3.3-RabbitMQ持久化机制、内存/磁盘控制
Rabbitmq的持久化分为队列持久化、消息持久化和交换器持久化。不管是持久化的消息还是非持久化的消息都可以被写入到磁盘。
持久化的消息放在内存/磁盘里
非持久化的消息先放在内存,内存不够时放磁盘
RabbitMQ队列持久化
队列的持久化是在定义队列时的 durable参数来实现的, durable为true时,队列才会持久化。
持久化的队列在管理界面可以看到有个“D”的标识
RabbitMQ消息持久化
消息持久化通过消息的属性 deliverymode来设置是否持久化,在发送消息时通过basicpublishl的参数传入。
RabbitMQ交换器持久化
同队列一样,交换器也需要在定义时设置持久化标识,否则在 Broker重启后将丢失
Rabbitmq内存控制
当出现内存告警时,可以通过管理命令临时调整内存大小
rabbitmqctl set_vm_memory_high_ watermark
fraction为内存阈值, Rabbitmq默认值为0.4,表示当 Rabbitmq使用的内存超过40%时,就会产生告警并阻塞所有生产者连接。
通过此命令修改的阈值在 Broker重启后将会失效,通过修改配置文件的方式设置的阈值则不会在重启后消失,但需要重启 Brokerオ会生效。
当配置文件地址: /etc/rabbitmq/rabbitmq.conf
vm_memory_high_watermark.relative = 0.4
# vm_memory_high_watermark.absolute = 1GB
Rabbitmq提供 relative或 absolute两种配置方式
relative相对值,即前面的fraction,建议取值在0.4~0.66之间,不建议超过0.7
absolute绝对值,单位为KB、MB、GB,对应的命令是
abbitmactl set_vm_memory_high_watermark absolute
Rabbitmq内存换页
在某个Broker节点触及内存并阻塞生产者之前,它会尝试将队列中的消息换页到磁盘以释放内存空间。持久化和非持久化的消息都会被转储到磁盘中,其中持久化的消息本身就在磁盘中有一份副本,这里会将持久化的消息从内存中清除掉。
默认情况下,在内存到达内存阈值的50%时会进行换页动作。也就是说,在默认的内存阈值为0.4的情况下,当内存超过0.4x0.5=0.2时会进行换页动作。
可以通过在配置文件中配置vm_memory_high_watermark_paging_ratio项来修改此值
vm_memory_high_watermark_relative=0.4
vm_memory_high_watermark_paging_ratio=0.75
以上配置将会在 Rabbitmq内存使用率达到30%时进行换页动作,并在40%时阻塞生产者。
当vm_memory_high_watermark_paging_ratioe的值大于1时,相当于禁用了换页功能。
Rabbitmq磁盘告警
当磁盘剩余空间低于确定的阈值时, Rabbitmq同样会阻塞生产者,这样可以避免因非持久化的消息持续换页而耗尽磁盘空间导致服务崩溃。
默认情况下,磁盘阈值为50MB,表示当磁盘剩余空间低于50MB时会阻塞生产者并停止内存中消息的换页动作。这个阈值的设置可以减小,但不能完全消除因磁盘耗尽而导致崩溃的可能性。比如在两次磁盘空间检測期间内,磁盘空间从大于50MB被耗尽到0MB。
一个相对谨慎的做法是将磁盘阈值设置为与操作系统所显示的内存大小一致。
RabbitMQ磁盘限制
通过命令可以临时调整磁盘阈值
rabbitmgctl set__diskfree_limit
rabbitmqctl_set_disk_free_limit_mem_relative
disk_ limit为固定大小,单位为KB、MB、GB
fraction为相对比值,建议的取值为1.0~2.0之间
对应的配置如下:
disk_free_limit.relative = 2.0
# disk_free_limit.absolute = 50mb
- 上一篇: 中间件1.3.1-RabbitMQ入门及内部消息分发机制
- 下一篇:
每日一句
博客分组
标签云
- 最近综合
- 情绪巨婴是什么 12.18
- 普通蛋糕做法 05.31
- 玉米烤肠芝士面包做法 05.31
- Mysql安装教程 - 绿色版 06.18
- 我们学习知识为什么总是忘记呢?【学习金字塔】 05.12
- Typora开发版⽆法使⽤解决⽅法 05.04
- 为什么无知者越自信? -- 达克效应 05.10
- 马斯洛需求层次理论 04.29
- 随机综合
- Mysql安装教程 - 绿色版 06.18
- Java学习总结(2.1.3) NIO非阻塞网络编程三大核心理念 04.17
- 鸿蒙HarmonyOS DevEco Studio的安装教程 和 第一个项目 04.15
- Java学习总结(2.2.1) Netty线程模型 04.20
- Java学习总结(2.1.1) TCP/UDP协议 04.17
- android TextView标签字体加粗的几种方法 04.08
- 中间件1.2.4-ActiveMQ持久化原理和事务机制 04.29
- Java学习总结(1.1.6) 线程封闭 03.19