5

我想确保我不会多次将消息插入队列。有没有我可以用来强制唯一性的 ID/名称?

4

2 回答 2

13

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

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

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

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

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

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

于 2011-05-26T11:02:42.450 回答
8

Azure 队列不确保消息顺序和消息唯一性。消息将被处理“至少一次”,但没有什么能保证它不会被处理两次,所以它不能保证“最多一次”。

您应该准备好两次接收相同的消息。您可以将 ID 作为数据的一部分放在消息正文中。

于 2011-05-26T08:51:17.593 回答