kafka消息分区机制原理

背景

kafka如何支撑海量消息的集中写入?java

答案就是消息分区。node

核心思想是:负载均衡,采用合适的分区策略把消息写到不一样的broker上的分区中;程序员

其它的产品中有相似的思想。算法

好比monogodb, es 里面叫作 shard;   hbase叫region,  cassdra叫vnode;apache

消息的三层结构

以下图:编程

即  topic -> partition -> message ; 负载均衡

image.png

topic是逻辑上的消息容器;dom

partition实际承载消息,分布在不一样的kafka的broke上;性能

message即具体的消息。学习

分区策略

round-robin轮询

image.png

消息按照分区挨个的写。

randomness随机分区

随机的找一个分区写入,代码以下:

List<PartitionInfo> partitions = cluster.partitionsForTopic(topic);
return ThreadLocalRandom.current().nextInt(partitions.size());

image.png

key

相同的key的消息写到固定的分区中

image.png

自定义分区

必须完成两步:

1,自定义分区实现类,须要实现org.apache.kafka.clients.producer.Partitioner接口。

主要是实现下面的方法:

int partition(String topic, Object key, byte[] keyBytes, 
              Object value, byte[] valueBytes, Cluster cluster);

好比按照区域分区。

List<PartitionInfo> partitions = cluster.partitionsForTopic(topic);
return partitions.stream().filter(p -> isSouth(p.leader().host()))
    .map(PartitionInfo::partition).findAny().get();

2,显示配置生产者端的参数partitioner.class为具体的类

系统默认:若是消息有key,按照key分区策略,不然按照轮询策略。

小结

kafka的分区实现消息的高吞吐量的主要依托,主要是实现了写的负载均衡。能够指定各类负载均衡算法。
负载均衡算法很是重要,须要极力避免消息分区不均的状况,可能给消费者带来性能瓶颈。

小结以下:

image.png

原创不易,点赞关注支持一下吧!转载请注明出处,让咱们互通有无,共同进步,欢迎沟通交流。
我会持续分享Java软件编程知识和程序员发展职业之路,欢迎关注,我整理了这些年编程学习的各类资源,关注公众号‘李福春持续输出’,发送'学习资料'分享给你!
李福春持续输出公众号二维码
相关文章
相关标签/搜索