我正在遇到我的rabbitmq客户端的赛车状况问题。我的服务有多个实例侦听单个队列,将收到的消息存储到数据库中。
当它们全部重新启动时,我有时会看到消息被重新传递并存储在数据库中两次。这通常通过检查相关性是否已经存储在数据库中来在客户端处理。这种工作有99.9%的时间(我每天处理5百万条消息,每天发生一次或两次)。
正如我所说,我怀疑赛车条件是对此负责的。我想我的第一条消息仍在处理中时,我再次收到该消息。因此,当我检查我没有看到它存储在数据库中,并最终存储两次。
我不应该认为这不是一个问题,但一直困扰着我,因为我无法解释会发生什么。
我怀疑当我重新启动服务时会发生这种情况。我想我从队列中断开连接,而我仍在处理消息,触发rabbitmq再次重新发送到另一个尚未关闭的实例。
我想做的是当我停止服务时
现在我首先取消注册收到的活动
_consumerServer.Received -= MessageReceived;
然后我正在处理频道和服务器
if (_channel != null)
{
_channel.Close();
_channel.Dispose();
}
if (_connectionServer != null)
{
_connectionServer.Close();
_connectionServer.Dispose();
}
答案 0 :(得分:1)
RabbitMQ团队监控this mailing list,有时只回答StackOverflow上的问题。
您应该正确处理重新传递,而不是尝试关闭消费者以便重新传递消息。检查并处理在消息上设置redelivered
标志的情况,并采取适当的措施。您还应该尝试以存储操作是幂等的方式存储您的消息 - 即它可以多次发生,并且您的数据库中只有一条记录。
请参阅团队在此提供的指南: