【问题标题】:MQ queues vs Batch process : how to replay asynchronous process when it failsMQ 队列 vs 批处理:异步进程失败时如何重播
【发布时间】:2018-07-10 12:45:06
【问题描述】:
作为中间件开发的一部分,我需要在两种机制之间进行选择来进行异步处理(可能会重放失败的情况)
我有以下两种技术的想法:
技术环境是Java(jdlk 8 + wildfly + REST web services作为中间件入口)
您能否通过比较两种技术的优缺点来指导我,如果有更好的解决方案,将受到欢迎。
提前感谢您的帮助。
【问题讨论】:
标签:
java
asynchronous
batch-processing
middleware
mqueue
【解决方案1】:
在这种情况下,我的首选是选项 1。我的理由是:
- 无需额外的数据库及其所需的维护(更新架构、编写代码来写入和读取消息)。
- 您提到使用 MQ 文件,因此我假设您已经在使用消息队列,如果您使用的是 RabbitMQ 等服务总线,它可以为您自动将故障路由到故障队列。
- 您可以稍后为队列启动多个竞争消费者,这样在清理大型队列时会更快(即更好的可扩展性)。批处理可能是一个单一的顺序处理,一个接一个地处理消息(当然这取决于您的实现,但很典型)。
此外,如果 REST 服务暂时繁忙,您始终可以对初始请求实施重试机制,以使其有更好的成功机会,然后在重试尝试失败时将其放入队列以供稍后处理。试试看类似Spring retry
【解决方案2】:
感谢您抽出宝贵时间回复我。
事实上,我已经将 IBM MQ 用于旧应用程序,但根据经验,在生产环境中维护是非常明智的,特别是在开始重放过程之前调查错误的根本原因。
这就是为什么我说可能使用数据库将提供更清晰的愿景(用于调查和监控不同可能的错误原因)。
出于表演的原因,我也完全同意你。