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