kafka原理与应用

架构图

kafka原理与应用_第1张图片
kafka原理与应用_第2张图片

Broker

  1. Kafka集群包含多个服务器,服务器节点称为Broker
  2. Broker存储Topic数据
    1. 如果某topic有N个partition,集群有N个broker,那么每个broker存储该topic的一个partition。
    2. 如果某topic有N个partition,集群有(N+M)个broker,那么其中有N个broker存储该topic的一个partition,剩下的M个broker不存储该topic的partition数据。
    3. 如果某topic有N个partition,集群中broker数目少于N个,那么一个broker存储该topic的一个或多个partition。在实际生产环境中,尽量避免这种情况的发生,这种情况容易导致Kafka集群数据不均衡。

Leader&Follower

  1. 每个Partition有多个副本,有且仅有一个作为Leader
  2. Leader是当前负责数据读写的Partition
  3. 所有写请求通过Leader路由,数据变更会广播给Follower。
  4. 若Leader失效,会送Follower中选举Leader。
  5. 当Follower与Leader卡住、挂掉、同步慢,Leader会将Follower删除,重新创建Follower。

Topics和Partition

  1. Topic逻辑上理解为一个queue,每条消息都对应一个Topic
  2. Partition:物理上一个Topic分成多个Partition,对应一个文件夹,存储消息和索引文件
  3. Topic可以指定分区数,越多,吞吐量越大,资源越多,不可用性越高
  4. 单个Partition中数据有序
  5. 收到消息,均衡策略,append到Partition。属于顺序写磁盘,高效
  6. Partition可分布在不同的broker,同一Topic消息可并行写入Partition,高效
  7. Kafka会保留所有消息,提供时间空间删除策略
  8. Consumer的offset控制消费位点,所以broker无状态,不标记是否被消费,不需要锁避免重复消费,高效

Producer

  1. Producer发送消息到broker
  2. Partition机制选择存储到哪一个partition
  3. 消息可以制定key,producer根据key和partition机制判断发送到那个partition
  4. Partition机制可以通过指定Producer的partition.class。该calss必须实现Partitioner接口

Consumer Group

kafka原理与应用_第3张图片

  1. 同一Topic的消息只能被一个Consumer Group的一个Consumer消费,多个Comsumer Group可以同时消费。
  2. 借此实现广播和单点。广播时,每个Consumer独立Group;单点时,所有Consumer在同一个Group

Push&Pull

  1. Producer向Broker push消息。
  2. Consumer从Broker pull消息。

Replication(副本)

  1. 0.8以前版本没有Replic,一旦某个Broker宕机,其上所有Partition都不可消费
  2. 为了负载均衡,Kafka尽量将Partition均匀分配到每个Broker。
  3. 为了提高容错,Kafka尽量将同一个Partition的Replic分散到不同的Broker。
  4. 分配Replication的算法
    1. 将所有Broker(假设共n个Broker)和待分配的Partition排序
    2. 将第i个Partition分配到第(i mod n)个Broker上
    3. 将第i个Partition的第j个Replica分配到第((i + j) mode n)个Broker上

消息同步流程

kafka原理与应用_第4张图片

  1. 同步流程
    1. Producer发送消息
    2. Leader接收,写入本地log
    3. Follower pull,写入log,发送ACK
    4. Leader收到所有ISR(in sync replication)的ACK,增加HW,向Producer发送ACK
    5. Consumer从Leader读取已被commit的消息
  2. ZooKeeper的心跳机制检测Broker是否存活
  3. Leader会将Broker从ISR中移除
    1. Follower宕机
    2. Follower消息数落后于Leader指定值
    3. Follower指定时间未向Leader发送fetch请求

集成SpringBoot

  1. POM

    <dependency>
        <groupId>org.springframework.kafkagroupId>
        <artifactId>spring-kafkaartifactId>
        <version>1.3.5.RELEASEversion>
    dependency>
    
  2. Application.properties

    spring:
      kafka:
        bootstrap-servers: 127.0.0.1:9092 #指定kafka server的地址,集群配多个,中间,逗号隔开
        producer:
          key-serializer: org.apache.kafka.common.serialization.StringSerializer
          value-serializer: org.apache.kafka.common.serialization.StringSerializer
        consumer:
          group-id: default_consumer_group #群组ID
          enable-auto-commit: true
          auto-commit-interval: 1000
          key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
          value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
    server:
      port: 8500
    
  3. 生产者

    @Autowired
    private KafkaTemplate<String,Object> kafkaTemplate;
    kafkaTemplate.send("Topic", msg);
    
  4. 消费者

    @KafkaListener(topics = "demo")
        public void listen (ConsumerRecord<?, ?> record){
            System.out.printf("topic is %s, offset is %d, value is %s \n", record.topic(), record.offset(), record.value());
        }
    

你可能感兴趣的:(开源框架,Kafka,消息队列)