Kafka流程分析-生产者

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 partitions = cluster.partitionsForTopic(topic);
        // (1) 指定了patition,则直接使用该 Partition
        int numPartitions = partitions.size();
        if (keyBytes == null) {
            int nextValue = nextValue(topic);
            List 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(副本)
Kafka流程分析-生产者_第1张图片
Replica流程
(4)写入流程

流程图:

Kafka流程分析-生产者_第2张图片
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存储结构
Kafka流程分析-生产者_第3张图片
Zk存储结构

3、consumer flow

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

流程图:

Kafka流程分析-生产者_第4张图片
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流程分析-生产者)