【发布时间】:2019-04-25 12:14:14
【问题描述】:
我有一个将事件发布到 RabbitMQ 的 Java 应用程序。它有一个非常重要的特性:必须始终保持消息顺序。消费者可以处理重复,但是当消息2在消息1之前入队时它不能处理,可以这么说。
我最近读了很多关于 RabbitMQ 的文章,我觉得只有解决方案:将频道设置为confirm 模式(https://www.rabbitmq.com/confirms.html - 基本上,它强制代理确认发布)并发布逐个。我的意思是,消息 2 仅在 RabbitMQ 确认(通过异步 ACK 响应)消息 1 实际上被良好接收和持久化后才发布。
我在概念实现中尝试过这个,虽然效果很好,但速度非常慢,一点也不夸张。这是有道理的:毕竟,我们现在将消息速率限制为一次 1 条消息。
所以这引出了我的问题:是否有其他更高效的方法来确保始终保留消息排序(在 RabbitMQ 中或通过不同的方法)?
虽然我关心的是 RabbitMQ,但我相信这个问题可能适用于任何类型的异步消息队列服务。
【问题讨论】: