MQ 队列与批处理:失败时如何重放异步进程
MQ queues vs Batch process : how to replay asynchronous process when it fails
作为中间件开发的一部分,我需要在两种机制之间进行选择以进行异步处理(具有重放失败案例的可能性)
我有以下两种技术的想法:
使用MQ队列(出错时,在拒绝队列中插入一条消息,稍后重放)
用数据库存储失败案例,转成批次回放。
技术环境为Java(jdlk 8 + wildfly + REST web服务作为中间件入口点)
能否通过比较两种技术的优缺点来指导我,如果有更好的解决方案欢迎提出。
在此先感谢您的帮助。
在这种情况下,我的首选是选项 1。我的理由是:
- 不需要额外的数据库和它所需要的维护(更新架构、编写代码来写入和读取消息)。
- 你提到使用 MQ 文件,因此我假设你已经在为消息使用队列,如果你正在使用 RabbitMQ 之类的服务总线,它可以为你自动将故障路由到故障队列。
- 您可以稍后为队列启动多个竞争消费者,这在清理大型队列时会更快(即更好的可扩展性)。批处理过程可能是一个单一的顺序过程,一条一条地搅动消息(当然这取决于您的实现,但很典型)。
此外,如果 REST 服务暂时繁忙,您始终可以在初始请求上实施重试机制,以使其有更好的成功机会,然后在重试尝试失败时放入队列以供稍后处理。尝试查看类似 Spring retry
的内容
作为中间件开发的一部分,我需要在两种机制之间进行选择以进行异步处理(具有重放失败案例的可能性) 我有以下两种技术的想法:
使用MQ队列(出错时,在拒绝队列中插入一条消息,稍后重放)
用数据库存储失败案例,转成批次回放。
技术环境为Java(jdlk 8 + wildfly + REST web服务作为中间件入口点)
能否通过比较两种技术的优缺点来指导我,如果有更好的解决方案欢迎提出。
在此先感谢您的帮助。
在这种情况下,我的首选是选项 1。我的理由是:
- 不需要额外的数据库和它所需要的维护(更新架构、编写代码来写入和读取消息)。
- 你提到使用 MQ 文件,因此我假设你已经在为消息使用队列,如果你正在使用 RabbitMQ 之类的服务总线,它可以为你自动将故障路由到故障队列。
- 您可以稍后为队列启动多个竞争消费者,这在清理大型队列时会更快(即更好的可扩展性)。批处理过程可能是一个单一的顺序过程,一条一条地搅动消息(当然这取决于您的实现,但很典型)。
此外,如果 REST 服务暂时繁忙,您始终可以在初始请求上实施重试机制,以使其有更好的成功机会,然后在重试尝试失败时放入队列以供稍后处理。尝试查看类似 Spring retry
的内容