基于队列的处理
Queue based processing
所以我一直在研究构建一个依赖于类似于消息传递总线的东西的应用程序。这个想法是非常容错的。我有一列需要执行的任务,以下是我认为基于队列的系统的最终目标的步骤。
- A/B 服务器最初将一个项目添加到要处理的队列中。
- 侦听队列的 C 服务器发现队列中有新项目,并开始处理它。我相信它应该用超时锁定项目,(如果服务器崩溃等......,我需要其他工作人员能够处理它。)
现在发生了两件事之一:
- C服务器没有响应该任务,或者超时时间过长,队列解锁交由D服务器处理
- 或 -
- C 服务器完成任务并最终从队列中删除条目。
我正在研究不同的解决方案,我看到很多人使用 REDIS 作为执行此操作的后端,但它的队列相当简单。例如 RPOPLPUSH
将从队列中删除密钥。如果服务器崩溃会怎样?队列现在认为它处理了那个项目,我们有一个丢失的任务。
建议采取哪些步骤来确保任务完成,并记录任务失败以便能够由另一台服务器重新处理?我打算在 go 中编写任务,并且我愿意使用 AWS 等云服务。
Redis 是一个基础组件,您可以在其上构建队列系统。也就是说,在 Redis 之上实现真正有保证的交付系统并非易事,尤其是当您需要事务行为时。
这里有一些用 Redis 实现的各种语言的排队系统:
- http://python-rq.org/
- https://github.com/resque/resque
- https://github.com/ask/celery
- https://pypi.python.org/pypi/rpqueue
可以在 Go 中开发类似的东西,但是当谈到真正有保证的交付语义时,细节决定成败。
专用队列系统可能会更好地为您服务,例如 RabbitMQ 或 ActiveMQ。虽然它们更复杂,但它们提供了更多功能,并且可能有更好的保证。
这是 RabbitMQ 的 Go 客户端:https://github.com/streadway/amqp
您可能也有兴趣查看 disque (a dedicated queuing solution from Redis author), and the corresponding Go client at https://github.com/EverythingMe/go-disque
最后,beanstalkd is another lightweight solution; you can find the Go client at: https://github.com/kr/beanstalk
这里可能会说明显而易见的事情,但 SQS (http://aws.amazon.com/sqs/) 可以开箱即用。您无需担心管理排队系统,它会自动为您扩展,您将专注于编写应用程序。
您将消息推送到队列。工作人员将它们从队列中拉出,处理它们并在完成后确认消息。如果工作人员在您指定的超时后没有确认消息,则该消息将返回给另一个工作人员。
所以我一直在研究构建一个依赖于类似于消息传递总线的东西的应用程序。这个想法是非常容错的。我有一列需要执行的任务,以下是我认为基于队列的系统的最终目标的步骤。
- A/B 服务器最初将一个项目添加到要处理的队列中。
- 侦听队列的 C 服务器发现队列中有新项目,并开始处理它。我相信它应该用超时锁定项目,(如果服务器崩溃等......,我需要其他工作人员能够处理它。)
现在发生了两件事之一:
- C服务器没有响应该任务,或者超时时间过长,队列解锁交由D服务器处理
- 或 -
- C 服务器完成任务并最终从队列中删除条目。
我正在研究不同的解决方案,我看到很多人使用 REDIS 作为执行此操作的后端,但它的队列相当简单。例如 RPOPLPUSH
将从队列中删除密钥。如果服务器崩溃会怎样?队列现在认为它处理了那个项目,我们有一个丢失的任务。
建议采取哪些步骤来确保任务完成,并记录任务失败以便能够由另一台服务器重新处理?我打算在 go 中编写任务,并且我愿意使用 AWS 等云服务。
Redis 是一个基础组件,您可以在其上构建队列系统。也就是说,在 Redis 之上实现真正有保证的交付系统并非易事,尤其是当您需要事务行为时。
这里有一些用 Redis 实现的各种语言的排队系统:
- http://python-rq.org/
- https://github.com/resque/resque
- https://github.com/ask/celery
- https://pypi.python.org/pypi/rpqueue
可以在 Go 中开发类似的东西,但是当谈到真正有保证的交付语义时,细节决定成败。
专用队列系统可能会更好地为您服务,例如 RabbitMQ 或 ActiveMQ。虽然它们更复杂,但它们提供了更多功能,并且可能有更好的保证。
这是 RabbitMQ 的 Go 客户端:https://github.com/streadway/amqp
您可能也有兴趣查看 disque (a dedicated queuing solution from Redis author), and the corresponding Go client at https://github.com/EverythingMe/go-disque
最后,beanstalkd is another lightweight solution; you can find the Go client at: https://github.com/kr/beanstalk
这里可能会说明显而易见的事情,但 SQS (http://aws.amazon.com/sqs/) 可以开箱即用。您无需担心管理排队系统,它会自动为您扩展,您将专注于编写应用程序。
您将消息推送到队列。工作人员将它们从队列中拉出,处理它们并在完成后确认消息。如果工作人员在您指定的超时后没有确认消息,则该消息将返回给另一个工作人员。