阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

kafka消息分区机制原理

302次阅读
没有评论

共计 983 个字符,预计需要花费 3 分钟才能阅读完成。

一、背景

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

答案就是消息分区。

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

其它的产品中有类似的思想。

比如 monogodb, es 里面叫做 shard; hbase 叫 region, cassdra 叫 vnode;

二、消息的三层结构

如下图:

即 topic -> partition -> message ;

kafka 消息分区机制原理

  • topic 是逻辑上的消息容器;
  • partition 实际承载消息,分布在不同的 kafka 的 broke 上;
  • message 即具体的消息。

三、分区策略

1. round-robin 轮询

kafka 消息分区机制原理

消息按照分区挨个的写。

2. randomness 随机分区
随机的找一个分区写入,代码如下:

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

kafka 消息分区机制原理

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

kafka 消息分区机制原理

4. 自定义分区

必须完成两步:

①. 自定义分区实现类,需要实现 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();

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

系统默认:如果消息有 key, 按照 key 分区策略,否则按照轮询策略。

四、小结

kafka 的分区实现消息的高吞吐量的主要依托,主要是实现了写的负载均衡。可以指定各种负载均衡算法。

负载均衡算法非常重要,需要极力避免消息分区不均的情况,可能给消费者带来性能瓶颈。

小结如下:

kafka 消息分区机制原理

kafka 消息分区机制原理

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计983字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中