编程语言
首页 > 编程语言> > php – 亚马逊简单队列服务(SQS)

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

作者:互联网

我在SQS中创建了一个队列,添加了两条消息(序列化的PHP数组:array(‘filename’=> 0,…)和array(‘filename’=> 1,…)).我从他们的git repo使用最新版本的amazon SDK for PHP.

问题是当我使用带有以下选项的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%表示队列中只有2条消息(我删除了它并重新创建以确定)然而我只获得了第一条消息,多次填充.这种情况会不时发生变化,有时我会在列表中混合第二个.如果我将VisibilityTimeout保留为默认值3(或其他非零值),则第一个消失一段时间(如预期的那样),然后我重复多次重复第二个.

get_queue_size返回2,这是真的.

我也尝试过Amazon Scratchpad并且只是使用相同的结果进行API调用.那么,SQS是破碎还是我做错了什么?

解决方法:

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

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

因为听起来你刚刚开始,所以编写消息处理代码以便多次读取同一消息是很重要的.您的邮件不仅可以自动重新排队,而且SQS有时会返回重复的邮件.

标签:php,sdk,amazon-web-services,amazon-sqs
来源: https://codeday.me/bug/20190610/1211396.html