Если флаг autoack
не установлен, в случае сбоя приложения во время обработки сообщения все полученные сообщения будут потеряны. Если такая ситуация встречается довольно редко и потеря сообщения является подходящей опцией в вашем приложении (например, но не ограничиваясь этим, обработка журналов), вы можете отключить автоупаковку.
И да, для autoack
неустановленного значения требуется более простая логика брокера, поэтому он использует меньше ресурсов.
Что касается prefetch count
(и prefetch size
), эти параметры сообщают брокеру, насколько велика может быть полезная нагрузка, которая отправляется клиенту заранее в одно сообщение. Обычно он используется для экономии времени на сетевых операциях при ожидании нового сообщения. Когда prefetch size
используется, клиент получит одно или несколько сообщений с общим размером, равным или меньшим предварительно установленному размеру предварительной обработки (и / или счетчику, который меньше).
Применяются оба правила prefetch count
и prefetch size
, если они установлены. Когда один из них установлен в ноль (не установлен), он не будет применяться.
Самая важная вещь: предварительная выборка определяет поведение для отправки сообщений перед тем, как клиент распаковал еще одно сообщение.
Вместе эти два параметра дают примерно следующее:
Предварительная загрузка с ограничением количества сообщений и предварительная отправка сообщений:
Условия:
- Очередь: N сообщений x 1 КБ
- Предварительная выборка:
prefetch-size=5kb, prefetch-count=4
- Автоупаковка:
off
Рабочий процесс:
- Брокер отправляет клиенту 4 сообщения (ограничено
prefetch-count=4
). 4 сообщения будут помечены как неподтвержденные и удалены из очереди (поэтому они не будут доставлены другим клиентам).
- Клиент подтверждает 1 сообщение.
- Брокер имеет -1 сообщение без упаковки (удалите это сообщение) и отправляет еще 1 сообщение клиенту (+1 не подтверждено, -1 из очереди, в то время как у клиента уже есть 3 сообщения без подтверждения).
- Клиент подтверждает оставшиеся 3 сообщения + новое доставленное.
- Брокер имеет -4 сообщения без подтверждения и отправляет 4 сообщения снова, +4 без подтверждения, -4 из очереди.
- Клиент подтверждает 1 сообщение и терпит неудачу.
- Брокер будет не подтвержден -1, а затем переместит остальных в очередь обратно, так что -3 не подтверждено и +3 очереди, чтобы они могли быть снова доставлены этому или другому клиенту.
Предварительная загрузка при больших сообщениях.
Условия:
- Очередь: 1 сообщение x 5 КБ, N сообщений x 1 КБ
- Предварительная выборка:
prefetch-size=5kb, prefetch-count=2
- Автоупаковка:
off
Рабочий процесс:
- Брокер отправляет 1 сообщение (ограничено
prefetch-size=5kb
) клиенту, и это сообщение помечается как неподтвержденное.
- Клиент подтверждает 1 сообщение.
- У брокера -1 сообщение не подтверждено, отправьте 2 сообщения еще раз (ограничено
prefetch-count=2
, обратите внимание, что только первое сообщение было 5 КБ, остальные - 1 КБ), и эти сообщения помечены как неподтвержденные.
- Клиент подтверждает 1 сообщение и терпит неудачу.
- Брокер переместит подтвержденное сообщение из очереди сообщений, а остальные неподтвержденные сообщения снова будут перемещены в очередь, к которой они принадлежат, так что они могут быть снова доставлены этому или другому клиенту.
С автоматическим подтверждением:
Условия:
- Очередь: N сообщений x 1 КБ
- Предварительная выборка:
prefetch-size=5kb, prefetch-count=10
- Автоупаковка:
on
Рабочий процесс:
- Хотя и
prefetch-size
, и prefetch-count
игнорируются, если для no-ack
установлено значение true (именно так функция автоматического подтверждения вызывается в RabbitMQ и в документах AMQP), сообщения будут отправляться клиенту одно за другим и удаляться из очереди после успешной отправки.
Обратите внимание, что AMQP имеет асинхронную архитектуру, поэтому при определенных условиях два клиента МОГУТ получать одно сообщение одновременно. Также неподтвержденное сообщение МОЖЕТ быть доставлено тому же клиенту обратно (особенно, если у вас один клиент).
Также посмотрите prefetch-size
и официальная документация prefetch-count
и немного поэкспериментируйте с этими вариантами.
P.S .: autoack
в основном no-ack
флаг AMQP установлен на true
.
person
pinepain
schedule
09.02.2014