消息队列高可用

2020-08-04 21:24:36 浏览数 (1)

常见的消息队列有ActiveMQ,RabbitMQ,RocketMQ,kafka,前两个属于集群模式部署来提供高可用,后两个可以部署分布式模式提供HA。

集群模式MQ

集群MQ.png集群MQ.png

集群模式下的MQ就是单纯的在每台机器上启动一个MQ,例如RabbitMQ,就是每个机器上启动一个RabbitMQ,只有一台机器上是既有元数据又有实际数据,其他节点上只有元数据。系统可以访问任何节点来拉取数据,如果访问的节点没有实际数据,该节点会先去有实际数据的节点上拉取数据,提高了整个系统的吞吐率。

缺点:1.可能在RabbitMQ集群内部产生大量的数据传输。2.可用性难以保障,如果queue所在的主机挂掉,那么queue数据就会丢失。

镜像集群MQ

镜像MQ.png镜像MQ.png

镜像集群就是在写MQ的时候给一定数据量的主机写数据或者给所有主机写数据,那么所有的主机都拥有queue的备份,在取数据的时候可以从任何节点进行取数据,即使一个节点挂掉,其他节点任然有备份数据。

缺点:1.性能开销太大,每一个节点包含数据,同写时给所有结点写数据,网络带宽消耗严重。2.没有扩展性,如果某一个queue负载很重,新增的机器也包含了这个queue的所有数据,并没有办法线性扩展你的queue。

分布式MQ

kafka.pngkafka.png

分布式MQ我们以kafka为例,生产者产生数据会被写入到不同的机器,这和镜像模式的RabbitMQ 不同的是RabbitMQ将所有数据写入所有的集群。

kafka的高可用,对写入的机器进行备份,在一个相同副本的主机中分为leader和follower,保证集群的高可用。

如何保证消费系统的幂等性?

MQ都可能出现重复消费的问题,就一个数据,或者一个请求,给你重复来多次,你得确保对应的数据是不会改变的,不能出错。

保证幂等性:

  1. 数据要写库,你先根据主键查一下,如果这数据都有了,你就别插入了,update一下
  2. 写redis,那没问题了,反正每次都是set,天然幂等性
  3. 创建内存set或者redis,每次插入前先去内存set中查一下,需要让生产者发送每条数据的时候,里面加一个全局唯一的id。

0 人点赞