Kafka 通过对消费方进行分组管理来支持消息一写多读。
我画的图:工具(processon在线画图)
这个 Topic 分为 4 个 Partition,就是图中的 P1到 P4,上部的生产方根据规则选择一个 Partition 进行写入,默认规则是轮询策略。也可以由生产方指定 Partition 或者指定 key 来根据 Hash 值选择 Partition。
消息的发送有三种方式:同步、异步以及 oneway。
- 同步模式下后台线程中发送消息时同步获取结果,这也是默认模式。
- 异步的模式允许生产者批量发送数据,可以极大的提高性能,但是会增加丢失数据的风险。
- oneway 模式只发送消息不需要返回发送结果,消息可靠性最低,但是低延迟、高吞吐,适用于对可靠性要求不高的场景。
来看消息的消费,Consumer 按照 Group 来消费消息,Topic 中的每一条消息可以被多个 Consumer Group 消费,如上图中的 GroupA 和 GroupB。
Kafka 确保每个 Partition 在一个 Group 中只能由一个 Consumer 消费。
Kafka 通过 Group Coordinator 来管理 Consumer 实际负责消费哪个 Partition,默认支持 Range 和轮询分配。
Kafka 在 ZK 中保存了每个 Topic 中每个 Partition 在不同 Group 的消费偏移量 offset,通过更新偏移量保证每条消息都被消费。
注意:用多线程来读取消息时,一个线程相当于一个 Consumer 实例。当 Consumer 的数量大于分区的数量的时候,有的Consumer 线程会读取不到数据。