【问题标题】:JMS - Asynchronous Processing - Dealing with Parent / Child processes DependenciesJMS - 异步处理 - 处理父/子进程依赖关系
【发布时间】:2014-10-30 13:34:09
【问题描述】:

问题:我有一个单独的进程请求启动,它分解为多个级别的队列/MDB,以通过并行性加快处理速度。问题是,了解每个处理级别何时完成以进行关闭过程的最佳方法是什么?请记住,我正在处理大量消息,因此必须考虑性能。

技术栈:

  • EJB 3.0 MDB 的
  • 休眠 4.2.11 ()
  • 春季 4.0.1
  • Websphere MQ 的
  • Oracle 11g 数据库。

已尝试解决方案 1:父进程轮询子进程,直到在每个子级别完成。这意味着一个打开的 MDB 会话将始终如一地轮询响应队列以获取每个级别的消息,以完成其子进程。

优势:您可以避免不断调用数据库来确定“我完成了吗”。

缺点:

  • 此解决方案在等待和轮询进程完成时保持与 MQ 的一致打开输入连接。随着您的扩展,连接数会增加。
  • 如果有任何消息丢失,它将取消轮询机制的计数。不太可靠。
  • 如果您打开了持久性(大多数情况下应该这样做),它将重新处理初始请求,因为它仍然处于打开状态,重新执行整个请求。

方案二建议:

  • 不使用轮询机制,而是在每个处理级别使用更多绑定到响应队列的 MDB。让一切都独立运作。

如何判断流程是否完成?当每条消息到达响应 MDB 时,它可以检查数据库状态表以确定其是否完整。

优势:

  • 列表项

  • 所有消息都是独立工作的。

  • 更适合支持高可用性和持久消息。
  • 防止任何长时间运行的打开进程针对 MQ。

缺点:这可能意味着要多次调用数据库来确定完整性。我认为随着消息数量的增加,这将是一个主要的可扩展性问题。

我没有经常使用 Spring Batch 和 Spring Integration,但也许这就是我应该寻找解决方案的地方。希望在 MDB 和 MQ 消息流方面有丰富经验的人可以在扩展/确定流程何时完成方面给我一些指导。

【问题讨论】:

    标签: java spring hibernate architecture message-queue


    【解决方案1】:

    另一种解决方案是使用 JMS 总线让子进程在子任务完成时通知父进程。架构看起来像这样。

    • 父级有一个需要完成的子任务(带有 ID)的列表。
    • MQ 中的一个新主题,孩子可以在其中发布完成状态。
    • 一个新的 MDB,它绑定到更新父级的完成状态主题(例如,从列表中删除已完成的任务)。
    • 当收到所有子任务的完成状态时,父任务完成。

    这样,不会因轮询子项(解决方案 1)或数据库(解决方案 2)而产生额外负载。

    这还允许您扩展架构以引入更复杂的控制机制。例如您可以通过将子级的定期进度消息发布到状态主题来监控任务的进度/确保它们没有崩溃。

    【讨论】:

    • 我认为 JMS 总线是一个明确的可扩展性必须。只是为了解决 MQ 的 tcp/ip 连接限制。唯一的问题是我需要为每个子级处理设置一个主题。还有如何解决同样的问题,知道......这个过程什么时候真正完成? mdb 不会知道最后一条消息。我想我可以添加标题信息,以便它可以跟踪它完成的消息数量,就好像它正在轮询一样。但是,我认为可能会发生相同的“丢失消息”场景破坏该过程的问题。但它确实解决了一些问题,并且是一个有效的选择。
    • 无论如何都必须为正向路径处理丢失消息的问题。相同的解决方案也可用于此目的。此外,这不必只针对“任务完成”消息。您可以使用 JMS 总线获取来自子任务的“生命迹象”消息,以了解它们是否存在。
    • 我想给大家一些时间来看看我的问题。但是,我认为最好的解决方案是在流程中使用分散的管理器。像 Spring Integration 或 Camel。这允许一个连续的过程独立工作,但允许您允许基于整个过程的自定义执行。就像窃听器、计数器和状态一样。
    猜你喜欢
    • 2015-05-11
    • 2014-07-05
    • 2021-07-05
    • 1970-01-01
    • 2021-12-14
    • 2014-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多