【问题标题】:RabbitMQ C# Client - can producer receive event when consumer acknowledges the messageRabbitMQ C# 客户端 - 当消费者确认消息时,生产者可以接收事件
【发布时间】:2019-07-23 09:42:16
【问题描述】:

是否可以配置 RabbitMQ,以便在消费者手动确认消息时通知消费者。

我正在使用 C# RabbitMQ 客户端。我已将我的模型/通道设置为 ConsumeSelect,但是在消费者使用消息之前我收到了 BasicAcks 事件。我假设它在被路由到队列时被确认。

我希望能够在消息被消费者确认后接收事件。

我的交换和队列设置如下

model.ExchangeDeclare(exchange: "myExchange", type: "topic");
                model.QueueDeclare(queue: "myQueue", durable: false,
                                        exclusive: false,
                                        autoDelete: false,
                                        arguments: null);
                model.QueueBind(queue: "myQueue",
                    exchange: "myExchange",
                    routingKey: "myRoutingKey"); 

生产者设置如下

var factory = new ConnectionFactory()
{

    HostName = ConfigurationManager.AppSettings["RabbitHost"],
    UserName = ConfigurationManager.AppSettings["RabbitUserName"],
    Password = ConfigurationManager.AppSettings["RabbitPassword"],
    Port = Convert.ToInt32(ConfigurationManager.AppSettings["RabbitPort"]),
};
var connection = factory.CreateConnection();
var model = connection.CreateModel();
model.ConfirmSelect();
model.CallbackException += (s, e) =>
{
    Console.WriteLine("Exception [{0}] [{1}] [{2}]", e.Detail, e.Exception.Message, e.Exception.StackTrace);
};

model.BasicReturn += (s, e) =>
{
    var message = Encoding.UTF8.GetString(e.Body);
    Console.WriteLine("Message returned [{0}] [{1}] [{2}]", message, e.ReplyCode, e.ReplyText);
};

model.BasicAcks += (s, e) =>
{
    Console.WriteLine("Message acked [delivery tag = {0}] [multiple = {1}]", e.DeliveryTag, e.Multiple);
};

我的消息是通过以下方式发送的

channel.BasicPublish(exchange: "myExchange",
                    routingKey: "myRoutingKey",
                    mandatory: true,
                    basicProperties: null,
                    body: "my message");

【问题讨论】:

  • 警告说我们必须使用自动确认,这对我们来说不是一个选项。我真正的目标是确保我不会丢失消息。我意识到即使使用集群、镜像队列和持久消息,在 RabbitMQ 中仍然有可能丢失消息。所以我现在正在调查这样一种情况,我可以丢失一条消息,但我可以检测到它已经丢失。在这种情况下,我会检测到它已经丢失,因为我不会收到确认。但是,这仅在我收到消费者确认而不是确认已成功添加到队列时才有效。

标签: c# notifications rabbitmq consumer


【解决方案1】:

我现在明白我可以实现不丢失消息的目标,起初这对我来说并不明显。

如果配置如下

消息是持久的 队列是持久的 消费者确认已启用

这确保了生产者在主队列和所有镜像队列都接受了消息时会收到一个事件,这确保了数据已经持久化到磁盘。这可确保它们保持同步。

唯一的问题是,如果你的 master 和 mirror 关闭并快速连续恢复,那么消息仍然可能丢失

【讨论】:

    猜你喜欢
    • 2013-02-22
    • 2015-09-18
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多