2015-10-02 4 views
0

Работает над проектом C#, в котором используется Кролик. Я нашел то, что мне кажется, как противоречивая информация в документации о том, когда сообщение будет повторно доставлено в результате либо связи или канал умирающих (который один это?)RabbitMq Acks/Republishing

Документов здесь: http://www.rabbitmq.com/semantics.html

, что оно является requeued для доставки, когда канал закрывается

сообщения могут быть возвращены в очередь с использованием AMQP методов, которые показывают параметр (basic.recover снова поставить, basic.reject и basic.nack), или из-за канала закрытие при сохранении непризнанных сообщений. Любой из этих сценариев вызывал сообщения, которые должны быть запрошены в конце очереди для релизов RabbitMQ раньше, чем 2.7.0. Из версии RabbitMQ 2.7.0 сообщения всегда хранятся в очереди в порядке публикации, даже в случае необходимости или закрытия канала.

Но здесь: http://www.rabbitmq.com/tutorials/tutorial-two-dotnet.html

государство: Только когда соединение работника умирает

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

Нет тайм-аутов сообщений; RabbitMQ будет обновлять сообщение только тогда, когда рабочее соединение умирает. Это нормально, даже если обработка сообщения занимает очень и очень длительное время.

Итак, когда действительно происходит доставка? Когда рабочий или канал умирает? Могу ли я Использовать на одном канале, но ACK на другом канале?

В настоящее время я создал класс ChannelManager, который открывает N каналов и сохраняет их в каналах ConcurrentQueue и Queues/Dequeues, поскольку они необходимы, а также гарантирует, что мы никогда не опустимся ниже минимального количества доступных каналов. С помощью этого метода для меня невозможно обеспечить, чтобы Consume и Ack происходили по тому же каналу ...

+2

Я зарегистрировал проблему: https://github.com/rabbitmq/rabbitmq-website/issues/88 –

ответ

3

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

RabbitMQ будет обновлять сообщение, когда потребитель погибнет.

заявив, что этот способ не исключает других законных случаев, но иллюстрирует, что они указывают в этой статье.

...

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

...

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

Соединения, с другой стороны, являются дорогостоящими. откройте одно соединение для каждого экземпляра приложения. затем используйте столько каналов, сколько вам нужно, в этом соединении.