关于消息队列的一些事~
一、如果有一百万消息积压在MQ中,应该如何解决?
首先先分析一下为什么会有这么多消息积压,原因只有一个消费者处理消息的速度远小于生产者生产消息的速度。那解决这个问题的角度就可以有两个,一个是降低生产者生产消息的速度,另一个是消费者处理消息。
如果要降低生产消息的速度的话,可以使用一些限流算法,比如说漏桶算法和令牌桶算法(这两种算法的介绍会在下面解释)。
如果要提高消费者处理消息的能力的话,可以增加消费者的个数,还可以使用多线程处理消息。
还有一种方法就是使用惰性队列来缓解内存存储压力,可以将需要处理的消息存储至磁盘中(防止消息丢失、降低内存压力),这样的话内存就不需要保留很多消息。
二、RabbitMq的高可用集群包括哪些?
目前我知道的有两种集群,第一种集群甚至算不上可用集群。。。
1.普通集群,在RabbitMq集群中呢,每一个节点上都会有消息队列和相应的元数据信息,然后每一个节点上还会存在其他节点的元数据信息(比如说交换机、相关路由绑定信息、队列名称、消息总数等一些无关紧要的信息),消息的内容是不会存储在其他节点上的。因此呢集群中的一个节点gg了,那基本的消息存储服务也会gg。
2.镜像集群,这种集群呢是解决了普通集群的缺点。可以通过配置文件中镜像数量,会随机选择n个节点来存储我们节点上的消息内容。比如说一个集群中有5个节点,然后镜像数量为2,那么每个节点除了存储自己的消息之外,还会随机选择两个节点的消息进行存储。