我有一个工作人员运行在弹性Beanstalk上,它通过来自队列的消息接受POST请求。这些消息触发了耗时数分钟(有时甚至数小时)的长操作,并且该操作必须只执行一次。
问题是,当我登录到worker控制台查看进程时,消息似乎每分钟都在一遍又一遍地传递(接收请求触发的方法每分钟都被调用)。我怎样才能摆脱这种行为呢?
我阅读了文档,并将服务队列和死信队列的可见超时周期都设置为最大值(12小时)。然而,这一点也没有帮助。
当我发送消息时,它显示为“in flight”(我认为这是一种假定的行为,因为队列等待接收一个删除请求或某种只在长操作结束时提供的回答)。
有人能给我提示一下这个场景是怎么回事吗?我可能错过了配置中的一些重要细节...
编辑:似乎信息每分钟都在被重新传递,只要它是“在飞行中”。一旦我完成了这个过程,消息最终就消失了。
这里有一层额外的复杂性,因为您不是直接轮询SQS队列;弹性Beanstalk部署了一个名为sqsd
的工作进程,它代表您轮询队列,将获得的任何消息发布到应用程序,并在您以200响应时从队列中删除这些消息。
队列上的VisibilityTimeout设置控制队列在将消息传递给使用者(在本例中为sqsd)之后等待多长时间,然后才假定出现了错误并将消息重新传递给其他人。sqsd有一个类似的概念(称为“InactivityTimeout”),它控制在发布到您的应用程序之后等待多长时间,然后才假设有问题并重试。您还需要将其配置为足够高,以便sqsd在完成处理之前不会将请求重新发送到应用程序。我看到了另一个“ProxyTimeout”设置的报告,该设置也可能需要调整。
更一般地说,请记住,一旦在html" target="_blank">分布式系统中无法保证交付,即使您得到了所有的超时,使其在大多数时间都能正常工作,在完成操作之后,但在您能够告诉SQS之前,您总是有可能崩溃,并且消息将被重新交付给其他人。您能得到的最接近的方法是确保消息传递两次时,结果完全相同--例如,让您的处理逻辑检查它将要做的事情是否已经完成,如果已经完成,则立即返回200。
我正在使用AWS sdk开发基于SQS的队列pub-sub。 在非常基本的原型中,我将消息并发地推送到我已经创建的队列中。但是,如何才能确定我的消息正在被推送到队列中呢?
我想在SQS上发布一条消息,并在几个小时后处理该消息。 如何根据某些属性安排消息传递或从SQS中选择消息? 我已经实现了一个SQS消费者,但我正在接收来自SQS队列的每条消息。有可能在SQS上实现类似的功能吗?我正在考虑接收每条消息,如果还没到处理该消息的时间,就再次发送到队列。
我知道可以使用多个线程使用SQS队列。我想保证每封邮件都会被消费一次。我知道可以更改消息的可见性超时,例如,等于我的处理时间。如果我的进程花费的时间超过可见性超时时间(例如连接速度慢),则其他线程可以使用相同的消息。 保证消息只处理一次的最佳方法是什么?
我试图使用他们文档中提到的masstransit配置将SNS主题订阅到SQS队列。消息已发布,但不会出现在SQS队列中。SQS队列名称:“测试”,SNS主题名称:“kbbico手动替换”。
我正在尝试扩展RabbitMQ消息传递系统。当前的系统非常简单——生产者向扇出交换发送消息,消息由多个消费者处理——经典的扇出路由。 我有多个不同类型的消费者(例如:一个打印到屏幕,一个记录到文件,一个保存到数据库,…)。我的挑战——我不确定扩大消费者规模的最佳方式是什么。如果我添加来自同一类型的其他使用者,我将在数据库中获得两个日志或两个条目。。。(假设两个DB消费者从同一扇出交换中消费)。 我
我已经建立了AWS架构体系,以便每次对发电机数据库条目的更新都以启用重复数据删除的SQS先进先出队列结束。我还有一个测试来覆盖这个场景,在那里我清除了队列(队列可以从套装中的其他测试中获得更新。为了避免在收到正确的消息之前必须轮询大量的消息,我在运行测试之前清除队列),更新Dynamo Db,并在轮询队列时检查这些条目是否收到。这个测试是不稳定的,有时会失败,因为我发送的所有更新都没有从队列中收到