【发布时间】:2015-10-07 09:46:44
【问题描述】:
所以我一直在研究构建一个依赖于类似于消息传递总线的应用程序。这个想法是非常容错的。我有一个需要执行的任务队列,以下是我认为是基于队列的系统的最终目标的步骤。
- A/B 服务器最初将一个项目添加到要处理的队列中。
- 侦听队列的 C 服务器在队列中看到一个新项目,并开始处理它。我相信它应该用超时锁定项目,(如果服务器崩溃等......,我需要其他工作人员能够处理它。)
现在发生了两种情况之一:
- C服务器没有响应该任务,或者超时时间过长,队列将其解锁并传递给服务器D处理
- 或 -
- C 服务器完成任务并最终从队列中删除条目。
我正在研究不同的解决方案,我看到很多人使用 REDIS 作为后端来执行此操作,但它的队列相当简单。例如RPOPLPUSH 将从队列中删除密钥。如果服务器崩溃了怎么办?队列现在认为它处理了该项目,我们有一个丢失的任务。
建议采取哪些步骤来确保任务完成,并注意任务失败以便能够由另一台服务器重新处理?我打算在 go 中编写任务,并且我愿意使用 AWS 等云服务。
【问题讨论】:
-
RPOPLPUSH 确实在一个原子操作中出列和重新入列到另一个列表。如果您的进程在此操作后失败,则不会丢失任何内容(该项目仍存在于其他列表中)。也就是说,使用 Redis 实现真正的保证交付并非易事。
-
@DidierSpezia 您还有其他解决方案吗?
-
真正的排队系统可能正是您所寻找的。请参阅 RabbitMQ、ActiveMQ 等...这是 RabbitMQ Go 客户端:github.com/streadway/amqp
-
@DidierSpezia 把它变成一个答案,我会给你我的赞许。
-
如果你想要一个轻量级的非分布式工作队列,beantalkd 会满足你的要求kr.github.io/beanstalkd
标签: amazon-web-services go redis scalability