美文网首页
RabbitMQ 节点消息广播&Ack

RabbitMQ 节点消息广播&Ack

作者: Alen_ab56 | 来源:发表于2021-11-12 14:30 被阅读0次

镜像队列的配置通过添加policy完成,policy添加的命令为:
rabbitmqctl set_policy [-p Vhost] Name Pattern Definition [Priority]
更简单的方式是开启management插件后在后台手动操作

通常队列由两部分组成:一部分是amqqueue_process,负责协议相关的消息处理,即接收 生产者发布的消息、向消费者投递消息、处理消息confirm、acknowledge等等;另一部分 是backing_queue,它提供了相关的接口供amqqueue_process调用,完成消息的存储以及 可能的持久化工作等。

镜像队列同样由这两部分组成,amqqueue_process仍旧进行协议相关的消息处理,backin g_queue则是由master节点和slave节点组成的一个特殊的backing_queue。master节点和s lave节点都由一组进程组成,一个负责消息广播的gm,一个负责对gm收到的广播消息进行 回调处理。在master节点上回调处理是coordinator(协调员),在slave节点上则是mirror _queue_slave。mirror_queue_slave中包含了普通的backing_queue进行消息的存储,mas ter节点中backing_queue包含在mirror_queue_master中由amqqueue_process进行调用。

当master即第一个GM挂掉后,slave监听到之后选举最早加入的slave当选master.
这是由于消息广播的机制所决定的,最早加入的slave的消息一定是最全的.
——————
节点之前进行数据同步的进程叫做GM : Guaranteed Multicast
rabbitmq中将所有的节点形成一个循环链表,每个节点都会监控位于自己左右两边的节点,当有节点新增时,相邻的节点保证当前广播的消息会复制到新的节点上; 当有节点失效时,相邻的节点会接管保证本次广播的消息会复制到所有节点。
在master节点和slave节点上的这些gm形成一个group,group的信息会记录在mnesia中。 不同的镜像队列形成不同的group。
消息发送
消息从master节点对应的gm发出后,顺着链表依次传送到所有节点,由于所有节点组成一 个循环链表,master节点对应的gm最终会收到自己发送的消息,这个时候master节点就知 道消息已经复制到所有slave节点了。
消息ACK
同样的ack消息会顺着 节点链表经过所有的slave节点,其作用是通知slave节点可以清除缓存的消息,当ack消 息回到master节点时对应广播消息的生命周期结束。

添加节点
master发布的消息是依次经过所有slave节点,在这期间的任何时刻,有可能有节点失效 ,那么相邻的节点可能需要重新发送给新的节点。例如,A->B->C->D->A形成的循环链表 ,A为master节点,广播消息发送给节点B,B再发送给C,如果节点C收到B发送的消息还未 发送给D时异常结束了,那么节点B感知后节点C失效后需要重新将消息发送给D。同样,如 果B节点将消息发送给C后,B,C节点中新增了E节点,那么B节点需要再将消息发送给新增 的E节点。

节点的失效
当slave节点失效时,仅仅是相邻节点感知,然后重新调整邻居节点信息、更新rabbit_qu eue、gm_group的记录等。如果是master节点失效,"资格最老"的slave节点被提升为mast er节点,slave节点会创建出新的coordinator,并告知gm修改回调处理为coordinator, 原来的mirror_queue_slave充当amqqueue_process处理生产者发布的消息,向消费者投递 消息等,来完成角色处理逻辑的变化.

相关文章

网友评论

      本文标题:RabbitMQ 节点消息广播&Ack

      本文链接:https://www.haomeiwen.com/subject/awqozltx.html