- 生产端在发送消息时,除了保证消息的有序性,还要始终保证单条消息即是全量信息(也就是“将有先后顺序的几条消息组合成一条消息”统一进行发送)。
- 只创建一个队列,生产者和消费者都只设置一个实例。
- 如果有A类消息存在A1、A2、A3的有序性,有B类消息存在B1、B2、B3的有序性,则生产端可以使用两个队列分开发送这两类消息,消费端可以定义两个消费者分开消费这两个队列。
- 一般业务只需要考虑局部有序即可,例如对于用户秒杀的订单数据,多个用户之间的订单不需要保证有序,只需要保证单个用户的订单数据有序即可。此时用户数量是巨大的,不可能采用上面的方法为每个用户都创建一个队列,此时可以采用下面的方式解决。
- 对于订单场景,在发送端我们使用账户ID作为key,采用一致性哈希算法(一致性 hash 算法本质上也是一种取模算法)计算出队列编号,指定队列发送消息。一致性哈希算法可以保证相同的key值总是发送到同一个队列中,这样保证相同key的消息是严格有序的,如果不考虑队列扩容,也可以用队列数量取模的简单方法来计算队列编号。消费者可以定义N个消费者分开消费N个队列。