美文网首页Apache Kafka
Kafka流程分析-生产者

Kafka流程分析-生产者

作者: 傻子般白痴 | 来源:发表于2020-05-01 13:09 被阅读0次

    Kafka 工作流程分析

    1、Kafka生产过程分析

    (1)写入方式

    producer采用推(push)模式将消息发布到broker,每条消息都被追加(append)到分区(patition)中,属于顺序写磁盘(顺序写磁盘效率比随机写内存要高,保障kafka吞吐率)

    (2)partition

    说明:

    • 消息发送时都被发送到一个topic,其本质就是一个目录,而topic是由一些Partition Logs(分区日志)组成.
    • 每个Partition中的消息都是有序的,生产的消息被不断追加到Partition log上,其中的每一个消息都被赋予了一个唯一的offset值。

    分区原因:

    • 提升拓展性:每个Partition可以通过调整以适应它所在的机器,而一个topic又可以有多个Partition组成,因此整个集群就可以适应任意大小的数据了
    • 提高吞吐能力:在进行数据写入时以 Partition 为单位进行写入。

    分区依据:

    public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {
            List<PartitionInfo> partitions = cluster.partitionsForTopic(topic);
            // (1) 指定了patition,则直接使用该 Partition
            int numPartitions = partitions.size();
            if (keyBytes == null) {
                int nextValue = nextValue(topic);
                List<PartitionInfo> availablePartitions = cluster.availablePartitionsForTopic(topic);
                if (availablePartitions.size() > 0) {
                    int part = Utils.toPositive(nextValue) % availablePartitions.size();
                    return availablePartitions.get(part).partition();
                } else {
                    // no partitions are available, give a non-available partition
                    return Utils.toPositive(nextValue) % numPartitions;
                }
            } else {
                // hash the keyBytes to choose a partition
                return Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions;
            }
        }
    
    • 对于已经指定了 partition 的,则直接使用该partition;
    • 未指定patition但指定key,通过对key的value进行hash出一个patition;
    • patition和key都未指定,使用轮询选出一个patition;
    (3)Replica(副本)
    Replica流程
    (4)写入流程

    流程图:

    producer写入流程
    流程描述:
    • producer先从zookeeper的 "/brokers/.../state"节点找到该partition的leader
    • producer将消息发送给该leader
    • leader将消息写入本地log
    • followers从leader pull消息
    • Follower将 pull到的消息写入本地log
    • Follower 写入成功值后向leader发送ACK
    • leader收到所有ISR中的replication的ACK后,增加HW
    • 向producer发送ACK

    2、 Broker 保存消息

    (1)存储说明
    • 物理上把topic分成一个或多个patition,每个patition物理上对应一个文件夹(该文件夹存储该patition的所有消息和索引文件)
    • Kafka读取特定消息的时间复杂度为O(1);
    • 消息数据是存储在partition文件夹下的*.log文件中的;
    • 消息存储时常有两个策略,分别为:
    基于时间存储策略:默认保留168小时(log.retention.hours=168)  
    基于大小保留策略:默认保留 1G(log.retention.bytes=1073741824)
    
    (2)Zk存储结构
    Zk存储结构

    3、consumer flow

    (1) 高级API与低级API
    • kafka提供了两套consumer API:高级Consumer API和低级Consumer API。
    • 高级API不需要自行去管理offset,partition replica等,系统通过Zk自行管理。(低级 API反之)
    (2)Consumer Group(消费者组)

    流程图:

    Consumer Group
    描述说明:
    • Consumer Group 由多个Consumer 组成,同时一个Consumer只有属于一个Consumer Group。
    • Consumer Group 保证了其订阅的Topic partition 会被该Consumer Group 中的Consumer消费。对于多个Consumer Group订阅了同一个Topic,每个Consumer Group之间互不影响。
    • 如果要实现一个消息被多个 consumer 消费,则可以将当consumer 单独添加到单独的Consumer Group中(反之,如果要实现一个消息 被一个 consumer 消费,则可以将当consumer 添加到同一个Consumer Group中)

    相关文章

      网友评论

        本文标题:Kafka流程分析-生产者

        本文链接:https://www.haomeiwen.com/subject/gutqghtx.html