如何顺序消息?
全局有序,只能配置一个MQ.局部有序的话,设置顺序消息监听就可以了.若是想要根据如订单生命周期有序消费,让他们路由到同一个MQ就行了.自定义MessageQueueSelector,配置MQ路由规则.
如何定时消息?
MQ不支持定时,但支持很多种延时定时,MQ为每个延时单独线程处理,处理步骤是定时消息属性存储了消息的原生ID和Topic,然后定时消息恢复成原生消息,然后丢到CommitLog存储.
如何解决重复消费?
分析源码本来以为会根据MSG生成唯一ID,结果这个ID与MSG没得关系.也就是MQ上端没做重复消费的问题.
-
我们可以在MSG存储一个与MSG绑定的ID,然后这个唯一的ID存储Redis或者DB都可以,当消费者拿到消息后,去存储引擎获取这个ID,查看状态是否重复消费即可.
-
上面的解决办法,需要生产者端,还有一种就是直接丢给消费端处理,消费端直接获取消息唯一ID,去数据库查,若有则说明已经处理了.
-
MQ支持查询.性能不高,不推荐.
先存唯一ID到key中,然后根据key查找
-
修改RocketMQ源码就行了.比较复杂,还要考虑持久化的问题.不说了.
如何HA?
当broker主服务器内存存的差不多了,则建议从从服务器拉取消息
默认从主服务器获取消息,若主服务器建议从从服务器获取消息,才会从从服务器获取消息,这里需要注意的是始终是从brokerID=1从服务器读取数据,也就是说部署多台从也没啥用.
MQ刷入磁盘过程?
MQ若开启了堆内存,会首先将消息写入堆,然后刷入FileChannel.若没开启则采用MMAP方式刷入磁盘.