gpt4 book ai didi

java - 如何保证JMS的可靠传递

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:09:24 25 4
gpt4 key购买 nike

我认为很多(在我的例子中是 Spring)使用 JMS 的应用程序可能会遵循此工作流:

Database A ===> Producer ===> JMS Queue ===> Consumer ===> Database B

那么可靠性就是一个问题。假设当 Database A 中的数据记录应始终标记为 delivered 时,当包含数据记录的消息真正被消费并将数据保存在 Database 中时B。然后就是问题了:

  1. 据我所知,目前 JMS 协议(protocol)没有定义任何函数将确认从 consumer 发送到 producer,而只定义到 MOM,因此实际的 consumer-to-producer 确认方法因 JMS 提供者而异。那么是否意味着没有办法开发出一种普遍适用于所有 JMS 产品(ActiveMQ、WebSphere MQ 和 Jboss MQ)的确认机制?

  2. 考虑停电的情况,那么它是否会使队列中的消息消失,因此需要重新发送?或者不同的 JMS 产品可以拾取剩下的东西,因为消息是序列化的,所以丢失的消息只能由事务管理或异步/同步配置引起,而不是因为应用程序服务器关闭?

最佳答案

JMS 本质上保证消息的传递,如果消息被发布,那么它会被传递给消费者,如果有的话,无论发生什么,MOM 旨在确保这一事实。无论如何,交付并不一定意味着处理。

可靠性由各种机制保证:

  • 第一个是消息在队列中的持久化(队列和消息必须被标记为持久化,这是默认值),确保在系统中断的情况下消息不会丢失。
  • 然后你有确认和重试策略,消息将保留在队列中,直到消费者确认它,并且在交易 session 的情况下,将被重新传递,直到消费者有效地处理消息或达到最大重试。然后可以将失败的消息重定向到死信队列进行分析。

要确保两个数据源之间的一致性,您至少必须在生产者端使用 XA 事务(事务数据库 A 和 JMS 队列中隐含了至少 2 个资源)以保证消息不会被如果数据库 A 中的提交失败,则发布到队列;如果发布到队列失败,则不会更新数据库。消息消费也应该被处理以确保在回滚的情况下重新传递。

事务边界永远不会同时包括消费者和生产者,因为它与消息系统的异步性质冲突,你不能在消费者处理消息之前锁定生产者端的资源,因为你无法保证什么时候发生。

注意:如果您的数据库不支持 XA(或为了提高性能)并且事务中只有 2 个隐含资源(数据库和 JMS 队列),您可以查看 Logging Last Resource Transaction Optimization

关于java - 如何保证JMS的可靠传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26640218/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com