C# RabbitMQ顺序发布,ACK和Nack(拒绝和Nack处理)同步

C# RabbitMQ顺序发布,ACK和Nack(拒绝和Nack处理)同步,c#,async-await,rabbitmq,synchronization,fault-tolerance,C#,Async Await,Rabbitmq,Synchronization,Fault Tolerance,Todo:构建重试、重新发布和确认工作流。 Console.WriteLine($"Publishing to Default EXG & queue: {result.QueueName}"); 事件 _频道\u BasicAcks(对象发送方,事件参数e) 现在从发布方法(异步)的范围外部调用,而不是同步获取响应 对于在批量发布nack后立即重试单个消息的精装要求,我如何使其严格同步 Sync Wrapper to Async Publish方法是我提出的解决方案,虽然它不是最好的

Todo:构建重试、重新发布和确认工作流。

Console.WriteLine($"Publishing to Default EXG & queue: {result.QueueName}");
事件

_频道\u BasicAcks(对象发送方,事件参数e)

现在从发布方法(异步)的范围外部调用,而不是同步获取响应

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

Sync Wrapper to Async Publish方法是我提出的解决方案,虽然它不是最好的解决方案,但仍然有效!是否有一个性能更好的解决方案,而不必在超时时反复尝试

对于重试单个消息的硬绑定要求 在批量发布nack之后,我该如何严格地做到这一点 同步的

不要同步等待确认

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


注意:RabbitMQ团队监控
RabbitMQ用户
,并且有时只回答有关StackOverflow的问题

                    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);