Azure Queue唯一消息

时间:2011-05-26 06:44:42

标签: azure queue azure-queues

我想确保不会多次向队列插入消息。我可以使用任何ID /名称来强制执行唯一性吗?

3 个答案:

答案 0 :(得分:11)

vtortola几乎涵盖了它,但我想更多地详细说明为什么至少一次交付。

当您读取队列项时,它不会从队列中删除;相反,它变得不可见但保留在队列中。隐身期限默认为30秒(最长:2小时)。在此期间,从队列中获取该项目的代码有足够的时间处理队列消息中的任何命令并删除队列项。

假设在达到超时时间之前删除了队列项,一切都很顺利。但是:一旦达到超时时间,队列项将再次可见,并且保存队列项的代码可能不再删除它。在这种情况下,其他人可以读取相同的队列消息并重新处理该消息。

由于队列消息可以超时,并且可以重新出现:

  • 您的队列处理必须 idempotent - 对队列消息的操作必须产生相同的结果(例如渲染照片的缩略图)。
  • 您需要考虑超时调整。你可能会发现命令是有效的,但处理时间太长(也许你的45秒缩略图渲染代码工作得很好,直到有人上传了一张2500万像素)
  • 您需要考虑有害信息 - 那些永远无法正确处理的信息。也许它们会导致抛出异常或导致消息处理器中止处理的某些无效条件,这会导致消息最终重新出现在队列中。有一个调用 DequeueCount 的属性 - 考虑在读取队列项时查看该属性,如果等于3,则将消息推送到表或blob并发送通知以花一些时间调试该消息离线。

有关get-queue低级REST API的更多详细信息是here。这将使您更深入地了解Windows Azure队列消息处理。

答案 1 :(得分:8)

Azure队列无法确保邮件顺序和邮件唯一性。消息将被“至少一次”处理,但没有任何东西可以确保它不会被处理两次,因此它不能确保“最多一次”。

您应该准备两次收到相同的消息。您可以在邮件正文中添加ID作为数据的一部分。

答案 2 :(得分:0)

您可能想尝试Service Bus Queue