问题发生后重新启动联盟链接时,RabbitMQ联盟队列会自动删除

时间:2018-10-16 17:22:11

标签: rabbitmq erlang integration messaging federation

我们有两个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”深度初始化的。

我想问以下问题-

  1. 我们对联邦的理解是否正确(在上述内容中)? 我们没有办法重现该问题。但是有人知道它的原因或我们最后缺少任何设置吗?
  2. 在下游重新启动每个“联邦链接”时,是否总是在上游重新创建“联邦”队列?
  3. 是否有命令查看队列和交换之类的对象的创建时间戳记?
  4. 我们可以遵循哪些最佳实践或技术来确保不删除联盟队列?

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)

++++++++++++++++++++++++++++++++++++++++++++++++ +++++

如果您需要我的更多信息来回答这些问题,请告诉我。

1 个答案:

答案 0 :(得分:0)

感谢所有关注此查询的人。回答这个问题可能会在将来对其他人有所帮助。

我们与供应商开了一个案子。他们试图在他们的实验室中复制它,但是没有能力。目前,我们不确定导致问题的原因。为了查看何时创建队列,需要启用另一个插件事件交换并进行监听。

Rabbitmq看起来像是一款产品,非常适合较小的应用程序/微服务,但在分布式消息传递/群集方面则不那么好。同样,在过去,我们也看到由于群集问题而丢失的消息。那只是我根据到目前为止的经验得出的观点,以前我是错的。