基于队列的处理

时间:2015-07-17 15:50:05

标签: amazon-web-services go redis scalability

所以我一直在研究构建一个依赖类似于消息传递总线的应用程序。这个想法是非常容错的。我有一个需要执行的任务队列,以下是我认为在基于队列的系统中最终目标的步骤。

  • A / B服务器最初将一个项目添加到要处理的队列中。
  • 侦听队列的C服务器在队列中看到一个新项目,并开始对其进行处理。我相信它应该用超时锁定项目,(如果服务器崩溃,等等......,我需要其他工作人员来处理它。)

现在发生以下两件事之一:

  • C服务器无法响应所述任务,或者已超过超时时间,并且队列将其解锁并将其传递给服务器D进行处理

- 或 -

  • C服务器完成任务并最终从队列中删除该条目。

我正在研究不同的解决方案,我看到很多人使用REDIS作为执行此操作的后端,但它的队列相当简单。例如,RPOPLPUSH将从队列中删除密钥。如果服务器崩溃会怎么样?队列现在认为它处理了该项目,我们丢失了任务。

建议采取哪些步骤来确保任务完成,并注意任务失败能够被另一台服务器重新处理?我打算在go中编写任务,并且我愿意使用AWS等云服务。

2 个答案:

答案 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/)会为您提供开箱即用的功能。您不必担心管理排队系统,它会自动扩展,您将专注于编写应用程序。

将消息推送到队列。工作人员将他们从队列中拉出来,处理它们并在完成后确认消息。如果工作人员在超时后没有收到消息,则指定该消息将显示给另一个工作人员。