【问题标题】:How does IBM MQ's guaranteed delivery workIBM MQ 的保证交付如何运作
【发布时间】:2021-06-07 14:42:46
【问题描述】:

假设 2 个银行系统(假设它们是 A 和 B)使用 IBM MQ 通过发送消息来相互通信,假设一个场景是 RecordA 在 A 处,RecordB 在 B 处。当在 RecordA 需要的地方发起事务时当且仅 RecordB 更新时更新。 MQ 是如何实现的?

例如,一笔资金转账,从 A 的 AccountA 中扣除 100 美元,并在 B 的 AccountB 中增加 100 美元,

一种可能性是: A 首先启动事务并向 B 发送消息,一旦 MQ 保证消息的传递,它就会执行扣除,此时 B 也将执行加法。如果 MQ 未能保证消息的传递而实际上它可能已经传递了怎么办?在这种情况下,A 会怎么做? (其中一种情况是消息被传递,但由于通信介质故障,确认在传输过程中丢失,当然我们可以确认确认,但同样的问题再次出现)

我无法想象 IBM MQ 正在使用的那个问题的解决方案。我错过了什么?该问题是否存在解决方案?

【问题讨论】:

  • IBM MQ 提供有保证的交付,但没有将其称为有保证的交付。这仅适用于持久消息。持久消息在每个跃点写入磁盘,并在 MQ 服务器之间进行确认。

标签: transactions ibm-mq messaging soa banking


【解决方案1】:

MQ 并没有真正使用确认,而是使用事务。 为了缓解您描述的问题,您需要在 B 上执行以下操作:

  1. 在同步点下获取消息
  2. 进程转移
  3. 提交消息
  4. 在您的系统上提交传输

这样,如果 MQ 在您提交获取消息之前失败,您可以回滚本地处理。 (同样的方式,如果你的本地处理失败,可以回滚获取消息。)并且在 MQ 恢复后,你可以尝试再次处理消息(前提是它是持久消息)。

当然,A 需要以类似的方式发送传输,因此您的本地更改始终与放置/获取消息保持一致。当消息在 MQ 上时,MQ 保证只发送一次。

为了进一步改进事务处理,MQ 还支持 XA 协调事务。因此,您可以在 QM 和您的应用程序之间启动协调事务,确保同时提交或回滚用于放置/获取消息和更改 DB 的事务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    相关资源
    最近更新 更多