我们正在使用RabbitMQ向Apache Camel发送消息。
我们有一个“发件人”和一个处理发件人发送的RabbitMQ邮件的Camel路由。
我们遇到有关系统首先出现的部署问题。
我们的系统数量很少。我一次发送大约100条消息。消息的要点是减少主数据库中发生的事件与将其记录到不同数据库之间的“时间内聚”。我们不希望我们的前端必须等待。
如果不存在,“发件人”将创建一个交换。
问题是导致部署问题。
这就是我所看到的:
如果我关闭发件人,关闭Camel,删除交换机(清理平板),启动发件人,然后启动Camel,并发送100条消息,系统正常工作。 (我认为因为发件人必须手动运行才能进行测试,所以Exchange正由Camel Route创建...)
如果我清理平板,然后发送消息,然后再发送Camel,我可以看到消息落在RabbitMQ中(使用Web工具)。没有队列绑定。一旦我启动Camel,我就能看到它的绑定队列连接到Exchange。但这些信息已经失去了时间和命运;他们显然已经被放弃了。
如果从当前状态发送更多消息,它们会正常流动。
我认为如果丢弃的消息仍然存在,我会没事的。我错过了什么?
答案 0 :(得分:1)
对我而言,很难说究竟出了什么问题,但我会尝试提供一些指示。
您应该设置all exchanges and queues to be durable,并且邮件是持久的。您永远不应删除任何这些实体(除非它们是空的并且您不再使用它们),并且可能将它们视为数据库中的表。这是你的各种基础设施,和数据库一样,你不希望第一个DB客户端创建它需要的表(这当然适用于你的用例,至少对我来说是这样)。 在评论中我提到了队列的流状态,但是有100条消息,这可能永远不会发生。
关于消息传递 - 持久性与非持续性,代理(服务器)保留它们,直到它们被消费者发回的确认消费(在批次的API中,这是自动完成的,但它实际上是一个最重要的概念)。
如果删除了发布消息的交换,它们就会消失。如果服务器被杀死或重新启动并且消息仍然存在 - 再次,它们就消失了。可能还有一些消息被删除的场景(如果我想到一些我会编辑答案)。
如果您无法控制创建(通常在API中声明)交换和队列,那么(除了事实上它不是恕我直言的最好的事情)因为声明它可能会很棘手这些实体是幂等的,即如果已经存在具有相同名称的非持久队列,则无法创建持久队列q1。在您的情况下,这也可能是一个问题,因为您提到系统的哪个部分首先出现事情 - 可能两边都没有声明具有相同参数的内容......