You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

15 lines
1.5 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

针对消息有序的业务需求,还分为全局有序和局部有序。
- 全局有序一个Topic下的所有消息都需要按照生产顺序消费。
- 局部有序一个Topic下的消息只需要满足同一业务字段的要按照生产顺序消费。例如Topic消息是订单的流水表包含订单orderId业务要求同一个orderId的消息需要按照生产顺序进行消费。
# 一、全局有序
由于Kafka的一个Topic可以分为了多个PartitionProducer发送消息的时候是分散在不同 Partition的。当Producer按顺序发消息给Broker但进入Kafka之后这些消息就不一定进到哪个Partition会导致顺序是乱的。
因此要满足全局有序需要1个Topic只能对应1个Partition开启幂等而且对应的consumer也要使用单线程或者保证消费顺序的线程模型否则会出现下图所示消费端造成的消费乱序。
# 二、局部有序
要满足局部有序只需要在发消息的时候指定Partition KeyKafka对其进行Hash计算根据计算结果决定放入哪个Partition。这样Partition Key相同的消息会放在同一个Partition。此时Partition的数量仍然可以设置多个提升Topic的整体吞吐量。
如下图所示在不增加partition数量的情况下想提高消费速度可以考虑再次hash唯一标识例如订单orderId到不同的线程上多个消费者线程并发处理消息依旧可以保证局部有序
![[Pasted image 20231127100545.png]]