所以我一直在研究构建一个依赖类似于消息传递总线的应用程序。这个想法是非常容错的。我有一个需要执行的任务队列,以下是我认为在基于队列的系统中最终目标的步骤。
现在发生以下两件事之一:
- 或 -
我正在研究不同的解决方案,我看到很多人使用REDIS作为执行此操作的后端,但它的队列相当简单。例如,RPOPLPUSH
将从队列中删除密钥。如果服务器崩溃会怎么样?队列现在认为它处理了该项目,我们丢失了任务。
建议采取哪些步骤来确保任务完成,并注意任务失败能够被另一台服务器重新处理?我打算在go中编写任务,并且我愿意使用AWS等云服务。
答案 0 :(得分:2)
Redis是一个基本组件,您可以在其上构建排队系统。也就是说,在Redis之上实现真正有保障的交付系统并非易事,特别是如果您需要交易行为。
以下是一些使用各种语言的Redis实现的排队系统:
在Go中可以开发类似的东西,但是当涉及到真正有保证的传递语义时,魔鬼就在细节中。
您可能会更好地使用专用排队系统,例如RabbitMQ或ActiveMQ。虽然它们更复杂,但它们提供了更多功能,并且可能提供更好的保证。
这是RabbitMQ的Go客户端:https://github.com/streadway/amqp
您可能也会对disque(Redis作者的专用排队解决方案)以及https://github.com/EverythingMe/go-disque
上相应的Go客户端感兴趣最后,beanstalkd是另一种轻量级解决方案;您可以在https://github.com/kr/beanstalk
找到Go客户端答案 1 :(得分:1)
可能会在这里说明显而易见的,但SQS(http://aws.amazon.com/sqs/)会为您提供开箱即用的功能。您不必担心管理排队系统,它会自动扩展,您将专注于编写应用程序。
将消息推送到队列。工作人员将他们从队列中拉出来,处理它们并在完成后确认消息。如果工作人员在超时后没有收到消息,则指定该消息将显示给另一个工作人员。