如何与rabbitmq队列

时间:2018-02-09 08:48:33

标签: c# rabbitmq windows-services

我正在遇到我的rabbitmq客户端的赛车状况问题。我的服务有多个实例侦听单个队列,将收到的消息存储到数据库中。

当它们全部重新启动时,我有时会看到消息被重新传递并存储在数据库中两次。这通常通过检查相关性是否已经存储在数据库中来在客户端处理。这种工作有99.9%的时间(我每天处理5百万条消息,每天发生一次或两次)。

正如我所说,我怀疑赛车条件是对此负责的。我想我的第一条消息仍在处理中时,我再次收到该消息。因此,当我检查我没有看到它存储在数据库中,并最终存储两次。

我不应该认为这不是一个问题,但一直困扰着我,因为我无法解释会发生什么。

我怀疑当我重新启动服务时会发生这种情况。我想我从队列中断开连接,而我仍在处理消息,触发rabbitmq再次重新发送到另一个尚未关闭的实例。

我想做的是当我停止服务时

  • 告诉rabbitmq我不想再接收消息
  • 等待所有当前正在处理的消息完成
  • 发送acks / nacks
  • 关闭

现在我首先取消注册收到的活动

_consumerServer.Received -= MessageReceived;

然后我正在处理频道和服务器

        if (_channel != null)
        {
            _channel.Close();
            _channel.Dispose();
        }

        if (_connectionServer != null)
        {
            _connectionServer.Close();
            _connectionServer.Dispose();
        }

1 个答案:

答案 0 :(得分:1)

RabbitMQ团队监控this mailing list,有时只回答StackOverflow上的问题。

您应该正确处理重新传递,而不是尝试关闭消费者以便重新传递消息。检查并处理在消息上设置redelivered标志的情况,并采取适当的措施。您还应该尝试以存储操作是幂等的方式存储您的消息 - 即它可以多次发生,并且您的数据库中只有一条记录。

请参阅团队在此提供的指南:

https://www.rabbitmq.com/reliability.html#consumer