我们有两个RabbitMQ集群。一个用作上游,另一个用作下游。每个群集有3个节点。我们使用RabbtitMQ-Federation接收在上游集群到下游集群的订单交换上发布的消息。
自最近6个月以来,此方法运行良好。突然在10/4上,我们在上游群集上收到了群集分区错误。这是由于群集中的一个系统挂了一分钟以上。我们在系统日志中看到了有关此问题的重复信息,并暂时关闭了该系统。上游群集现在作为两个节点群集运行。当时没有注意到,但是在10/8上,我们意识到在下游节点上,自10/4以来我们没有收到任何订单消息。
在进一步调查中,我发现下游群集上的联合身份验证链接仍显示为正在运行,但是在上游群集上自动创建的“联邦”队列上累积了87000+条消息。为了检索这些消息,我从下游群集重新启动了联盟链接。但是出乎意料的是,我看到门户网站上的“联邦”队列被删除并重新创建,这87000多个消息也进入了黑暗的空间。从那时起,我们开始收到任何新邮件,但是旧邮件只是丢失了。
在部署解决方案之前,我们通过逐个关闭两个集群对此进行了一些POC。每次联盟队列都能够保留持久消息。而且无论何时两个群集都处于正确状态,下游联合链接都能够获取这些消息。因此,我们得出的结论是,只要上游节点上有“联邦”队列可用,则下游侧的“联邦链接”就应该选择消息。因此,我们从未想到过这个问题。
我们既不在联盟配置上设置x-expire和x-message-ttl参数,也不在发布消息时由应用程序设置这些参数。在联合身份验证配置中,我们仅使用“ trust-user-id”:false,URI(所有3个群集节点)和交换名称。默认为Rest all,这意味着联合队列上的“ x-expire”应设置为“从不”(这将使该队列永久存在,除非在下游删除联合链接)。我们的消息也被永久发布。
在联盟链接重新启动期间,只有上游系统上的日志具有有关此问题的相关信息。该代码段如下所述。它说队列是从“ 0”深度初始化的。
我想问以下问题-
RabbitMQ版本: -上游:RabbitMQ 3.6.1,Erlang R16B03-1 -下游:RabbitMQ 3.6.15,Erlang 20.3.4
来自上游Rabbitmq节点的日志片段。找不到其他相关日志。
++++++++++++++++++++++++++++++++++++++++++++++++ +++++++
=警告报告==== 2018年10月8日:: 14:57:38 ===
关闭AMQP连接<0.1688.0>(:51364->:5672):
客户端意外关闭了TCP连接
=信息报告==== 2018年10月8日:: 14:58:07 ===
接受AMQP连接<0.521.123>(:46659->:5672)
=信息报告==== 2018年10月8日:: 14:58:08 ===
在虚拟主机'production'中的镜像队列'federation:order.exch->':在节点'rabbit @ upstream-hostname'上添加镜像:<7719.25968.3282>
=信息报告==== 2018年10月8日:: 14:58:08 ===
虚拟主机'生产'中的镜像队列'联合:order.exch->':同步:0消息要同步
=信息报告==== 2018年10月8日:: 14:58:08 ===
虚拟主机'生产'中的镜像队列'federation:order.exch->':同步:批处理大小:4096
=信息报告==== 2018年10月8日:: 14:58:08 ===
虚拟主机'生产'中的镜像队列'联合:order.exch->':同步:所有从属已同步
=信息报告==== 2018年10月8日:: 14:58:09 ===
接受AMQP连接<0.567.123>(:46659->:5672)
++++++++++++++++++++++++++++++++++++++++++++++++ +++++
如果您需要我的更多信息来回答这些问题,请告诉我。
答案 0 :(得分:0)
感谢所有关注此查询的人。回答这个问题可能会在将来对其他人有所帮助。
我们与供应商开了一个案子。他们试图在他们的实验室中复制它,但是没有能力。目前,我们不确定导致问题的原因。为了查看何时创建队列,需要启用另一个插件事件交换并进行监听。
Rabbitmq看起来像是一款产品,非常适合较小的应用程序/微服务,但在分布式消息传递/群集方面则不那么好。同样,在过去,我们也看到由于群集问题而丢失的消息。那只是我根据到目前为止的经验得出的观点,以前我是错的。