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