Amazon web services 基于队列的处理

Amazon web services 基于队列的处理,amazon-web-services,go,redis,scalability,Amazon Web Services,Go,Redis,Scalability,因此,我一直在研究构建一个依赖于类似于消息传递总线的应用程序。这个想法是非常容错的。我有一个需要执行的任务队列,以下是我认为在基于队列的系统中最终目标的步骤 A/B服务器最初将一个项目添加到要处理的队列中 侦听队列的C服务器在队列上看到一个新项目,并开始处理它。我认为它应该用一个超时来锁定该项(如果服务器崩溃等等,我需要其他工作人员来处理它) 现在发生了两件事之一: C服务器无法响应所述任务,或者该任务已超过超时时间很长,队列将其解锁并将其传递给服务器D进行处理 -或- C服务器完成任

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

  • A/B服务器最初将一个项目添加到要处理的队列中
  • 侦听队列的C服务器在队列上看到一个新项目,并开始处理它。我认为它应该用一个超时来锁定该项(如果服务器崩溃等等,我需要其他工作人员来处理它)
现在发生了两件事之一:

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

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


建议采取哪些步骤来确保任务完成,并注意任务失败,以便能够被其他服务器重新访问?我打算在go中编写任务,我愿意使用AWS等云服务。

Redis是一个基本组件,您可以在其上构建排队系统。这就是说,在Redis之上实现真正的有保证的交付系统并非易事,特别是当您需要事务性行为时

以下是一些使用Redis以各种语言实现的排队系统:

类似的东西也可以在Go中开发,但当涉及到真正的保证交付语义时,魔鬼就在细节中

专用队列系统(如RabbitMQ或ActiveMQ)可能会更好地为您提供服务。虽然它们更复杂,但它们提供了更多的功能,可能还有更好的保证

以下是RabbitMQ的Go客户端:

您可能还对(Redis author提供的专用队列解决方案)和相应的Go客户端感兴趣


最后,是另一个轻量级解决方案;您可以在以下位置找到Go客户端:

这里可能会说明显而易见的问题,但是SQS()提供了您所需要的现成信息。您不必担心管理排队系统,它会自动为您扩展,您将专注于编写应用程序


您将消息推送到队列中。工作人员将它们从队列中拉出来,处理它们,完成后确认消息。如果工作进程在超时后未确认消息,则指定的消息将显示回另一个工作进程

RPOPLPUSH在一个原子操作中退出队列并重新加入另一个列表。如果此操作后进程失败,则不会丢失任何内容(该项仍存在于其他列表中)。也就是说,使用Redis实现真正的有保证的交付不是一件小事。@DidierSpezia您是否推荐其他解决方案?您可能正在寻找一个真正的排队系统。请参阅RabbitMQ、ActiveMQ等。。。这是一个RabbitMQ Go客户端:@DidierSpezia将此转化为答案,我会竖起大拇指表示同意。如果您想要一个轻量级的非分布式工作队列,beanstalkd将满足您的要求。我担心多个工作人员可以通过SQS接收消息。队列的点是一个工人应该同时处理一个任务。不确定amazon为什么允许多个工作人员处理同一任务。假定消息未被处理(删除),SQS中的消息在发送给第二个队列工作人员之前会有一个超时。@FrankerZ在正常操作中,您将有一个工作人员处理该消息。无论如何,您都需要处理具有相同消息的两个工作进程,以防该工作进程花费的时间超过超时时间,并将消息发送给第二个工作进程。后退:在出现故障的客户端/网络/服务器的情况下,保证只发送一次是非常困难的(即不可能的)。这样做的方法是,使您正在进行的操作的效果变为幂等,这样第二个客户端处理相同的消息时就不会造成伤害。您可以了解其粒度(即,只要有检查点,并非所有操作都必须是幂等的)。redis是安装和维护的额外工作。rabbitmq也一样