Последовательная публикация RabbitMQ с ACK и NACK (синхронизация обработки и отклонения) Синхронная - PullRequest
1 голос
/ 18 июня 2019
Console.WriteLine($"Publishing to Default EXG & queue: {result.QueueName}");

Todo: процесс создания повторных попыток, повторной публикации и подтверждения.

                    IBasicProperties messageProps = _channel.CreateBasicProperties();
                    messageProps.Persistent = true;

//Handle Acks

                    _channel.BasicAcks += _channel_BasicAcks;
                    _channel.ConfirmSelect();
//Publish                    

                    byte[] body = Encoding.UTF8.GetBytes(messageToPublish);

                    _channel.QueueBind(
                        queueName,
                        exchangeName,
                        routingKey,
                        null
                        );
                    _channel.BasicPublish
                    (   exchange: exchangeName,
                        routingKey: routingKey,
                        basicProperties: messageProps,
                        body: body);

//Wait for the Confirmations      

                    _channel.ConfirmSelect();
                    _channel.WaitForConfirmsOrDie(10000);

Событие

_channel_BasicAcks (Отправитель объекта, EventArgs e)

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

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

Синхроупаковщик в Async Publish - это решение, которое я придумал, оно работает, хотя и не самое лучшее! Есть ли более эффективное решение вместо проб и ошибок с тайм-аутами!

1 Ответ

1 голос
/ 18 июня 2019

Для жестких требований повторной попытки отдельных сообщений сразу после nack в массовой публикации, как сделать это строго синхронным.

Не ждите синхронно acks!

Сохраняйте сообщения на стороне клиента, пока вы не получите для него асинхронный ack / nack, затем сделайте что-нибудь на основе этого ответа.Укажите определенное количество «ожидающих» подтверждений, которые являются приемлемыми и не публикуются, если этот предел достигнут.Укажите временное ограничение, которое является приемлемым для получения подтверждения / отказа, и если этот предел превышен, сделайте что-нибудь в своем приложении, чтобы справиться с ним.


ПРИМЕЧАНИЕ: команда RabbitMQ отслеживает список рассылки rabbitmq-users и только иногда отвечает на вопросы в StackOverflow.

...