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 发生故障,则会造成数据重复。

在这里插入图片描述


6、消费者数据安全

🐝1、消费方式
	① Consumer向Broker拉取pull
		根据消费者的效率来进行拉取,但缺点就是kafka一旦没有消息,导致拉取的一直是空,于是设置一个长连接和一个timeOut,规定时间内返回结果
	② Borker推送消息给Consumer
		根据Borker的速度来进行推送,故导致,效率不一的Consumer无法充分利用,还有可能导致消费慢的消费者堵塞拒绝请求
🐝2、分区分配策略
	定义:将分区的所有权从一个消费者移到另一个消费者称为重新平衡
	分区分配时机:
		① 当一个消费组增加新的消费者时
		② 消费组中有消费组下线或者crashes
		③ 订阅的主题新增分区
	⭐Kafka 有三种分配策略:
		RangeAssignor分配策略
			尽量平分策略,首先用分区总数/消费者总数,获取一个跨度值,剩余的平均分配即可
				
			缺点:当有多个主题Topic时,可能会造成消费者过载
				
		RoundRobinAssignor分配策略
			就是轮询分配策略,轮流替换,进行消费者平均分配(还要考虑Topic归属与哪个消费者)
				
			缺点:如果消费组中的每个消费者的划分的Topic不同则会导致消费不平均情况
				
		StickyAssignor分配策略
			从结果上看StickyAssignor策略比另外两者分配策略而言显得更加的优异,这个策略的代码实现也是异常复杂,如果大家在一个 group 里面,不同的 Consumer 订阅不同的 topic, 那么设置Sticky分配策略还是很有必要的。
			① 分区的分配要尽可能的均匀;
			② 分区的分配尽可能的与上次分配的保持相同。
			③ 当两者发生冲突时,第一个目标优先于第二个目标。
🐝3、OffSet
	偏移量分为两个:一是全局偏移量公用(生产端),二是组内偏移量(消费端)
	1、生产端偏移量
		Kafka接收到生产者发送的消息实际上是以日志文件的形式保存在对应分区的磁盘上。每条消息都有一个offset值来表示它在分区中的位置。每次写入都是追加到文件的末尾,
			
	2、消费端偏移量
		消费者提交的offset值维护在consumer_offsets这个Topic中,具体维护在哪个分区中,是由消费者所在的消费者组groupid决定(计算方式是:groupid的hashCode值对50取余)
	存储位置
		Kafka 0.9 版本之前,Consumer 默认将 Offset 保存在 Zookeeper 中,从 0.9 版本开始,Consumer 默认将 Offset 保存在 Kafka 一个内置的 Topic 中,该 Topic 为 __consumer_offsets。
			
🐝4、checkpoint的offset
	① kafka的每个数据根目录都存在N个检查点文件和meta.properties文件
	② 在创建topic的时候,如果当前broker中不止配置了一个data目录,那么会挑选分区数量最少的那个data目录来完成本次创建任务
	③ 检查点作用:checkpoint
		(1)recovery-point-offset-checkpoint:表示已经刷写到磁盘的offset信息,对应LEO信息。
		(2)replication-offset-checkpoint:用来存储每个replica的HW,表示已经被commited的offset信息。
		(3)log-start-offset-checkpoint:对应logStartOffset,用来标识日志的起始偏移量
		(4)cleaner-offset-checkpoint:存了每个log的最后清理offset。

7、Kafka的事务性

⭐Kafka幂等性
	1、幂等,就是指多接口的多次调用所产生的结果和只调用一次是一致的。没有幂等性的情况下就会重复发送数据,
	2、Kafka的幂等性机制能保证单个分区不会重复写入数据,而实现幂等性的核心就是引入了producerid 和 sequence number这两个概念。
	3、事务流程
		首先每个生产者都有一个PID,当生产者将消息放到分区,会产生一个序列号,此序列号会自增,持久化到队列中,返回一个ack状态,此时生产者再发出一个消息,如果序列号小于或者等之前的序列号那么直接返回错误的ack
		开启事务:Properties.put(“enable.idempotence”,true);
⭐Kafka事务
	1、Kafka事务性主要是为了解决幂等性无法跨Partition运作的问题,事务性提供了多个Partition写入的原子性
	2、即写入多个Partition要么全部成功,要么全部失败,不会出现部分成功部分失败这种情况。
	3、Flink正是基于Kafka的事务性,实现了端到端的Exactly Once语义
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每日小新

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值