Java Kafka工作原理-消息中间件

目录

1、Kafka核心模块

2、kafka优点

3、Kafka如何保证消息有序

4、Kafka消费方式

5、Kafka高可用

6、Kafka一致性

7、Kafka持久化

8、Kafka网络模型

9、Kafka消息丢失问题

生产者和broke阶段消息丢失场景

消费数据重复场景及解决方案


1、Kafka核心模块

  1. broker:中间的kafka cluster,存储消息,是由多个server组成的集群。
  2. topic:kafka给消息提供的分类方式。broker用来存储不同topic的消息数据。
  3. producer:往broker中某个topic里面生产数据。
  4. consumer:从broker中某个topic获取数据。

2、kafka优点

消费者可以根据需求,灵活指定offset消费。

保证了消息不变性,为并发消费提供了线程安全的保证。每个consumer都保留自己的offset,互相之间不干扰,不存在线程安全问题。

消息访问的并行高效性。每个topic中的消息被组织成多个partition,partition均匀分配到集群server中。生产、消费消息的时候,会被路由到指定partition,减少竞争,增加了程序的并行能力。

增加消息系统的可伸缩性。每个topic中保留的消息可能非常庞大,通过partition将消息切分成多个子消息,并通过负责均衡策略将partition分配到不同server。这样当机器负载满的时候,通过扩容可以将消息重新均匀分配。

保证消息可靠性。消息消费完成之后不会删除,可以通过重置offset重新消费,保证了消息不会丢失。

灵活的持久化策略。可以通过指定时间段(如最近一天)来保存消息,节省broker存储空间。

备份高可用性。消息以partition为单位分配到多个server,并以partition为单位进行备份。备份策略为:1个leader和N个followers,leader接受读写请求,followers被动复制leader。leader和followers会在集群中打散,保证partition高可用。

3、Kafka如何保证消息有序

kafka通过partition的概念,保证了partition内消息有序性,缓解了上面的问题。partition内消息会复制分发给所有分组,每个分组只有一个consumer能消费这条消息。这个语义保证了某个分组消费某个分区的消息,是同步而非并发的。如果一个topic只有一个partition,那么这个topic并发消费有序,否则只是单个partition有序。

 

4、Kafka消费方式

kafka采用pull并采用可配置化参数保证当存在数据并且数据量达到一定量的时候,consumer端才进行pull操作,否则一直处于block状态。kakfa采用整数值consumer position来记录单个分区的消费状态,并且单个分区单个消息只能被consumer group内的一个consumer消费,维护简单开销小。消费完成,broker收到确认,position指向下次消费的offset。由于消息不会删除,在完成消费,position更新之后,consumer依然可以重置offset重新消费历史消息。

 

consumer存在两种消费模型

  • push:优势在于消息实时性高。劣势在于没有考虑consumer消费能力和饱和情况,容易导致producer压垮consumer。
  •  pull:优势在可以控制消费速度和消费数量,保证consumer不会出现饱和。劣势在于当没有数据,会出现空轮询,消耗cpu。

 

5、Kafka高可用

 

 在Kafka中保证高可靠模型的依靠的是副本机制,有了副本机制之后,就算机器宕机也不会发生数据丢失kafka中,正常情况下所有node处于同步中状态,当某个node处于非同步中状态,也就意味着整个系统出问题,需要做容错处理。

同步中代表了:

  •  该node与zookeeper能连通。
  •  node如果是follower,那么consumer position与leader不能差距太大(差额可配置)。

 

某个分区内同步中node组成一个集合,即该分区的ISR。

kafka通过两个手段容错:

  •  数据备份:以partition为单位备份,副本数可设置。当副本数为N时,代表1个leader,N-1个followers,followers可以视为leader的consumer,拉取leader的消息,append到自己的系统中
  •  failover

        1. leader处于非同步中时,系统从followers中选举新leader

       2. 当某个follower状态变为非同步中时,leader会将此follower剔除ISR,当此follower恢复并完成数据同步之后再次进入 ISR。

另外,kafka有个保障:当producer生产消息时,只有当消息被所有ISR确认时,才表示该消息提交成功。只有提交成功的消息,才能被consumer消费。

因此,当有N个副本时,N个副本都在ISR中,N-1个副本都出现异常时,系统依然能提供服务

高性能的日志存储kafka一个topic下面的所有消息都是以partition的方式分布式的存储在多个节点上。同时在kafka的机器上,每个Partition其实都会对应一个日志目录,在目录下面会对应多个日志分段(LogSegment)

 

6、Kafka一致性

上面的方案保证了数据高可用,有时高可用是体现在对一致性的牺牲上。如果希望达到强一致性,可以采取如下措施:

  •  禁用脏leader选举ISR没有node时,宁可不提供服务也不要未完全同步的node。
  •  设置最小ISR数量min_isr,保证消息至少要被min_isr个node确认才能提交。

7、Kafka持久化

基于以下几点事实,kafka重度依赖磁盘而非内存来存储消息。

  •  硬盘便宜,内存贵
  •  顺序读+预读取操作,能提高缓存命中率
  •  操作系统利用富余的内存作为pagecache,配合预读取(read-ahead)+写回(write-back)技术,从cache读数据,写到cache就返回(操作系统后台flush),提高用户进程响应速度
  •  java对象实际大小比理想大小要大,使得将消息存到内存成本很高
  •  当堆内存占用不断增加时,gc抖动较大
  •  基于文件顺序读写的设计思路,代码编写简单
  • 在持久化数据结构的选择上,kafka采用了queue而不是Btree
  •  kafka只有简单的根据offset读和append操作,所以基于queue操作的时间复杂度为O(1),而基于Btree操作的时间复杂度为O(logN)
  •  在大量文件读写的时候,基于queue的read和append只需要一次磁盘寻址,而Btree则会涉及多次。磁盘寻址过程极大降低了读写性能

8、Kafka网络模型

KafkaClient --单线程Selector

在kafka中,consumer和producer都是使用的上面的单线程模式

Kafka--server -- 多线程Selector

在kafka服务端采用的是多线程的Selector模型,Acceptor运行在一个单独的线程中,对于读取操作的线程池中的线程都会在selector注册read事件,负责服务端读取请求的逻辑。成功读取后,将请求放入message queue共享队列中。然后在写线程池中,取出这个请求,对其进行逻辑处理,即使某个请求线程阻塞了,还有后续的县城从消息队列中获取请求并进行处理,在写线程中处理完逻辑处理,由于注册了OP_WIRTE事件,所以还需要对其发送响应。

 

9、Kafka消息丢失问题

生产者和broke阶段消息丢失场景

1、ack=0,不重试

producer发送消息完,不管结果了,如果发送失败也就丢失了。

2、ack=1,leader crash

producer发送消息完,只等待lead写入成功就返回了,leader crash了,这时follower没来及同步,消息丢失。

3、unclean.leader.election.enable 配置true

允许选举ISR以外的副本作为leader,会导致数据丢失,默认为false。producer发送异步消息完,只等待lead写入成功就返回了,leader crash了,这时ISR中没有follower,leader从OSR中选举,因为OSR中本来落后于Leader造成消息丢失。

消费数据重复场景及解决方案

1、根本原因

数据消费完没有及时提交offset到broke。

2、场景

消息消费端在消费过程中挂掉没有及时提交offset到broke,另一个消费端启动拿之前记录的offset开始消费,由于offset的滞后性可能会导致新启动的客户端有少量重复消费。

3、解决方案

1、取消自动自动提交

每次消费完或者程序退出时手动提交。这可能也没法保证一条重复。

2、下游做幂等

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值