Kafka【入门篇】

Kafka

Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。
面试题:使用消息队列的好处?

  • 解耦:允许我们独立的扩展或修改队列两边的处理过程。
  • 可恢复性:即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。
  • 缓冲:有助于解决生产消息和消费消息的处理速度不一致的情况。
  • 灵活性&峰值处理能力:不会因为突发的超负荷的请求而完全崩溃,消息队列能够使关键组件顶住突发的访问压力。
  • 异步通信:消息队列允许用户把消息放入队列但不立即处理它。

1、异步通信原理

观察者模式:(发布订阅模式)定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知

生产者消费者模式: 常规的是直接生产者与消费者之间进行交互,导致高耦合,依赖过高,故此引出第三方存储,作为中间件,这样只需要生产者向存储中推送消息,消费者只需拉取存储器中的消息,降低两者的耦合性


缓冲区:

  • 解耦
    假设生产者和消费者分别是两个类。如果让生产者直接调用消费者的某个方法,那么生产者对
    于消费者就会产生依赖
  • 支持并发
    生产者直接调用消费者的某个方法过程中函数调用是同步的
    万一消费者处理数据很慢,生产者就会白白糟蹋大好时光
  • 支持忙闲不均
    缓冲区还有另一个好处。如果制造数据的速度时快时慢,缓冲区的好处就体现出来了。
    当数据制造快的时候,消费者来不及处理,未处理的数据可以暂时存在缓冲区中。
    等生产者的制造速度慢下来,消费者再慢慢处理掉。

数据单元:

  • 关联业务:即数据单元与某个业务进行联系
  • 完整性:每一个数据单元必须一个完整的数据
  • 独立性:即每个数据单元互不影响,每个单元都相对独立
  • 颗粒度:根据颗粒度的大小,颗粒越小,每次传输速度快,但次数多,颗粒大则相反,并影响数据的消费

2、消息系统原理

点对点消息传递: 即生产者将消息持久化到消息队列中,然后由一个或者多个消费者进行消费,每条消息一旦被消费,便会被删除,所以即便多个消费者同时来消费也会保持消息的有序性
在这里插入图片描述

发布订阅消息传递: 首先由生产者持久化消息到Topic主题中,消费者可以对Topic进行订阅消费,还可以使用偏移量进行多次消费,消息被消费后不会被立刻删除,一般默认一周生命周期
在这里插入图片描述


3、Kafka系统架构

在这里插入图片描述

  • Broker
    Kafka 集群包含一个或多个服务器,服务器节点称为broker。
  • Topic
    每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic。类似于数据库的table或者ES的Index,物理上不同Topic的消息分开存储,逻辑上一个Topic的消息虽然保存于一个或多个broker上但用户只需指定消息的Topic即可生产或消费数据而不必关心数据存于何处)
  • Partition
    topic中的数据分割为一个或多个partition。每个topic至少有一个partition,当生产者产生数据的时候,根据分配策略,选择分区,然后将消息追加到指定的分区的末尾(队列)每条消息都有自增编号,每个partition中的数据使用多个segment文件存储。
    Partation数据路由规则:
      1. 指定了 patition,则直接使用;
      2. 未指定 patition 但指定 key,通过对 key 的 value 进hash 选出一个 patition
      3. patition 和 key 都未指定,使用轮询选出一个 patition。
  • Leader
    每个partition有多个副本,其中有且仅有一个作为Leader,Leader是当前负责数据的读写的partition。
  • Follower
    Follower跟随Leader,所有写请求都通过Leader路由,数据变更会广播给所有Follower,Follower与Leader保持数据同步。如果Leader失效,则从Follower中选举出一个新的Leader。当Follower挂掉、卡住或者同步太慢,leader会把这个follower从“in sync replicas”(ISR)列表中删除,重新创建一个Follower。
  • replication
    数据会存放到topic的partation中,但是有可能分区会损坏我们需要对分区的数据进行备份(备份多少取决于你对数据的重视程度)
    在这里插入图片描述
  • Consumer Group
    每个Consumer属于一个特定的Consumer Group(可为每个Consumer指定group name,若不指定group name则属于默认的group)。将多个消费者集中到一起去处理某一个Topic的数据,可以更快的提高数据的消费能力整个消费者组共享一组偏移量(防止数据被重复读取),因为一个Topic有多个分区.
  • offset偏移量
    可以唯一的标识一条消息偏移量决定读取数据的位置,不会有线程安全的问题,消费者通过偏移量来决定下次读取的消息,消息被消费之后,并不被马上删除,这样多个业务就可以重复使用kafka的消息,我们某一个业务也可以通过修改偏移量达到重新读取消息的目的,偏移量由用户控制消息最终还是会被删除的,默认生命周期为1周(7*24小时)
  • Zookeeper
    kafka 通过 zookeeper 来存储集群的 meta 信息。
    在这里插入图片描述

4、Kafka数据存储

在这里插入图片描述

partition还可以细分为Segment,一个partition物理上由多个Segment组成,segment 的参数有两个:

  • log.segment.bytes:单个segment可容纳的最大数据量,默认为1GB
  • log.segment.ms:Kafka在commit一个未写满的segment前,所等待的时间(默认为7天)
    在这里插入图片描述

5、生产者数据安全

ACK应答机制:Kafka 为用户提供了三种可靠性级别,用户根据可靠性和延迟的要求进行权衡Producers可以选择是否为数据的写入接收ack,有以下几种ack的选项:
ack=0: (最多一次)这意味着 Producer 无需等待来自 Leader的确认而继续发送下一批消息。当 Broker 故障时有可能丢失数据。
ack=1: (最少一次)Producer 在 ISR(在同步队列中) 中的 Leader 已成功收到的数据并得到确认后发送下一条 Message。如果在 Follower 同步成功之前 Leader 故障,那么将会丢失数据。
ack=-1: (最少一次) Producer 需要等待 ISR 中的所有 Follower 都确认接收到数据后才算一次发送完成,可靠性最高。在 Broker 发送 ACK 时,Leader 发生故障,则会造成数据重复。

在这里插入图片描述


在这里插入图片描述


本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>