kafka入门第三篇 生产者消息分区机制原理剖析
1.为什么分区
kafka有主题(Topic)的概念,它是承载真实数据的逻辑容器,而在主题之下还分为若干个分区,也就是说kafka的消息组织方式实际上是三级结构: 主题---分区---消息。主题下的每条消息只会保存在某一个分区中,而不会在多个分区中保存多份。官网上的这张图非常清晰地展示了kafka的三级结构,如下:
其实分区的作用就是提供负载均衡的能力,或者说对数据进行分区的主要原因,就是为了实现系统的高伸缩性。不同的分区能够放置到不同节点机器上,而数据库的读写操作也都是针对分区这个粒度而进行的,这样每个节点的机器都能独立的执行各自分区的读写请求处理。并且,我们还可以通过添加新的节点记起来增加整体系统的吞吐量。
2.都有那些分区策略
所谓的分区策略是决定生产者将消息发送到那个分区的算法。kafka为我们提供了默认的分区策略,同时它也支持你自定义的分区策略。常见的分区策略就那么几种,如下:
- 轮训策略
轮训策略,也称Round-robin策略,即顺序分配。比如下面一个主题有三个分区,那么第一条消息被发送到分区0,第二条消息被发送到分区1,第三条消息被发送到分区2,一次类推,第四条消息又被发送到分区0,就像下面这张图:
如果未指定分区策略那么生产者程序会按照轮训的方式在主题的所有分区中写入消息。
轮训策略是非常有优势的负载均衡表现,它总是能保证消息最大限度的被平均分配到所有分区上,故默认情况下它是最合理的分区策略,也是我们常用的分区策略之一。
- 随机策略
随机策略也称Randomness策略,所谓随机就是我们随机的将消息发送到一个分区上,如下面这张图所示:
先计算出该主题的分区数,然后随机的返回一个小于它的整数。
本质上看随机策略也力求将消息均匀的分配到的所有的分区中,但是从实际表现来看,它的表现是不如轮训策略的。
- 按消息健保序策略
kafka允许为每条消息定义消息建,简称Key。这个Key可以是有着明确业务含义的字符串;也可以用来表征消息元数据。
特别是在kafka不支持时间戳的年代,在一些场景中,工程师们都是将消息创建时间分装进Key里面。一旦消息被定义了key,那么你就可以保证同一个key的所有消息都进入到相同的分区里面,由于每个分区下的消息处理都是有顺序的,故这个策略被称为按消息健保序策略,如下图: