RabbitMQ(十一) 镜像队列

181 阅读4分钟

使用镜像的原因

如果RabbitMQ集群中只有一个Broker节点,那么该节点的失效将导致整体服务的临时性不可用,并且也可能会导致消息的丢失。可以将所有消息都设置为持久化,并且对应队列的durable属性也设置为true,但是这样仍然无法避免由于缓存导致的问题:因为消息在发送之后和被写入磁盘井执行刷盘动作之间存在一个短暂却会产生问题的时间窗。通过publisherconfirm机制能够确保客户端知道哪些消息己经存入磁盘,尽管如此,一般不希望遇到因单点故障导致的服务不可用。

引入镜像队列(Mirror Queue)的机制,可以将队列镜像到集群中的其他Broker节点之上,如果集群中的一个节点失效了,队列能自动地切换到镜像中的另一个节点上以保证服务的可用性。

搭建步骤

  1. 启动三台集群节点
  2. 随便找一个节点添加policy
  3. 在node1创建一个队列发噢是那个一条信息,队列存在镜像队列

1646904071(1).png

  1. 在node1上创建一个队列发送一条消息,队列存在镜像队列

  2. 就算整个集群只剩下一台机器了 依然能消费队列里的消息 说明队列里面的消息被镜像队列传递到相应机器里面了

实现高可用负载均衡

HAProxy.提供高可用性、负载均衡及基于TCPHTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案,包括Twitter,Reddit,StackOverflow,GitHub.在内的多家知名互联网公司在使用。HAProxy实现了一种事件驱动、单一进程模型,此模型支持非常大的井发连接数。

扩展nginx,lvs,haproxx.p间的区别: www.ha97.com/5646.html

image.png

Haproxy + Keepalive 实现高可用负载均衡 同时也能解决高并发问题

Federation Exchange (联邦交换机)

  • 使用原因

(broker北京),(broker深圳)彼此之间相距甚远,网络延迟是一个不得不面对的问题。有一个在北京的业务(Client北京)需要连接(broker北京),向其中的交换器exchangeA.发送消息,此时的网络延迟很小,(Client北京)可以迅速将消息发送至exchangeA.中,就算在开启了publisherconfirm.机制或者事务机制的情况下,也可以迅速收到确认信息。此时又有个在深圳的业务(Client深圳)需要向exchangeA发送消息,那么(Client深圳)(broker北京)之间有很大的网络延迟,(Client深圳)将发送消息至exchangeA会经历一定的延迟,尤其是在开启了publisherconfirm.机制或者事务机制的情况下,(Client深圳)会等待很长的延迟时间来接收(broker北京)的确认信息,进而必然造成这条发送线程的性能降低,甚至造成一定程度上的阻塞。

将业务(Client深圳)部署到北京的机房可以解决这个问题,但是如果(Client深圳)调用的另些服务都部署在深圳,那么又会引发新的时延问题,总不见得将所有业务全部部署在一个机房,那么容灾又何以实现?这里使用Federation插件就可以很好地解决这个问题.

  • 搭建步骤
  1. 需要保证每台节点单独运行
  2. 在每台机器上开启federation相关插件
# 每台节点均需执行以下命令
rabbitmq-plugins enable rabbitmq_federation
rabbitmq-plugns enable rabbitmq_federation_management

  1. 原理图

1646905430(1).png

  1. 在下游节点(node2)配置上游节点(node1)

1646905758(1).png

  1. 添加policy

image.png

  1. 成功

1646905904(1).png

Federation Queue

使用原因

联邦队列可以在多个Broker节点(或者集群)之间为单个队列提供均衡负载的功能。一个联邦队列可以连接一个或者多个上游队列(upstream queue),并从这些上游队列中获取消息以满足本地消费者消费消息的需求。

1646905982(1).png

  1. 添加上下游配置(同10.4)
  2. 添加policy

image.png

Shovel

使用原因

Federation具备的数据转发功能类似,Shovel够可靠、持续地从一个Broker中的队列(作为源端,即source)拉取数据并转发至另一个Broker中的交换器(作为目的端,即destination)。作为源端的队列和作为目的端的交换器可以同时位于同一个Broker,也可以位于不同的Broker上。Shovel可以翻译为"铲子",是一种比较形象的比喻,这个"铲子"可以将消息从一方"铲子"另一方。Shovel行为就像优秀的客户端应用程序能够负责连接源和目的地、负责消息的读写及负责连接失败问题的处理。

image.png

搭建步骤

  • 开启插件(需要的机器都开启)
rabbitmq-plugins enable rabbitmq_shovel
rabbitmq-plugins enable rabbitmq_shovel_management

  • 添加shevel源和目的地

image.png