背景

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

答案就是消息分区。

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

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

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

消息的三层结构

如下图:

即  topic -> partition -> message ;

topic是逻辑上的消息容器;

partition实际承载消息,分布在不同的kafka的broke上;

message即具体的消息。

分区策略

round-robin轮询

消息按照分区挨个的写。

randomness随机分区

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

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

key

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

自定义分区

必须完成两步:

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的分区实现消息的高吞吐量的主要依托,主要是实现了写的负载均衡。可以指定各种负载均衡算法。

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

小结如下:

原创不易,点赞关注支持一下吧!转载请注明出处,让我们互通有无,共同进步,欢迎沟通交流。

我会持续分享Java软件编程知识和程序员发展职业之路,欢迎关注,我整理了这些年编程学习的各种资源,关注公众号‘李福春持续输出’,发送'学习资料'分享给你!

最新文章

  1. node.js express 4.x 安装指南
  2. 关于SubSonic3.0插件使用实体进行更新操作时(执行T.Update()或T.Save()),某些列无法进行修改操作的问题处理
  3. 【UOJ#67】新年的毒瘤 Tarjan 割点
  4. metasploit连接数据库
  5. hadoop CLASSNAME命令使用注意点
  6. git error
  7. HDU 5927 Auxiliary Set (dfs)
  8. Python学习 之 走进python
  9. Visual studio 2013 添加 GitHub
  10. android studio 改变主题及字体大小
  11. 使用Idea编写javaweb以及maven
  12. AngularJs ng-repeat 必须注意的性能问题
  13. 第三方控件netadvantage UltraWebGrid总结
  14. MySQL Crash Errcode: 28 - No space left on device
  15. 第一次PTA作业
  16. CentOS 7 安装serverjre 9
  17. 百度编辑器UEditor常用设置函数
  18. 20181115 python-第一章学习小结part4
  19. 椭圆曲线密码学ECC
  20. Java代码一行一行读取txt的内容

热门文章

  1. ThreadPoolTaskExecutor 中 corePoolSize vs. maxPoolSize
  2. Python第六章-函数02-函数的作用域
  3. python3.4连接mysql数据库的方法
  4. [leetcode] 位操作题解
  5. Go语言库系列之flag
  6. 使用FME对CAD管网数据进行过滤、聚合、中心点替换
  7. Spring中应用的那些设计模式
  8. [vijos1304]回文数&lt;模拟&gt;
  9. Ptask公告
  10. eclipse项目导入和导出