# kafka分区数的确定
## 1、kafka分区
* Kafka可以将主题划分为多个分区(Partition),会根据分区规则选择把消息存储到哪个分区中,只要如果分区规则设置的合理,那么所有的消息将会被均匀的分布到不同的分区中,这样就实现了负载均衡和水平扩展。
## 2、各角色对分区的操作
* kafka的生产者和消费者都可以多线程地并行操作,而每个线程处理的是一个分区的数据。因此分区实际上是调优Kafka并行度的最小单元。
* 对于producer而言,它实际上是用多个线程并发地向不同分区所在的broker发起Socket连接同时给这些分区发送消息;
* 而consumer呢,同一个消费组内的所有consumer线程都被指定topic的某一个分区进行消费;
* 如果一个topic分区越多,理论上整个集群所能达到的吞吐量就越大。
但是分区是不是越多越好呢?显然不是,因为没个分区都有自己的资源占用开销,分区多了,资源占用同样也多了,反而更占资源了。
## 3、分区的几个限制地方
* 分区数,限制了consumer的并行度,即限制了并行consumer消息的线程数不能大于分区数;
* 分区数,限制了producer发送消息是指定的分区(如创建topic时分区设置为1,producer发送消息时通过自定义的分区方法指定分区为2或以上的数都会出错的);
## 4、分区与偏移量(Offset)、消费线程、消费者组(group.id)的关系
* 一组(类)消息通常由某个topic来归类,我们可以把这组消息"分发"给若干个分区(partition),每个分区的消息各不相同;
* 每个分区都维护着他自己的偏移量(Offset),记录着该分区的消息此时被消费的位置;
* 一个消费线程可以对应若干个分区,但一个分区只能被具体某一个消费线程消费;
* group.id用于标记某一个消费组,每一个消费组都会被记录他在某一个分区的Offset,即不同consumer group针对同一个分区,都有"各自"的偏移量。
* kafka中的topic在消费时,整体上是无序的,而每个分区的内部消费是有顺序的,如果想要全局有序,可以设置一个分区,但是这样的话丢失了很多的性能。
## 5、分区简单总结
* 分区数限制了上下游的线程数,可以理解整体的并行度。
* 分区数是为了实现负载均衡。
* 分区设计需要考虑各角色的资源占用,副本数,文件句柄数等等
## 6、如何合理的设置分区数
* 一个topic分区的个数不是随意来来设置的,需要有些衡量的指标。
* 可以使用如下方法进行测试:
*(1)、创建只有一个分区数的topic
*(2)、然后测试这个topic的producer和consumer吞吐量
*(3)、假设它们的值分别为Tp和Tc,单位可以是MB/s
*(4)、然后假设总的目标吞吐量是Tt,那么分区数 = Tt / max(Tp, Tc)
* 注意:
* Tp表示producer的吞吐量。测试producer通常是很容易的,因为它的逻辑非常简单,就是直接发送消息到Kafka就好了。Tp=10m
* Tc表示consumer的吞吐量。测试Tc通常与应用的关系更大, 因为Tc的值取决于你拿到消息之后执行什么操作,因此Tc的测试通常也要麻烦一些。Tc=5m
* 总的目标吞吐量是Tt,可以理解为说业务数据每秒实际产生的数据量 100M
*