Kafka生产者消息分区机制

210 阅读2分钟

1.1为什么分区

1.kafka有主题(Topic)的概念,他是承载真实数据的逻辑容器,主题之下还分为若干个分区,Kafka消息组织方式实际上是三级结构:主题-分区-消息。主题下的每条消息只会在某一个分区中,而不会在多个分区中被保存多份。

2.Kafka这样设计,使用分区的作用就是提供负载均衡的能力,对数据进行分区的主要目的就是为了实现系统的高伸缩性(Scalability)。不同的分区能够放在不同的节点的机器上,而数据的读写操作也都是针对分区这个粒度进行的,每个节点的机器都能独立地执行各自分区读写请求。我们还可以通过增加节点来提升整体系统的吞吐量。

3.Kafka的分区设计,还可以实现业务级别的消息顺序的问题。

1.2分区有哪些策略?

1.所谓的分区策略是指决定生产者将消息发送到那个分区的算法。Kafka提供了默认的分区策略是轮询,同时kafka也支持用户自己制定

2.常见的分区策略有轮询 也称为Round-robin策略,即顺序分配。轮询的优点是有着优秀的负载均衡的表现。

3.常见策略还有随机策略,虽然也是追求负载均衡,但总体表现差于轮询。

4.还要一种是为每条消息配置一个key,按消息的key来存。 A:Kafka允许为每条消息指定一个key。一旦指定了key ,就可以将相同的key存入相同的分区中,而且每个分区下的消息都是有序的。 B:key的作用很大,可以是一个有着明确业务含义的字符串,也可以是用来表征消息的元数据。

5.其他的分区策略:基于地理位置的分区。

简单例子

在做hdfs系统日志分析,对于不同的block的实现消息的顺序问题。

1.单分区

对flume采集的日志传入kafka进行单分区,所有的消息进入一个分区,保证了全局的顺序性,虽然实现了顺序关系,但丧失了kafka多分区的带来的高吞吐量和负载均衡。

2.引入key值分区

由于只需要保证不同的block的消息进行有序,其做法为将block的表示数据取来放入key中。将相同的key(block)放入同一分区,保证有序。

总结

分区是实现负载均衡,系统伸缩性,进而实现Kafka高吞吐量的重要机制。在搭建时就应当仔细的规划生产者端的分区策略,避免数据倾斜,使得某些分区成为性能瓶颈,这样极易引发下游消费数据的性能下降。