如何使用单向消息交换模式维护从 VM 到 JMS 的 mule 流中正在处理的消息顺序?

How to maintain order of messages being processed in a mule flow from VM to JMS using one-way message exchange pattern?

我正在将 mulesoft ESB 与 Anypoint studio 一起用于一个项目。在我的一个流程中,我使用单向消息交换模式从 VM(持久性文件存储 VM 连接器)分派到 JMS,同时启用了 xa 事务以避免丢失消息。

考虑这样一个场景:每次用户更新 his/her 姓氏到 ESB 时我们都会发送一条消息。例如,假设用户将姓氏更改为 'A',但很快更改为 'B',因此最终结果预计为 'B'.

1) 就我而言,消息 'B' 是否可能在消息 'A' 之前得到处理?因此姓氏被设置为 'A' 而不是 'B'?

2) 除了使用 'request-response' MEP 之外,我该如何避免这种情况?

3) 有没有一种方法可以编写单元测试以确保从 VM(单向,启用 xa)到 JMS(单向,启用 xa)的消息处理顺序保持不变?

4) 我该如何进行手动测试?

提前谢谢你。任何 pointers/help 将不胜感激。

不太可能,因为您的系统通常会比用户提交请求更快地做出反应。但是,在负载高峰期间可能会出现这种情况。

要真正确保消息顺序,您确实需要解决方案中的单一瓶颈(单一 instance/thread)来处理所有请求。也就是说,您需要确保您在 Mule 中的处理策略是同步的,并且您在 VM 队列中只有一个消费者。如果你有一个包含多个 Mule 服务器的 HA 设置,你可能会得到乱序的消​​息。在这种情况下,如果用户最初是使用 HTTP 连接的,您可以使用具有粘性会话策略的负载平衡器来解决大部分问题。

一个可能更健壮和可扩展的解决方案是确保用户在每个请求上以高分辨率提交它的本地时间戳。然后您可以确保在将信息存储到数据库时丢弃任何 "obsolete" 更新。但是,这不在 mule VM/JMS 层中,而是在数据库中。

对于可测试性 - 不,我不认为有一种真正令人满意的方法可以通过编写集成测试或执行手动测试来 100% 确保消息在任何情况下都不会乱序。您需要从理论上验证消息路径,以确保没有一条消息可以绕过另一条消息的部分。