前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >kafka消息分区机制原理

kafka消息分区机制原理

作者头像
星哥玩云
发布2022-08-08 15:35:05
4770
发布2022-08-08 15:35:05
举报
文章被收录于专栏:开源部署开源部署

一、背景

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

答案就是消息分区。

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

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

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

二、消息的三层结构

如下图:

即 topic -> partition -> message ;

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

三、分区策略

1. round-robin轮询

kafka消息分区机制原理
kafka消息分区机制原理

消息按照分区挨个的写。

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

代码语言:javascript
复制
List<PartitionInfo> partitions = cluster.partitionsForTopic(topic);
return ThreadLocalRandom.current().nextInt(partitions.size());
kafka消息分区机制原理
kafka消息分区机制原理

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

kafka消息分区机制原理
kafka消息分区机制原理

4. 自定义分区

必须完成两步:

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

主要是实现下面的方法:

代码语言:javascript
复制
int partition(String topic, Object key, byte[] keyBytes, 
              Object value, byte[] valueBytes, Cluster cluster);

比如按照区域分区。

代码语言:javascript
复制
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消息分区机制原理
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、背景
  • 二、消息的三层结构
  • 三、分区策略
  • 四、小结
相关产品与服务
负载均衡
负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档