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服务器完成任务并最终从队列中删除条目
建议采取哪些步骤来确保任务完成,并注意任务失败,以便能够被其他服务器重新访问?我打算在go中编写任务,我愿意使用AWS等云服务。Redis是一个基本组件,您可以在其上构建排队系统。这就是说,在Redis之上实现真正的有保证的交付系统并非易事,特别是当您需要事务性行为时 以下是一些使用Redis以各种语言实现的排队系统:
最后,是另一个轻量级解决方案;您可以在以下位置找到Go客户端:这里可能会说明显而易见的问题,但是SQS()提供了您所需要的现成信息。您不必担心管理排队系统,它会自动为您扩展,您将专注于编写应用程序
您将消息推送到队列中。工作人员将它们从队列中拉出来,处理它们,完成后确认消息。如果工作进程在超时后未确认消息,则指定的消息将显示回另一个工作进程 RPOPLPUSH在一个原子操作中退出队列并重新加入另一个列表。如果此操作后进程失败,则不会丢失任何内容(该项仍存在于其他列表中)。也就是说,使用Redis实现真正的有保证的交付不是一件小事。@DidierSpezia您是否推荐其他解决方案?您可能正在寻找一个真正的排队系统。请参阅RabbitMQ、ActiveMQ等。。。这是一个RabbitMQ Go客户端:@DidierSpezia将此转化为答案,我会竖起大拇指表示同意。如果您想要一个轻量级的非分布式工作队列,beanstalkd将满足您的要求。我担心多个工作人员可以通过SQS接收消息。队列的点是一个工人应该同时处理一个任务。不确定amazon为什么允许多个工作人员处理同一任务。假定消息未被处理(删除),SQS中的消息在发送给第二个队列工作人员之前会有一个超时。@FrankerZ在正常操作中,您将有一个工作人员处理该消息。无论如何,您都需要处理具有相同消息的两个工作进程,以防该工作进程花费的时间超过超时时间,并将消息发送给第二个工作进程。后退:在出现故障的客户端/网络/服务器的情况下,保证只发送一次是非常困难的(即不可能的)。这样做的方法是,使您正在进行的操作的效果变为幂等,这样第二个客户端处理相同的消息时就不会造成伤害。您可以了解其粒度(即,只要有检查点,并非所有操作都必须是幂等的)。redis是安装和维护的额外工作。rabbitmq也一样