• Kafka 温故(二):Kafka的基本概念和结构


    一.Kafka中的核心概念

    Producer: 特指消息的生产者
    Consumer :特指消息的消费者
    Consumer Group :消费者组,可以并行消费Topic中partition的消息
    Broker:缓存代理,Kafa 集群中的一台或多台服务器统称为 broker。
    Topic:特指 Kafka 处理的消息源(feeds of messages)的不同分类。
    Partition:Topic 物理上的分组,一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列。partition 中的每条消息都会被分配一个有序的 id(offset)
    Message:消息,是通信的基本单位,每个 producer 可以向一个 topic(主题)发布一些消息
    Producers(是个动词):消息和数据生产者,向 Kafka 的一个 topic 发布消息的过程叫做 producers
    Consumers(是个动词):消息和数据消费者,订阅 topics 并处理其发布的消息的过程叫做 consumers

    二.Kafka的逻辑架构

    注:当一个Topic中消息过多时,会对Topic进行分区处理,把消息分到不同的Partition中。

    为什么要分区:
           是为了对大量的数据进行分而治之,把数据分区,不同的Consumer可以消费不同分区的数据,不同Consumer对数据的消费可以做成并行的,这样可以加快数据处理的速度。

    消息发送的流程:
    1.Producer根据指定的partition方法(round-robin、hash等),将消息发布到指定topic的partition里面
    2.kafka集群接收到Producer发过来的消息后,将其持久化到硬盘,并保留消息指定时长(可配置),而不关注消息是否被消费。
    3.Consumer从kafka集群pull数据,并控制获取消息的offset

    三.Kafka的Producers

    1.producers定义:
      消息和数据生产者,向 Kafka 的一个 topic 发布消息的过程叫做 produces

    2.可指定消息的partition:
       Producer将消息发布到指定的Topic中,同时Producer也能决定将此消息归属于哪个partition(即:生产者可以指定将发送的消息放在一个topic中的partition1,还是partition2中)(注:这种机制可以理解为一种变相的负载均衡,轮转);比如基于"round-robin"方式或者通过其他的一些算法等()

    3.异步发送:
          kafka支持异步批量发送消息。批量发送可以很有效的提高发送效率。Kafka producer的异步发送模式允许进行批量发送,先将消息缓存在内存中,然后一次请求批量发送出去

    四.Kafka的broker

    1.Broker:(可以把Broker理解为Kafka的服务器)缓存代理,Kafka 集群中的一台或多台服务器统称为 broker。
     注:
           kafka中支持消息持久化的,生产者生产消息后,kafka不会直接把消息传递给消费者,而是先要在broker中进行存储,持久化是保存在kafka的日志文件中。

    2.Message在Broker中通Log追加(即新的消息保存在文件的最后面,是有序的)的方式进行持久化存储。并进行分区(patitions)

    3.为了减少磁盘写入的次数,broker会将消息暂时buffer起来,当消息的个数(或尺寸)达到一定阀值时,再flush到磁盘,这样减少了磁盘IO调用的次数。

    五.Kafka的broker无状态机制

    1.  Broker没有副本机制,一旦broker宕机,该broker的消息将都不可用。

    注:Broker没有副本,那broker宕机了怎么解决?
         虽然broker没有副本,但是消息本身是有副本的,不会丢失。Broker只要在宕机后再读取消息的日志就行了

    2.  Broker不保存订阅者的状态,由订阅者自己保存

    3.  无状态导致消息的删除成为难题(可能删除的消息正在被订阅),kafka采用基于时间的SLA(服务水平保证),消息保存一定时间(通常为7天)后会被删除。

    4.  消息订阅者可以rewind back到任意位置重新进行消费,当订阅者故障时,可以选择最小的offset(id,即偏移量)进行重新读取消费消息。

    注:1.消费者是如何确定,那条消息应该消费,那条消息已经消费了?
           Zookeeper会帮助记录那条消息已经消费了,那条消息没有消费

           2.消费者是如何快速的找到它没有消费的消息呢?
           这个实现就要靠kafka中 “稀疏索引”

    六.Kafka的Message的组成

    1.Message消息:
    是通信的基本单位,每个 producer 可以向一个 topic(主题)发布一些消息

    2.Kafka中的Message是以topic为基本单位组织的,不同的topic之间是相互独立的。每个topic又可以分成几个不同的partition(每个topic有几个partition是在创建topic时指定的),每个partition存储一部分Message。

    3.partition中的每条Message包含了以下三个属性:
       offset(偏移量,即消息的唯一标示,通过它才能找到唯一的一条消息)  
       对应类型:long
       MessageSize 对应类型:int32
       data        是message的具体内容

    注:1.消息是无状态的,消息的消费先后顺序是没有关系的
            2.每一个partition只能由一个consumer来进行消费,但是一个consumer是可            以消费多个partition,是一对多的关系

    七.Kafka的Partition的分区的目的

    1.kafka基于文件存储.通过分区,可以将日志内容分散到多个server上,来避免文件尺寸达到单机磁盘的上限,每个partiton都会被当前server(kafka实例)保存;

    2.可以将一个topic切分多任意多个partitions,来消息保存/消费的效率.

    3.越多的partitions意味着可以容纳更多的consumer,有效提升并发消费的能力.

    八.Kafka的Consumers

    Ø消息和数据消费者,订阅 topics 并处理其发布的消息的过程叫做 consumers。
    Ø在 kafka中,我们 可以认为一个group是一个“订阅者”,一个Topic中的每个partions,只会被一个“订阅者”中的一个consumer消费,不过一个 consumer可以消费多个partitions中的消息(消费者数据小于Partions的数量时)
    Ø
    Ø注: kafka的设计原理决定,对于一个topic,同一个group中不能有多于partitions个数的consumer同时消费,否则将意味着某些consumer将无法得到消息.
     
  • 相关阅读:
    ansj分词原理
    于erlang依赖的linux调优
    Gearman
    生成具有三态背景图片的按钮
    tracert
    Wings 3D
    jira
    Erlang编程语言的一些痛点
    QTreeView 限制特定的深度、特定深度下的列 是否可以编辑
    QStandardItemModel角色控制及QTreeView添加不同的右键菜单
  • 原文地址:https://www.cnblogs.com/pony1223/p/9807652.html
Copyright © 2020-2023  润新知