【问题标题】:Avoid camel from sending messages to queue when RabbitMQ is down避免在 RabbitMQ 宕机时骆驼向队列发送消息
【发布时间】:2020-07-07 08:04:08
【问题描述】:

我对 RabbitMQ 和 Apache-Camel 还很陌生。 消息从接口(IMAP 等)中提取并发送到队列以进行进一步处理。 我正在努力寻找一种解决方案,以避免在 RabbitMQ 关闭的情况下消息丢失。 避免消息通过骆驼路由发送到队列的最佳解决方案是什么?

我使用带有骆驼版本 2.25.1 的 Spring DSL。

提前致谢。

【问题讨论】:

    标签: java rabbitmq apache-camel spring-rabbit spring-camel


    【解决方案1】:

    此类集成场景中的问题是:当目标关闭时,您可以将消息保存在哪里,直到目标再次启动?

    因为您通常无法保存数据,所以您别无选择,只能“将其推回源头”。

    这通常通过来源的交易消费来完成。您在事务中使用来自源的消息。当您可以处理消息并将其传递到目标时,您将在源事务上提交消息。从此时起,目标对消息负责

    如果您无法处理消息或目标已关闭,则您回滚事务以便源继续对消息负责

    像这样您的集成永远不会对数据负责。消息要么留在源上,要么到达目标。

    所以,回到您的问题,您无需避免向不可用的代理发送消息(您怎么能提前知道它已关闭?),但如果发送失败(无论出于何种原因) ,您应该确保消息未在源系统上删除/提交

    下一步是处理重试方案,以避免在代理关闭时一遍又一遍地使用相同的消息。但这是一个全新的整合篇章。

    在解释了基本原理之后,我必须补充一点,在消息传递系统中,代理是系统的核心,因此应该具有高可用性(集群、代理网络等)。所以考虑 broker-down-scenario 是很好的,但这应该是一个非常罕见的边缘情况。

    【讨论】:

    • 我同意。决定代理应该是高可用的并且也是集群的(在某种程度上)。在灾难情况下,代理总是有可能不可用,但即便如此,其他组件也不应该正常工作。我们现在认为这是目前可接受的风险。谢谢你的遮阳篷。
    【解决方案2】:

    您可以在文件中写入失败的消息。并且可以有另一条路线从文件中读取并发送到队列。您应该能够按需启动(在确保您的 jms 代理已启动并运行之后)

    【讨论】:

    • 好答案。我们已经实现了这一点。我们有多个服务运行带有骆驼路线的 Spring Boot 应用程序。其中一项服务是备份服务,它将消息与元数据一起备份到文件中。但在消息到达该服务之前,它已经通过 rabbitmq 中的一个或多个队列。
    猜你喜欢
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    相关资源
    最近更新 更多