Rocketmq 相传都是亿级消息吞吐能力,但是配置不对,使用不当会导致Rocketmq的性能大大折扣
刷盘策略
首先在看问题之前我们看看Rocketmq的刷盘策略,RocketMQ 的所有消息都是持久化的,先写入系统 PAGECACHE,然后刷盘。
总共有两种刷盘策略 异步刷盘和同步刷盘
异步刷盘
异步从表面意思我们也能看出来,我们消息首先存入内存,有异步线程来完成消息的持久化。
同步刷盘
同步刷盘与异步刷盘的唯一区别是异步刷盘写完 PAGECACHE 直接返回,而同步刷盘需要等待刷盘完成才返回, 同步刷盘流程如下:
(1). 写入 PAGECACHE 后,线程等待,通知刷盘线程刷盘。 (2). 刷盘线程刷盘后,唤醒前端等待线程,可能是一批线程。 (3). 前端等待线程向用户返回成功。
综上我们可以看出来异步刷盘的性能要远远大于同步刷盘
因为我们是物联网使用场景,允许小概率的事件丢失,所以我们选择的是异步刷盘策略,虽然是异步刷盘,但是如果不优化配置还是会出现以下常见错误
-
[REJECTREQUEST]system busy, start flow control for a while
-
broker busy, start flow control for a while
如何优化呢
1、开启异步刷盘,这个要根据业务需求来,金融系统就不建议了。
2、一定要开启内存池化空间管理 ,效果非常明显
transientStorePoolEnable=true
transientStorePoolSize=5 (一个代表1G,根据机器内存决定)