当系统以错误的顺序出现时不保留消息

Not persisting messages when the system comes up in the wrong order

我们正在使用 RabbitMQ 向 Apache Camel 发送消息。

我们有一个 "sender" 和一个处理由发送者发送的 RabbitMQ 消息的 Camel 路由。

我们遇到了关于系统的哪一端先出现的部署问题。

我们的系统容量不大。我一次发送大约 100 条消息。该消息的要点是减少 'temporal cohesion' 在我们的主数据库中发生的事情与将相同的事情记录到不同的数据库之间。我们不希望我们的前端不得不等待。

如果 "sender" 不存在,将创建一个交换。

此问题导致部署问题。

这是我看到的:

如果我关闭发送器,关闭 Camel,删除交换(干净的状态),启动发送器,然后启动 Camel,并发送 100 条消息,系统工作。 (我认为因为发件人必须 运行 手动进行测试,所以 Exchange 是由 Camel Route 创建的...)

如果我从头开始,发送消息,然后启动 Camel,我可以看到消息到达 RabbitMQ(使用网络工具)。没有队列被绑定。启动 Camel 后,我可以看到它绑定到 Exchange 的队列。但是这些信息已经被时间和命运遗失了;它们显然已被删除。

如果从当前状态开始,我发送了更多消息,它们会正常流动。

我认为如果丢弃的消息被保留,我会没事的。我错过了什么?

对我来说很难说到底哪里出了问题,但我会尝试提供一些建议。

您应该设置 all exchanges and queues to be durable,并且消息持久。你永远不应该删除这些实体中的任何一个(除非它们是空的并且你不再使用它们)并且可以将它们视为数据库中的 tables。这是您的各种基础设施,与数据库一样,您不希望第一个数据库客户端创建它需要的 table (这当然适用于您的用例,至少在我看来是这样的). 在评论中,我提到了队列的 流状态 ,但是对于 100 条消息,这可能永远不会发生。

关于消息传递 - 持久性与否,代理(服务器)保留它们,直到它们被消费者发回的 确认 消耗(在很多 API 中,这是完成的自动但它实际上是最重要的概念之一)。

如果发布消息的交换被删除,它们就消失了。如果服务器被终止或重新启动并且消息被保留 - 同样,它们消失了。可能还会有更多的消息被丢弃的情况(如果我想到一些我会编辑答案)。

如果您无法控制创建 (通常在 API 中声明)交换和队列,那么(除了恕我直言,这不是最好的事实)它可能会很棘手,因为声明这些实体是幂等的,即如果已存在同名的非持久队列,则无法创建持久队列 q1 。在您的情况下,这也可能是个问题,因为您提到了 系统的哪一部分首先出现 事情 - 也许双方都没有用相同的参数声明某些东西...