2014-10-05 4 views
0

Мы строим решение, в котором мы публикуем сообщение в очередь тайм-аута. После истечения времени истечения срока действия TTL сообщения пересылаются в основную очередь для повторной обработки.Истек срок доставки сообщений RabbitMQ

Мы настраиваем значение счетчика, чтобы сообщения обрабатывались для x нет. времени для повторной доставки.

Решение работает нормально. Но сценарий заключается в том, что сообщение о положении на голове наивысшее значение TTL не истек, другие сообщения с более низким истечением не будут повторно опубликованы (в основную очередь).

Правильно ли это понимание? Если да, то каково решение, чтобы каждое сообщение повторно обрабатывалось сразу после TTL.

Ценительные ответы/точка зрения.

Спасибо.

ответ

3

Если вы используете сообщение TTL в очереди, сообщение истекает и удаляется из очереди с головы до хвоста (в том же порядке, в котором они были опубликованы).

Когда вы используете TTL для сообщений, сообщения удаляются из очереди только тогда, когда они достигают головы очереди, поэтому ситуация, когда сообщения с истекшим сроком службы остаются в середине очереди, является нормальным. Такие сообщения не будут отправляться потребителю и будут сбрасываться (или удалены), но из-за строгого характера FIFO или очередей RabbitMQ, которые будут выполняться, как написано выше, когда они достигают головы очереди и задержки до удаления, может быть больше, чем фактическое сообщение TTL , Например, если есть два сообщения, сначала с TTL = 10 секунд, а второе с TTL = 1сек, второе сообщение будет также сглажено также в 10 секунд, пока оно останется после первого.

Чтобы иметь дело с сообщениями, имеющими разные TTL, обычным обходным путем является объявление нескольких очередей, каждый для сообщений с одинаковым TTL или почти таким же, скажем, с точностью 10сек. Фактическая точность может варьироваться в зависимости от конкретного приложения и некоторой эмпирической ценности.

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

Чтобы повторно обрабатывать сообщения после использования TTL, используйте Dead Letter Exchanges, но остерегайтесь проблемы с циклическими сообщениями: если брокер RabbitMQ обнаруживает, что рабочий цикл сообщений циклически (сообщения публикуются для того же обмена с одним и тем же ключом маршрутизации после того, как он был удален из него) , он будет молча передавать сообщение.

Смежные вопросы