2016-03-22 2 views
1

У меня есть активная очередь, которая будет иметь все сообщения от издателя. Мой потребитель читает эти сообщения и Acks/Nacks в зависимости от результата обработки сообщений.RabbitMQ - Как настроить условный DLX?

while (true) 
{ 
    var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue(); 

    var body = ea.Body; 
    var message = Encoding.UTF8.GetString(body); 

    var processed = ProcessMessage(message) 

    if (processed)       
     channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false); 
    else 
     channel.BasicNack(deliveryTag: ea.DeliveryTag, multiple: false, requeue: true); 
} 

Мои вопросы

  • Является ли установка true для requeue параметра, когда оно правильно голыми?
  • Или нам нужно создать очередную очередь для повтора?
  • Скажем, если я хочу переместить сообщение в DLX после повторной попытки в 10 раз? Как мне это сделать? Это код C# или может быть определено правило в очереди?
  • Как узнать, что сообщение повторяется 10 раз? Предоставляет ли RabbitMQ какой-либо механизм или мне нужно вручную создать объект сообщения, чтобы содержать счетчик повторов?

Спасибо за ваши входы

ответ

1

если вы установите снова поставить на ложь, то она будет идти на любой DeadLetter биржу присвоенной очереди. Истина будет запрашивать сообщение.

То, что я сделал для попыток повторной попытки, - создать Hold Exchange и Queue. Если вы хотите повторить сообщение, верните положительный Ack в очередь, добавьте заголовок RetryAttepmts в сообщение, а затем опубликуйте его на Exchange HoldQueue Exchange с тайм-аутом. Установите «Hold Queue Dead Letter Exchange» на обмен, который отправит сообщение в исходную очередь. Затем проверьте заголовок и NACK, если попытки повтора слишком велики

здесь хороший сайт с подробным описанием процесса http://yuserinterface.com/dev/2013/01/08/how-to-schedule-delay-messages-with-rabbitmq-using-a-dead-letter-exchange/

+0

Да, я также рассматриваю ту же статью. спасибо – techspider

+0

Если у меня много запросов в WorkExchange в образце, как я могу обеспечить его только для WorkQueue1, но не для WorkQueue2? Параметр использует x-dead-letter-exchange, но не имеет очереди или ключа маршрутизации. – techspider

+1

В этом случае вам понадобится дополнительный Exchange – Franklin

3

Начиная с выпуском 3.5.2, RabbitMQ автоматически добавляет заголовок к мертвым-letterred сообщений с информациями такие как:

  • очередь (ов), который видел сообщение
  • причины (ы) он был мертв-letterred
  • количество раз, он был мертв-letterred
  • временные метки

Посмотрите на "Dead-Lettered Messages" section near the end of the DLX documentation для более подробной информации.

Если вы используете более раннюю версию RabbitMQ, тогда решение @ Franklin должно работать.

+0

Спасибо, я прочитал эту статью; На вашем сайте есть образец .Net, на который я могу посмотреть? Я немного смущен теорией :) – techspider

+0

Хмм, нет, мне неизвестны примеры внедрения на веб-сайте. Посмотрев на клиентскую документацию .NET, я предполагаю, что вы сначала получите [свойства сообщения] (http://www.rabbitmq.com/releases/rabbitmq-dotnet-client/v3.6.1/rabbitmq-dotnet-client-3.6.1-client-htmldoc/html/type-RabbitMQ.Client.IBasicProperties.html), тогда вы получаете доступ к свойству «Заголовки». «Заголовки» - это словарь, а ключ, который вас интересует, должен быть назван «x-death». –

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