全排序(Total Ordering)
有时候,在 Topic 模式下,保证所有消费者消费消息的顺序和生产者生产消息的顺序一致是非常有用的。通常,我们可以认为它们是保持一致的,但是,当有多个线程或者是异步处理时,消费者和生产者就不能保证顺序一致了。
例如:生产者 P 和 Q,P 发送消息 P1,P2,P3 同时 Q 发送消息 Q1,Q2。现在有两个消费者,它们可能消费消息的顺序如下:
Consumer1:P1 P2 Q1 P3 Q2 Consumer2:P1 Q1 Q2 P2 P3
生产者发送消息是按顺序的,但是两个消费者消费消息的顺序不一致。
使用全排序
目的主题的全排序(Total Ordering)可以保证每个消费者消费消息的顺序是一致的。当你希望实现事务时,全排序是非常有用的;但是由于使用了更多的同步,会导致性能略有下降。使用全排序,消费者消费顺序可能如下:
Consumer1:P1 P2 Q1 P3 Q2 Consumer2: P1 P2 Q1 P3 Q2
看以看到,消费者消费顺序是完全一致的。
配置全排序
为每个目的主题开启全排序,可以为它们加上<strictOrderDispatchPolicy/>,如下所示:
">