【发布时间】:2015-11-27 21:54:56
【问题描述】:
我们正在构建一个系统,该系统将通过 JMS 将消息从一个应用程序发送到另一个应用程序(如果需要,使用 Websphere MQ)。这些消息的形式为“创建 x”或“删除 x”。 (这样做的最终结果是需要通知第三方系统 Create 和 Delete 消息,因此 JMS 队列的 Read 端将与第三方系统通信,而 JMS 的 Write 端队列只是广播消息以进行处理)
我们在这里担心的问题是如果其中一条消息失败。这里最初的想法只是将故障回滚到 JMS 队列中,并让正常的重试机制来处理它。这一直有效,直到你得到一个删除,然后是一个相同标识符的创建,例如
- 删除 123 - 失败,回滚到队列中
- 创建 123 - 成功
- 删除 123 - 从之前的失败中重试
这样做的最终结果是第三方被告知创建 123,然后立即删除 123,而不是相反。
虽然并不理想,但从我一直在阅读的内容来看,Message Affinity 似乎在这里会有所帮助,这样我们就可以保证以正确的顺序处理消息。但是,我不确定当消息被处理并失败返回队列时消息关联将如何工作? (Message Affinity 通常被认为是一个坏主意,但这里的负载不会很大,并且中毒消息的风险非常低。只是我们正在与之交互的第三方有一个简短的风险我们担心的中断)
如果做不到这一点,关于如何做到这一点,有没有更好的想法?
编辑 - 进一步复杂化。我们正在构建的与第三方集成的系统是为了替换他们直到最近才使用的来自不同供应商的系统。因此,第三方已经有大量数据,但实际上很难将其取出。 (第三方甚至不发回成功/失败消息,只是确认收到!),所以我们实际上并不知道系统的初始状态。
【问题讨论】: