如果我想使用 EasyNetQ 保留消息顺序,是否应避免使用异步方法?

Do I avoid using Async methods if I want to preserve message order with EasyNetQ?

我在 EasynetQ 的文档中看到过这个

EasyNetQ 为每个 IBus 实例实现一个消费者线程,因此如果您使用标准的非异步订阅方法,您的消息处理程序将按照 RabbitMQ 传递消息的相同顺序同步触发。不需要实施锁定。如果您使用异步订阅,处理程序仍将按顺序调用,但当然它们可能会乱序 ACK,具体取决于您如何实现异步处理程序。

现在,如果我想保留消息顺序,这是否意味着我应该避免在订阅者中使用异步方法(如 httpClient.SendAsync() 或方法的任何异步版本)?

也就是说我有message1,message2,我想先处理message1,再处理message2。但是,如果我的订阅者使用 async/await 方法,那么 message1 和 message2 可能会乱序处理。

你是对的。此外,您可以将预取计数设置为 1,这会在使用异步时一次获取 1 条消息,但会增加很多 mem/cpu 开销和性能损失。

一般来说,我会建议将您的应用程序设计为不依赖于消息顺序,因为它会在很多方面损害您的可伸缩性。它可能会以其他方式回来咬你。