【发布时间】: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