JMS - 异步处理 - 处理父/子进程依赖关系

时间:2014-09-05 14:47:49

标签: java spring hibernate architecture message-queue

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

技术堆栈:

  • EJB 3.0 MDB的
  • Hibernate 4.2.11()
  • Spring 4.0.1
  • Websphere MQ的
  • Oracle 11g数据库。

解决方案1尝试:父进程轮询子进程,直到每个子级别完成为止。这意味着一个开放的MDB会话将一致地轮询每个级别的消息的响应队列,以便它的子进程完成。

优势:您可以不断调用数据库来确定“我还没完成”。

缺点:

  • 此解决方案在等待并轮询完成流程时维护与MQ的一致开放输入连接。缩放时连接数会增加。
  • 如果有任何消息丢失,它将丢弃轮询机制的计数。不太可靠。
  • 如果您已启用持久性(大多数情况下应该启用),它将重新处理初始请求,因为它仍然会打开,重新执行整个请求。

解决方案2提案:

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

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

优势:

  • 列出项目

  • 所有消息都是孤立的。

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

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

我没有经常使用Spring批处理和Spring集成,但也许这就是我应该寻找解决方案的地方。希望在MDB和MQ的消息流方面有很多经验的人可以在缩放/确定过程何时完成方面给出一些指导。

1 个答案:

答案 0 :(得分:0)

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

  • Parent有一个需要完成的子任务(带有id)的列表。
  • MQ中可以发布完成状态的新主题。
  • 绑定到完成状态主题的新MDB,用于更新父级(例如,从列表中删除已完成的任务)。
  • 收到所有子任务的完成状态后,父级已完成。

这样,由于子项(解决方案1)或数据库(解决方案2)的轮询,没有额外的负载。

这也允许您扩展体系结构以引入更复杂的控制机制。对于例如您可以通过将来自子项的定期进度消息发布到状态主题来监视任务的进度/确保它们都没有崩溃。