【发布时间】:2016-03-05 17:06:14
【问题描述】:
我使用 SQS 作为视频编码队列,并希望确保每个视频只执行一次编码。
SQS 工作正常,因为当消息排队时,它只会被单个线程接收。但是,对于相同的视频/编码,可能会向队列发送多条消息,这意味着特定“编码”队列的消息内容是相同的。
是否有去重以确保对于特定队列,队列中的消息或从队列接收的消息是唯一的?
我认为一个选项是在发送消息时为每种编码类型创建一个新队列。所以队列可以命名为encoding-video-id,它只有一条消息,我可以检查以确保队列不存在。唯一的“问题”是创建的数千个这样的队列可能有 1000 到 10 个。
【问题讨论】:
-
那么是什么导致您将同一条消息多次排队?
-
用例是用户可以提交'encode'来排队视频,在极端情况下可能会被多次点击,这将导致多条消息。
-
刚刚注意到您可以在 sqs 中创建“无限”队列,因此上述选项可能会起作用。
-
即使没有用户排队重复任务的可能性,SQS 本身也不能保证“恰好一次”传递消息。它保证“至少一次”,因此 SQS 本身可以传递重复的消息。我认为这些问题的答案与您的问题有关:stackoverflow.com/questions/32386877/… 和 stackoverflow.com/questions/13484845/…
-
@mbaird 我认为这将成为需要做的事情。基本上在redis中使用原子操作并在其上设置较低的TTL(在处理时更新)。可以简单地使用基于视频 guid 的具有唯一键的 INCR 并检查它是否存在。如果这上面的 TTL 是 20 秒,SQS 上的 TTL 是 1m,两者都在每 10 秒处理一次作业时更新,我认为这应该可以解决重复数据删除的问题并允许重试 SQS。
标签: amazon-web-services amazon-sqs