zoukankan      html  css  js  c++  java
  • kafka消息分区机制原理

    背景

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

    答案就是消息分区。

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

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

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

    消息的三层结构

    如下图:

    即  topic -> partition -> message ;

    image.png

    topic是逻辑上的消息容器;

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

  • 相关阅读:
    HDU 1102 Constructing Roads
    HDU 1285 确定比赛名次。
    最小生成树 HDU 各种畅通工程的题,prim和kru的模板题
    HDU Jungle Roads 1301 最小生成树、
    并查集小结(转)
    HDU hdu 2094 产生冠军 拓扑排序 判定环
    模运算(转)
    拓扑排序(主要是确定环和加法) HDU 2647 Reward
    HDU 1372 Knight Moves 简单BFS
    用计算机模型浅析人与人之间沟通方式 (一)如何谈话
  • 原文地址:https://www.cnblogs.com/snidget/p/12757698.html
Copyright © 2011-2022 走看看