kafka原理

一.kafka简介

Kafka是消息队列,也叫消息中间件,既然是队列,特点就是先进先出。

Kafka的zookeeper是Kafka消息系统中必不可少的组件,主要用于管理和协调Kafka集群中各个broker节点的状态和配置信息。zookeeper负责维护Kafka集群中的当前状态,包括存储broker的地址、分区的状态等。

Kafka集群中每个broker都会向zookeeper注册自己的信息,并通过zookeeper通知其他broker自己的状态和健康状况。同时,Kafka生产者和消费者也可以通过zookeeper获取集群的元数据信息,以便更好地与Kafka集群进行交互。

除了Kafka之外,zookeeper还被广泛用于其他分布式系统中,比如Hadoop、HBase等。zookeeper提供了高可用性和可扩展性的分布式协调服务,可以用于实现分布式锁、命名服务、配置管理等功能。

二.kafka角色介绍

        1.producer:

Kafka的生产者(producer)是Kafka消息系统中用于向topic发布消息的一种客户端,主要负责将数据写入Kafka集群中的一个或多个分区。

生产者可以指定将消息写入哪个topic,也可以手动控制将消息写入哪个分区。同时,生产者也可以异步发送消息,以提高吞吐量,并支持自定义回调函数来处理发送结果。

相比于消息消费者(consumer),生产者需要更加关注消息的可靠性和效率。因此,在使用Kafka生产者时,需要考虑一些最佳实践,比如:

  • 生产者应该合理地设置batch size,以最大限度地降低网络传输的开销。
  • 生产者要合理地控制发送速度和重试策略,以确保消息能够被成功写入Kafka集群。
  • 生产者可以使用多线程并发发送消息,以提高吞吐量和效率。

        2.consumer:

Kafka的消费者(consumer)是Kafka消息系统中用于读取数据并处理消息的一种客户端。消费者可以订阅一个或多个主题(topic)并从其中读取消息。

消费者通过向Kafka集群的broker节点发送拉取请求(pull request),从分区(partition)中获取数据。消费者可以手动控制所拉取的消息的偏移量(offset),可以重复读取之前已经消费过的消息。

相比于消息生产者(producer),消费者一般需要更加关注性能和容错性,因为消费者可能会面临网络延迟、消息堆积等问题。因此,在使用Kafka消费者时,需要考虑一些最佳实践,比如:

  • 消费者的数量应该与Kafka集群的分区数量匹配,以便均衡各消费者的负载。
  • 消费者要合理地控制消息的提交方式,以确保消息不会被重复消费或者丢失。
  • 消费者可以使用多线程并发拉取消息,以提高吞吐量和效率。

        3.broker

Kafka的broker是Kafka消息系统中扮演重要角色的服务组件,负责接收、存储、管理和分发消息。一个Kafka集群由多个broker节点组成,并且每个broker都存储了一部分数据并维护了一部分分区的副本。

broker之间通过Zookeeper进行协调和通信,以实现分布式环境下的高可用性和可扩展性。broker还提供了基于分区的负载均衡机制,以确保不同分区的负载尽可能均衡。

除了消息存储和分发的功能,broker还提供了许多管理和监控接口,包括JMX、RESTful API等,使得运维人员可以方便地管理和监控整个集群的状态和性能。

三.分区命名规则

Kafka的主题是逻辑存在,但是分区是物理存在,分区的命名规则:topic-分区编号(分区编号从0开始到分区数-1)

四.生产和消费特点

 

生产者生产数据,消费者消费数据只跟分区leader进行通信,follower作为备份存在,follower当中的数据是去leader当中进行拉取备份。

当某一天,某一个分区的leader宕机了,follower会上位成为leader,和生产者,消费者进行通信。

同一时刻,一个分区当中的数据只能被一个消费者组下面的一个消费者所消费。

同一时刻,一个消费者组当中,只能有对应分区数的消费者来消费。

五.偏移量(offset)

每个分区都维护着自己的一份偏移量,用来记录数据位置。

六.Kafka如何保证全局有序

如果将数据保存到多个分区,是分区之内有序( 先进先出 ),全局无序( 线程效率不同 )

如果想要全局有序,将所有数据发送到一个分区当中

七.kafka 如何保证数据不丢失

        1.Producer 如何保证数据不丢失:

生产者生产数据有两种模式: 一种是同步模式,一种是异步模式;

同步模式:

生产者生产一条数据,就保存一条数据,保存成功后,在生产下一条数据,能够保证数据不丢失,但是效率很低.

异步模式:

采用ack 机制:

在producer端开启一块buffer缓冲,用来缓存数据,缓存一批数据,保存到partition当中.

0 : 生产者生产数据,不管leader 是否保存成功,follower是否同步成功,继续发送下一批数据;

1 : 生产者生产数据,只要保证leader保存成功,不管follower是否同步成功,继续发送下一批数据;

-1 : 生产者生产数据,既要保证leader保存成功,也要保证follower同步成功,继续发送下一批数据;

        2.Broker 如何保证数据不丢失:

ISR列表(基于broker):

ISRIn-Sync Replicas),副本同步队列。ISR中包括LeaderFollower。如果Leader进程挂掉,会在ISR队列中选择一个服务作为新的Leader。有replica.lag.max.messages(延迟条数)和replica.lag.time.max.ms(延迟时间)两个参数决定一台服务是否可以加入ISR副本队列,在0.10版本移除了replica.lag.max.messages参数,防止服务频繁的进去队列。

任意一个维度超过阈值都会把Follower剔除出ISR,存入OSROutof-Sync Replicas)列表,新加入的Follower也会先存放在OSR中。

每个分区可以有多个副本,其中一个是领袖副本(Leader Replica),其余的则是追随者副本(Follower Replica)。当生产者将消息写入到领袖副本时,如果同时配置了ISR参数,那么只有处于ISR中的追随者副本才会被视为已成功提交该消息,其他未在ISR中的副本将被忽略(设置与leader的差别条数 超过阈值即被忽略)。只有在ISR中的所有副本都确认接收并写入数据后,才会认为该消息已经提交,并向生产者发送确认响应。这种机制确保了消息的可靠性,并防止因某些原因导致数据丢失或重复。

        3.Consumer 如何保证数据不丢失:

变自动提交偏移量为手动提交偏移量

在创建Kafka消费者时,将enable.auto.commit属性设置为false,禁止使用自动提交偏移量功能。

在消费者处理完一批消息后,调用consumer.commitSync()或consumer.commitAsync()方法手动提交已消费的消息的偏移量。

如果发生了重新平衡(如消费者组成员变更),则需要在rebalance监听器中保存未提交的偏移量,并在分配分区后重新读取它们。

这种方式可以确保每个分区的偏移量只有在成功处理完消息后才被提交,避免了可能的重复消费和数据丢失问题。

八.kafka 为什么速度快

(Kafka是将数据保存到磁盘)

  1. 顺序读写磁盘
  2. 采用pageCache页缓存技术
  3. 零拷贝机制
  4. 多分区

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值