代码之家  ›  专栏  ›  技术社区  ›  FutureI.T.

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

  •  2
  • FutureI.T.  · 技术社区  · 11 年前

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

    考虑这样一个场景:每次用户向ESB更新姓氏时,我们都会发送一条消息。例如,假设用户将姓氏更改为“A”,但很快就会更改为“B”,所以最终结果应该是“B”。

    1) 在我的案例中,消息“B”是否可能在消息“A”之前得到处理?因此姓氏设置为“A”而不是“B”?

    2) 除了使用“请求-响应”MEP之外,我如何避免这种情况?

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

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

    提前谢谢。如有任何建议/帮助,将不胜感激。

    1 回复  |  直到 11 年前
        1
  •  1
  •   Petter Nordlander    11 年前

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

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

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

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