Amazon Simple Queue Service (SQS) - PullRequest
       5

Amazon Simple Queue Service (SQS)

4 голосов
/ 15 марта 2011

Я создал очередь в SQS, добавил два сообщения (сериализованные массивы PHP: array('filename' => 0, ...) и array('filename' => 1, ...)). Я использую новейшую версию amazon SDK для PHP из их репозитория git.

Проблема в том, что когда я использую функцию 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 не работает или я что-то не так делаю?

1 Ответ

8 голосов
/ 15 марта 2011

Я считаю, что это ожидаемое поведение, потому что вы установили VisibilityTimeout = 0.Обычно вы устанавливаете значение времени ожидания равным ожидаемой продолжительности обработки сообщения.Вы должны вызвать delete для прочитанного сообщения до того, как истечет время ожидания видимости, или сообщение будет автоматически поставлено в очередь.

В более сложных системах может использоваться отдельный поток для расширенияпериод ожидания для одного сообщения, если начальный тайм-аут не был достаточно длинным.

Поскольку кажется, что вы только начинаете, важно, чтобы вы записали свой код обработки сообщений в учетную запись для чтения одного и того же сообщения несколько раз.Мало того, что ваше сообщение может быть автоматически добавлено в очередь, но SQS иногда будет возвращать повторяющееся сообщение.

...