Kafka 核心技术与实战学习笔记(九)生产者消息分区
一.为什么分区kafka主题(Topic):是承载真是数据的逻辑容器主题之下由若干分区,kafka的消息组织方式是三级结构:主题-分区-消息;主题下的每条消息只会保存在某一个分区中,不会再多个分区中被保存多份。kafka为甚使用分区的概念而不是直接使用多个主题分区的作用是提供负载均衡的能力,实现数据的高伸缩性(Scalability)不同分区能够被放置在不太节点的机器上,而数据读写操作也是针对分区
·
一.为什么分区
- kafka主题(Topic):是承载真是数据的逻辑容器
- 主题之下由若干分区,kafka的消息组织方式是三级结构:主题-分区-消息;
- 主题下的每条消息只会保存在某一个分区中,不会再多个分区中被保存多份。
kafka为甚使用分区的概念而不是直接使用多个主题
- 分区的作用是提供负载均衡的能力,实现数据的高伸缩性(Scalability)
- 不同分区能够被放置在不太节点的机器上,而数据读写操作也是针对分区这个粒度进行的。
- 每个节点的机器都能独立的执行各个分区的读写请求。并且可以通过增加新的节点机器增加整体系统的吞吐量。
二.kafka的分区策略
决定生产者将消息发送到哪个分区的算法。
轮询策略
- Round-robin策略,即顺序分配。
轮询策略是kafka Java生产者API默认提供的分区策略,如果未指定其他策略,将均匀码放。
缺点:不能保证消息顺序性。
-
轮询策略有非常优秀的负载均衡表现,他总能保证消息最大限度的被平均分配到所有分区上,故默认情况下他是最合理的分区策略,也是我们最常见的分区策略之一。
随机策略
Randomness策略,随机策略是我们随意的将消息放置在任意一个分区上。
按消息键保顺策略
- kafka允许每条消息定义消息键,简称key
- key可以是有明确业务含义的字符串,比如客户代码,部门编号,业务ID等
- 一旦消息被定义了key,那么可以保证同一key的所有消息都进入到相同的分区里;
- 由于每个 分区下的消息处理都是有顺序的,这个策略被称为按消息键保顺策略
kafka默认分区策略实际上同时实现了两种策略:
- 指定了key,默认实现按消息键保序策略;
- 没有指定key,使用轮询策略;
三.案例:
如何实现消息的顺序性
解决方案一:不建议使用
- kafka主题设置分区:1个分区。
- 所有的消息都在一个分区里读写,因此保证了全局的顺序性。
- 这样虽然实现了因果关系的顺序性,但是丧失了kafka多分区带来的高吞吐和负载均衡的优势。
优化后的方案
- 根据业务在消息体中封装固定的标志位,为标志位设定专门的分区策略,保证同一标志位的所有消息都发送到同一分区。
- 保证分区的消息顺序,同时支持高吞吐和负载均衡。
也可以自定义实现分区策略。
更多推荐
已为社区贡献8条内容
所有评论(0)