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

  • 相关阅读:
    uIP tcp/ip协议分析及其在嵌入式系统中的应用
    围棋学习网站 (updating)
    几种代价函数
    浅谈围棋自学入门 写给想自学围棋的业余爱好者
    在 Ubuntu Natty 中解除系统托盘限制
    MATLAB中的CELL用法
    支持向量机(SVM)
    成功思维的三十个模式
    Microsoft Kinect SDK vs PrimeSense OpenNI
    生命中的选择
  • 原文地址:https://www.cnblogs.com/snidget/p/12757698.html
Copyright © 2011-2022 走看看