【问题标题】:MassTransit consumers didn't acknowledge some messagesMassTransit 消费者未确认某些消息
【发布时间】:2021-07-08 09:44:21
【问题描述】:

我对消费者的一些奇怪行为有疑问。

最近我们在生产环境中遇到了奇怪的情况。两个不同微服务上的两个消费者被一些消息卡住了。第一个持有来自 rabbitMQ 队列的 20 条消息,第二个持有 2 条消息,他们没有处理它们。这些消息在 RabbitMQ 中显示为 Unacked 两天。就在这两个微服务重新启动时,它们回到了就绪状态。当消费者接收这些消息时,整个程序每小时处理数千条消息,所以基本上我们的 Saga 和所有消费者都在工作。当这些消息回到就绪状态时,它们会在一秒钟后被处理,所以我认为它们没有问题。

消息由 Saga 发布到 Exchange,除了这两个卡住的消费者之外,我们还有 EventLogger 消费者订阅了所有消息,这个 EventLogger 正常处理了这 22 条消息,没有任何问题(来自他自己的队列)。此外,我们已将 Application Insights 连接到消费者,并且没有关于这两个消费者接收这 22 条消息的信息(有关于由 EventLogger 接收的信息)。

前几天我们在测试环境中遇到了同样的问题。

最近我们将项目中的 MassTransit 版本从 6.2.0 版本更新到 7.1.6 版本,在此之前我们没有注意到消费者有任何类似的问题,但这可能只是巧合。我们还有重试、重新发送、断路器和内存发件箱机制,但我认为它们没有问题,因为消费者甚至没有开始处理这 22 条消息。

你有什么建议可以发生在这个消费者身上吗?

【问题讨论】:

    标签: masstransit


    【解决方案1】:

    通常,当消息通过 RabbitMQ 传递到 MassTransit 后,消费者甚至没有开始消费消息时,这可能是从容器中解析消费者的问题,例如对另一个支持服务(数据库、日志服务器、文件、网络连接、设备等)。

    消息在代理上仍未得到确认,因为消费者的传输/交付机制正在等待资源变得可用。如果该时间段的日志中没有任何内容表明资源存在问题,则很难知道是什么阻止了这些消息被使用。一旦服务重新启动,它们最终被消耗掉的事实似乎表明消息内容本身是好的。

    监控消息消耗的缺乏(以及可能相关的队列深度增加)将表明情况已经发生。如果再次发生,我会增加日志记录详细级别,以查看问题是否再次发生,然后可以识别。

    【讨论】: