亚马逊简单队列服务(SQS)

4
我在SQS中创建了一个队列,并添加了两条消息(序列化的PHP数组:array('filename' => 0, ...)array('filename' => 1, ...))。我正在使用来自他们git仓库的最新版本的amazon PHP SDK。
问题是,当我使用这些选项的receive_message函数时:
MaxNumberOfMessages = 10
VisibilityTimeout = 0 // other values doesn't change much

我只得到了第一条消息,并且重复了10次:

<ReceiveMessageResponse>
−
<ReceiveMessageResult>
−
<Message>
<MessageId>82523332-75e0-444d-ae8f-55ccd5580beb</MessageId>
−
<ReceiptHandle>
v5iiyMGi3b6RunVNVvjOQOV+ZDqRV7sNLzj5pUAEj1brIAkucpYiGaM8UIdOEis9Kouh4s+cAkSAd7MhbJKPGM6SdKYE993x2Lf/DwEbhkfmzRxOevzUsyJCrrVdTSTSx0cNUqqV6Cgr/Asi72t/UOhbdXhTp3kaCaZfd2weymg=
</ReceiptHandle>
<MD5OfBody>ced185420292fbd06b32ea6e35da3d21</MD5OfBody>
−
<Body>
a:3:{s:8:"priority";i:2;s:8:"filename";i:0;s:11:"task_ticket";s:0:"";}
</Body>
</Message>
−
<Message>
<MessageId>82523332-75e0-444d-ae8f-55ccd5580beb</MessageId>
−
<ReceiptHandle>
v5iiyMGi3b6RunVNVvjOQOV+ZDqRV7sNLzj5pUAEj1brIAkucpYiGaM8UIdOEis9Kouh4s+cAkSAd7MhbJKPGM6SdKYE993x2Lf/DwEbhkfmzRxOevzUsyJCrrVdTSTSx0cNUqqV6Cgr/Asi72t/UOhbdXhTp3kaCaZfd2weymg=
</ReceiptHandle>
<MD5OfBody>ced185420292fbd06b32ea6e35da3d21</MD5OfBody>
−
<Body>
a:3:{s:8:"priority";i:2;s:8:"filename";i:0;s:11:"task_ticket";s:0:"";}
</Body>
</Message>
    ...and so on, always with "filename";i:0

我100%确定队列中只有两条消息(我已经删除并重新创建了它以确保),但我只收到第一条消息,而且这个问题会时不时发生,有时我会在列表中混入第二条消息。如果我将VisibilityTimeout保留为默认值3(或其他非零值),那么第一条消息会暂时消失(预期的),然后我会收到重复出现多次的第二条消息。 get_queue_size返回2,这是正确的。
我还尝试过使用Amazon Scratchpad并进行API调用,结果相同。那么,SQS是坏掉了还是我做错了什么?

没有看到代码很难提供帮助。 - John Cartwright
1个回答

9

我认为这是预期行为,因为你设置了VisibilityTimeout = 0。通常情况下,你会将超时值设置为处理消息的预期持续时间。在可见性超时到期之前,你必须对已读取的消息调用delete,否则该消息将自动重新排队。

在更复杂的系统中,如果初始超时时间不够长,可以使用单独的线程来延长单个消息的超时时间。

由于你似乎刚刚开始,因此编写消息处理代码时重要的一点是要考虑多次读取相同的消息。不仅你的消息可能会被自动重新排队,而且SQS偶尔会返回重复的消息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接