rabbitmq---顺序消息几点思考

rabbitMq要想实现顺序消息,哪就要保证一个任务队列只有一个消费者,曾经这句话给我带来了不少困惑?

  1. 顺序消费,只有一个队列,一个消费者,这样吞吐量就会下降,怎么优化?

多数业务场景下,可以做局部顺序,创建多个队列,同一业务id的消息发送到同一个消息队列,这样队列数增加,消费者数量也会增加 了

  1. 生产者消息入队乱序怎么办?

乱序举例: 如正常生产者消息入队后顺序应该为 m3 m2 m1, 但由于生产者端乱序,队列里的顺序是 m3 m1 m2; 其实这个问题已经有点偏离顺序消息这个问题了,这是业务顺序的处理范畴;但是我们仍然可以用一些方法处理掉
方案一:
a. 首先生产者要保证消息发送,要保证3个消息都在队列里;
b. 当消费者根据业务检测到消息乱序时,如先收到m2哪就将m2重新入队,消息顺序变为: m2 m3 m1; 接下来消费m1, 消费到m3 时又发现乱序, 将m3重新入队,消息顺序变为m3 m2, 其中m1 已经被消费了,那么就可以保证最终被消费的顺序为m1 m2 m3 和业务想要达到的效果是一致的
方案二:
消费者检测到消息业务乱序时,通过延迟队列来解决:将消息设置超时时间,先放到超时队列; 超时后放到死信队列中。 通过延迟队列,对消息进行业务层的排序

  1. 现在应用都是集群部署,想要整个集群只有一个消费者,怎么实现?

可以通过分布式锁来实现, 保证只有获取到分布式锁(可以zookeeper 或redis实现)的应用实例,才可以创建消费者

  1. 集群中只有一个消费者,怎么保证高可用呢

方向应该很明确,就是监控消费者应用实例
a. 可以通过运维的监控手段,监控每台机器实例,及时发现 ,重启呗
b. 或者集群中的其他应用实例,定时去获取上一步的锁,当消费者实例挂了的时候锁也应该释放,集群中的其他实例去创建消费者,就实现了消费者高可用

  1. 为了顺序消息,我们做了多个队列,哪就会对应多个消费者,怎么实现消费者负载均衡呢

思路:
要做负载均衡,就要知道集群有多少个应用实例,本应用实例中启动了多少消费者; 假如集群有3个应用实例,15个队列15个消费者; 哪正常应该每个实例5个消费者,但兼顾高可用,每个实例允许的消费者数量应该大于5。。。。。。兼顾高可用和负载还要做更多的考虑

这是我对顺序消息的思考,如果有不对的,或者大家有什么好的想法,欢迎下方评论交流

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章