常见的消息队列有ActiveMQ,RabbitMQ,RocketMQ,kafka,前两个属于集群模式部署来提供高可用,后两个可以部署分布式模式提供HA。
集群模式下的MQ就是单纯的在每台机器上启动一个MQ,例如RabbitMQ,就是每个机器上启动一个RabbitMQ,只有一台机器上是既有元数据又有实际数据,其他节点上只有元数据。系统可以访问任何节点来拉取数据,如果访问的节点没有实际数据,该节点会先去有实际数据的节点上拉取数据,提高了整个系统的吞吐率。
缺点:1.可能在RabbitMQ集群内部产生大量的数据传输。2.可用性难以保障,如果queue所在的主机挂掉,那么queue数据就会丢失。
镜像集群就是在写MQ的时候给一定数据量的主机写数据或者给所有主机写数据,那么所有的主机都拥有queue的备份,在取数据的时候可以从任何节点进行取数据,即使一个节点挂掉,其他节点任然有备份数据。
缺点:1.性能开销太大,每一个节点包含数据,同写时给所有结点写数据,网络带宽消耗严重。2.没有扩展性,如果某一个queue负载很重,新增的机器也包含了这个queue的所有数据,并没有办法线性扩展你的queue。
分布式MQ我们以kafka为例,生产者产生数据会被写入到不同的机器,这和镜像模式的RabbitMQ 不同的是RabbitMQ将所有数据写入所有的集群。
kafka的高可用,对写入的机器进行备份,在一个相同副本的主机中分为leader和follower,保证集群的高可用。
MQ都可能出现重复消费的问题,就一个数据,或者一个请求,给你重复来多次,你得确保对应的数据是不会改变的,不能出错。
保证幂等性: