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