• Kafka 工作流程及名词解释


    十年河东,十年河西,莫欺少年穷

    学无止境,精益求精

    MQ的作用

     1.解耦:将数据生产方和数据消费方解耦。数据生产方Pruducer只需要关心数据生产;数据消费放Consumer只需要关心数据消费。而不必关心其中的传输过程,该过程交给MQ保证。

        试想,Producer生产出数据后使用Http请求将数据发送Consumer,如果发送失败,那么是生产方的责任还是消费方的责任?如果生产方保证消息发送失败的重试机制,那么相当于

        将不属于数据生产的逻辑加入了Producer。

     2.削峰:当Producer(不一定是内部系统,可能是外部系统,例如开放给外部的http接口,接口访问量暴增)生产的数据量突然暴增,Consumer的吞吐量无法满足数据量的升高。因此,

      必然会导致数据的堆积,慢慢会压垮整个系统。因此,需要引入MQ对Producer生产的数据进行排队,Consumer无法及时消费掉的数据会堆积在MQ中,而不至于直接压垮Consumer。

     3.异步:Consumer和Producer之间可能吞吐量存在不同。因此,数据的生产和消费可以不同步。引入MQ可以使得数据生产和消费的流程异步化。

    工作流程

    鄙人简单画了张图,如下:

    上图所示为kafka的简易工作流程 ,图中展示了3个服务器的集群,分别为broker1、broker2、broker3。broker又被称之为服务器接点,每个Broker中可以有多个Topic对应的分区,每个分区对应一个分区副本,分区副本用于接点故障时,数据恢复。

    例如:Broker1接点故障,Topic1分区1不能访问,那么kafka会使用Borker3中的Topic1分区1副本,这样的设计就实现了kafka的高可用。

    秒杀系统中,同一时刻上千万人同时抢购一个商品,那么久造成了生产者的生产速度大于消费速度,因此kafka提出了消费者组的概念,每个消费者组消费一个指定的分区,分区中同一个消息只能被消费者组的某个消费者消费,不能重复消费。

    注意:如果有1个分区,那么消费者消费时,消息时是有序的,如果有多个分区,那么,消费时整体是无序的,但是同一个分区的数据是有序的

    名词解释:

    Broker

    Broker 是指服务器,在kafka中broker也被称之为服务器接点,用于完成kafka集群

    Producer 【生产者】

    Producer 生产者,生产者生产的数据被称为Mesage,也就是消息,他会经过拦截器,序列化器,分区器处理后,进入到某个Broker中的分区

    Consumer 【消费者】

    Consumer 数据消费者,从Kafka集群拉取数据进行消费。

    Consumer Group 【消费者组】

    Consumer Group 消费组,Kafka保证在整个集群稳定运行的情况下(不发生Reblance),每个Partition中的数据只会被一个Consumer Group消费,某一个消息只能被消费者组中的一个消费者消费,可为每个 Consumer 指定 group name,若不指定 group name 则属于默认的 group。

    topic 【主题】

    Topic 是一个逻辑概念,Partition 是最小的存储单元,掌握着一个 Topic 的部分数据或全部数据。有且只有1个分区时,分区内数据就是Topic的数据。

    Partition 【分区】

    Partition 是分区,可以将分区理解为一个队列或一个有序集合,用于存放生产者生产的消息,它存储在Broker接点中,一个Borker接点中可以存放多个Topic的分区和分区副本。

    上图中,Broker1中存放了Topic1分区1和Topic1分区3副本,那么当Borker3宕机后,kafka会调用Broker1服务器的Topic1分区3副本,这样就使得kafka高可用。

    分区副本可以理解为某个分区的数据备份。

    那么,消息会被分发到哪个分区呢?

    有4种模式

    1、程序员指定某个分区,这是优先级最高的模式

    2、程序员指定一个PartitionKey,kafka会以PartitionKey进行Hash运算,计算结果决定写入哪个 Partition,所以,有相同 Partition Key 的消息,会被放到相同的 Partition。

    3、由kafka决定,如果既没有指定分区,有没有给一个PartitionKey,那么kafka会通过轮询的方式将消息存储到分区。

    4、Kafka 支持自定义规则,一个 Producer 可以使用自己的分区指定规则。

    Parittion Replication 【分区副本】

    由于每个Topic被划分成1个或多个Partition,因此一个Topic的数据被划分成多份分别存储在不同Kafka Broker上,如果某个Broker出现故障,会导致存储在该Broker的这部分数据丢失。

    因此,Kafka提出了Replication概念。每个Topic可以设置1个或多个Replication,对Partition的数据进行冗余备份。

    若Replication数量被设为3,则代表每个Parititon的数据在Kafka集群中存在3份;如果Replication数量被设为1,则代表每个Parititon的数据在Kafka集群中只存在一份。

    Partition Leader

    Partition Leader 由于Replication的存在,因此每个Partittion的数据存在于多个Broker结点,因此,需要选出Parittion Leader。

    Producer和Consumer对Parititon的数据的读、写只和Paritition Leader交互 

    Offsets(偏移量)

    Partition 中的每条记录都会被分配一个唯一的序号,称为 Offset(偏移量)。

    Offset 是一个递增的、不可变的数字,由 Kafka 自动维护。

    当一条记录写入 Partition 的时候,它就被追加到 log 文件的末尾,并被分配一个序号,作为 Offset。

    消息的顺序性需要注意,一个 Topic 如果有多个 Partition 的话,那么从 Topic 这个层面来看,消息是无序的。

    但单独看 Partition 的话,Partition 内部消息是有序的。

    所以,一个 Partition 内部消息有序,一个 Topic 跨 Partition 是无序的。

    如果强制要求 Topic 整体有序,就只能让 Topic 只有一个 Partition。

    @天才卧龙的博客

  • 相关阅读:
    HDU
    01字典树模板
    扩展欧几里得和乘法逆元
    HDOJ-1156 Brownie Points II 线段树/树状数组(模板)
    CF-825E Minimal Labels 反向拓扑排序
    CF-831D Office Keys 思维题
    RMQ 解决区间查询问题
    hdu 5073 有坑+方差贪心
    hdu 5074 相邻数和最大dp
    hdu 5078 水题
  • 原文地址:https://www.cnblogs.com/chenwolong/p/kfk_Yl.html
Copyright © 2020-2023  润新知