带有ACK和NACK(拒绝和Nack处理)同步的RabbitMQ顺序发布

时间:2019-06-18 11:44:08

标签: c# async-await rabbitmq synchronization fault-tolerance

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)

现在正在从publish方法(async)的范围外部调用

,而不是同步获取响应。

对于在批量分发后立即重试单个消息的严格要求,我将如何使其严格同步

将包装程序同步到异步发布方法是我想出的解决方案,尽管它不是最好的,但它可以工作!是否有更好的性能解决方案,而不必尝试超时尝试!

1 个答案:

答案 0 :(得分:1)

  

对于重试单个消息的严格要求   大量发布后立即发布,我如何严格执行此操作   同步。

不要同步等待ack!

在客户端保存消息,直到收到异步的ack / nack,然后根据该响应执行某些操作。指定一定数量的“未完成”确认,如果达到该限制,则不会发布。指定一个可以接受确认/否定的时间限制,如果超过了该限制,请在应用程序中进行一些处理。


注意: RabbitMQ团队监视rabbitmq-users mailing list,并且有时仅在StackOverflow上回答问题。