Максимальная длина очереди может быть ограничена заданным количеством сообщений, или заданным количеством байт (суммарная длина всех тел сообщений, без учета свойств сообщений и любых накладных расходов), или и тем, и другим.
Для любой очереди максимальная длина (любого типа) может быть определена с помощью политики (этот вариант настоятельно рекомендуется) или клиентами с помощью дополнительных аргументов очереди. В случае, когда и политика эффективной очереди, и аргументы указывают максимальную длину, будет использоваться минимальное из двух значений.
Настройки длины очереди также могут быть навязаны политиками оператора.
Во всех случаях используется количество сообщений в состоянии готовности; сообщения, не принятые потребителями, не учитываются.
Количество готовых сообщений и их объем в байтах можно увидеть с помощью параметров messages_ready и message_bytes_ready из вывода rabbitmqctl list_queues, а также аналогичных полей в пользовательском интерфейсе управления и ответах HTTP API.
Поведение по умолчанию для ограничения максимальной длины очереди
Поведение RabbitMQ по умолчанию, когда задана максимальная длина или размер очереди и максимальное значение достигнуто, заключается в том, что сообщения из передней части очереди (т.е. самые старые сообщения в очереди) отбрасываются или заносятся в "мертвую очередь". Чтобы изменить это поведение, используйте настройку переполнения, описанную ниже.
Поведение при переполнении очереди
Используйте параметр переполнения для настройки поведения переполнения очереди. Если для параметра overflow установлено значение reject-publish или reject-publish-dlx, последние опубликованные сообщения будут отброшены. Кроме того, если включено подтверждение издателя, издатель будет проинформирован об отклонении с помощью сообщения basic.nack. Если сообщение направлено в несколько очередей и отклонено хотя бы одной из них, канал сообщит об этом издателю через basic.nack. Сообщение все равно будет опубликовано во всех остальных очередях, которые могут его зарегистрировать. Разница между reject-publish и reject-publish-dlx заключается в том, что reject-publish-dlx также отправляет отклоненные сообщения в "мертвую очередь".
Определение максимальной длины очереди с помощью политики
Чтобы задать максимальную длину с помощью политики, добавьте ключ max-length и/или max-length-bytes в определение политики. Например:
rabbitmqctl
1 2 3 | rabbitmqctl set_policy my-pol "^one-meg$" \ '{"max-length-bytes":1048576}' \ --apply-to queues |
rabbitmqctl в Windows
1 2 3 | rabbitmqctl.bat set_policy my-pol "^one-meg$" ^ "{""max-length-bytes"":1048576}" ^ --apply-to queues |
Политика my-pol гарантирует, что очередь one-meg содержит не более 1MiB данных сообщений. Когда лимит в 1MiB достигнут, самые старые сообщения отбрасываются из головы очереди.
Чтобы определить поведение при переполнении - отбрасывать сообщения из головы или отклонять новые публикации, добавьте ключ overflow к определению политики. Например:
1 2 3 4 5 | rabbitmqctl rabbitmqctl set_policy my-pol "^two-messages$" \ '{"max-length":2, "overflow": "reject-publish"}' \ --apply-to queues |
rabbitmqctl в Windows
1 2 3 | rabbitmqctl.bat set_policy my-pol "^two-messages$" ^ "{""max-length"":2,""overflow"":""reject-publish""}" ^ --apply-to queues |
Политика my-pol гарантирует, что очередь two-messages содержит не более 2 сообщений, и все дополнительные публикации отправляются с ответами basic.nack до тех пор, пока очередь содержит 2 сообщения и подтверждение публикации включено.
Политики также могут быть определены с помощью плагина управления.
Определение максимальной длины очереди с помощью x-аргументов при декларировании
Максимальное количество сообщений можно задать, указав в аргументе объявления очереди x-max-length целое неотрицательное значение.
Максимальную длину в байтах можно задать, задав аргумент объявления очереди x-max-length-bytes целым неотрицательным значением.
Если заданы оба аргумента, то будут применяться оба; какой бы предел не был достигнут первым, он будет применен.
Поведение при переполнении можно задать, указав в аргументе объявления очереди x-overflow строковое значение. Возможные значения: drop-head (по умолчанию), reject-publish или reject-publish-dlx.
В данном примере на Java объявляется очередь с максимальной длиной 10 сообщений:
1 2 3 | Map<String, Object> args = new HashMap<String, Object>(); args.put("x-max-length", 10); channel.queueDeclare("myqueue", false, false, false, false, args); |
Проверка пределов длины очереди
Чтобы проверить эффективные ограничения для очереди, проверьте ее дополнительные аргументы и эффективную политику.
Это можно сделать с помощью инструментов CLI или пользовательского интерфейса управления.
Использование инструментов CLI
rabbitmqctl list_queues можно использовать для отображения необязательных аргументов очереди и политики, применяемой к очереди, если таковая имеется:
1 | rabbitmqctl list_queues name durable arguments policy --formatter=pretty_table --silent |