RabbitMQ - 如何联合/镜像消息

oko*_*oko 3 message-queue rabbitmq rabbitmq-exchange

我设置了两个节点,A和B.两个节点都安装了RabbitMQ和联合插件.

在Web UI中,我可以在A和B上看到"联邦状态">"状态"正在"运行".

在A上,我创建了一个名为"test1"的队列.

在B上,我可以看到"test1"队列(从A复制).

在A上,我添加了一条消息.

但是,消息不会出现在B上的复制队列中 - 消息保留在A上.

这是我在A和B上使用的政策:

rabbitmqctl set_policy --apply-to exchanges my-queue "test1" \ '{"federation-upstream-set":"all"}'

所以,它是这样的:A(上游) - > B(下游)和B(上游) - > A(下游)

我应该看到复制到A和B的消息吗?我错误配置了方向吗?

dno*_*zay 10

但是,消息不会出现在B上的复制队列中 - 消息保留在A上.

TL; DR:联合交换!=联合队列.

参考文献:

联邦队列中的" 工作原理 "部分解释了:

"联合队列只会在本地消息用完时检索消息,消费者需要消息,而上游队列有"备用"消息没有消耗......"

而在" 什么是联合交换吗? "解释说:

"...发布到上游交换机的消息被复制到联邦交易所,好像它们是直接发布给它的......"

概括:

  • 如果你使用联邦队列,你需要B方面需要消息的消费者(拉模型?).
  • 如果您使用联合交换,则直接复制消息(推模型?).

用例

冗余/备份

联合交换复制消息(max-hops副本),以便它们可用于冗余.

例如

这是我的数据,备份它.

内容分发网络

联合交换会复制邮件(max-hops副本),以便它们可以用于跨区域分发内容(这也是冗余btw),前提是您正确配置了拓扑.

例如

大家好,请申请这个安全补丁,你可以在离你最近的经纪人那里找到.

负载均衡

联合队列可用于负载平衡:如果消息在上游可用且没有消费者可以处理它,则下游的免费消费者能够接收消息并对其进行处理.摇滚.

例如

我是电脑,我觉得无聊,我可以帮你吗?你需要我做的任何工作吗?

双重打击

联合交换+联合队列=您可以将同一组任务分发到多个区域(群集),每个群集中的一个工作人员可以执行该作业.

例如

在本季度结束时,我需要每个区域(集群)的性能指标,每个商店经理(集群中的一个节点)将聚合指标(集群内部),我们将礼品卡提供给前3名.