2011-03-14 134 views
4

我在SQS中创建了一个队列,添加了两条消息(序列化的PHP数组:array('filename'=> 0,...)和array('filename'=> 1,.. ))。我从他们的git仓库使用最新版本的亚马逊PHP for PHP。亚马逊简单队列服务(SQS)

的问题是,当我使用RECEIVE_MESSAGE功能与这些选项: MaxNumberOfMessages = 10 VisibilityTimeout = 0 //其它值变化不大

我只得到了第一条消息,重复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%认为队列中只有2条消息(我将其删除并重新创建,以确保),但我只获得第一条,多次填充。这种情况会不时发生变化,有时我会得到第二个混合在列表中。如果我将VisibilityTimeout作为默认值3(或其他非零值)离开,第一个会消失一段时间(如预期的那样),然后我将第二个重复多次:)

get_queue_size返回2,这是正确的。

我也尝试了亚马逊便笺簿,只是用相同的结果进行API调用。那么,SQS是否破裂,或者我正在做一些完全错误的事情?

谢谢!

+0

没有看到代码很难帮忙。 – 2011-03-14 21:30:41

回答

8

我相信这是预期的行为,因为您已设置VisibilityTimeout = 0。通常,您可以将超时值设置为处理消息的预期持续时间。在之前,您必须在读取消息上调用delete,否则可见性超时将终止或消息将自动重新排队。

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

听起来你刚刚开始,重要的是你编写消息处理代码来考虑多次读取相同的消息。您的消息不仅可以自动重新排队,而且SQS偶尔会返回重复的消息。