【Rabbitmq学习笔记#12】镜像队列和保留消息

2018年1月14日 0 条评论 775 次阅读 0 人点赞

镜像队列:双活冗余,镜像队列的主拷贝仅存在于一个节点(主队列,master)上,镜像队列在集群中的其他节点上拥有从队列(slave)拷贝。

1、声明和使用镜像队列

(1)声明队列时传入一个额外的x-ha-policy参数

example:

x-ha-policy: all==>队列被镜像到所有节点,当添加新节点的时候,该新增节点会自动托管一份队列的从拷贝队列的镜像性质是由应用程序在运行时指定的,因此为了使队列镜像到集群中节点的子集中,需要在程序中指明确切的节点名称,替代all,即需要硬编码。硬编码可能会导致声明失败,如果在声明的时候集群中的节点发生故障,或者从集群中移除一个节点。

2、镜像队列工作原理

在镜像队列中信道除了将消息按照路由绑定的规则投递到合适的队列之外,也要将消息投递到镜像队列的从拷贝。在某种程度上镜像队列可以被当作一个隐藏的fanout交换器

如果消息路由到从拷贝前,镜像队列的主拷贝发生故障,那么发送发确认消息永远不会到达,于是消息可能会丢失。

队列失去一个从节点,附加在镜像队列的任何消费者都不会注意到这一点。===>技术上,从节点的镜像队列是附加在队列主拷贝上的。

队列主拷贝节点发生故障,所有该队列的消费者需要重新附加并监听新的队列主拷贝。

  • 对于连接到故障节点的消费者,重新附加到集群中一个新的节点,并在此时自动选取新的队列主拷贝。
  • 对于附加到镜像队列且节点运行正常的消费者,RabbitMQ会给它们发送一个消费者取消通知,告知它们不再附加在队列主拷贝了。
    • 如果AMQP客户端支持消费者取消通知,客户端会抛出一个异常,应用程序就会知道已经不再附加到队列上了,需要重新附加。
    • 否则,客户端无法通知应用程序其指向队列主拷贝的消费循环已不复存在,因此应用程序将会处于等待状态,以为队列中消息可以消费。

如果客户端不能支持消费者取消通知,则应该避免使用镜像队列。

需要注意:

已经消费却未被确认的消息。当镜像队列的主节点失败时,Rabbit不得不对以投递到消费者但未得到确认的消息做个决定。虽然消息确实已经投递给了消费者,但是Rabbit却不能区分故障转移中丢失的确认消息和那些尚未得到确认的消息。所以未了安全起见,已经消费但尚未被确认的消费会重新入队到它们原来的队列位置(2.7.0之前,在队列的末尾)

realks

这个人太懒什么东西都没留下

文章评论(0)