18、kafka的Reactor设计模型


kafka作为一种高性能、高并发的消息中间件,必须要求大量的客户端连接、必须做到高并发,kafka使用了久经检验的Reactor模型。在了解之前,首先了解一下如下几个概念(Reactor模型是基于Java NIO的,是linux的epoll模型的改造):

#(1)认识Java NIO(new IO-对应linux的epoll模型)

Java NIO的java1.4引入的相关特性。主要包括

a、Channels–类似与Java的stream
b、Buffers–存放二进制的缓冲区
c、Selectors-存放网络套接字的

Channel(通道)和Java中的stream一样,用于传输数据的数据流,数据可以从Channel读到buffer,也可以从buffer写到Channel中。
在这里插入图片描述
Selector允许单线程处理多个Channel。使用Selector,首先得向Selector注册Channel,然后调用它的select()方法,此方法会一直阻塞知道某个注册的Channel有事件就绪。一旦这个方法返回,线程就可以处理这些事件,事件的例子如新连接进来,数据接收等。
下图为一个单线程中使用Selector处理3个Channel(对应一个客户端):
在这里插入图片描述

(2)认识Linux的epoll模型

epoll是一种IO多路复用技术,在linux内核中广泛使用。常见的三种IO多路复用技术为select模型、poll模型和epoll模型。

select模型
需要将客户端套接字注册到select模型中,然后select模型轮训所有的套接字查看哪个套接字上是否有事件发生,缺点就是套接字最大支持1024个,其次就是主动轮训效率很低(造成大量cpu功耗),再就是事件发生后需要套接字从内核空间拷贝到用户空间,效率低。

poll模型
poll模型和select模型原理一样,但是修正了select模型最大套接字的限制的缺点(受限于系统打开的最大文件数以及内存的限制)。
缺点:1、主动轮训效率低。2、套接字需要从内核空间拷贝到用户空间,效率低。

epoll模型
epoll模型修改主动轮询为被动通知,当时间发生时,被动接收通知。所以epoll模型注册套接字后,主程序可以做其他事情,当事件发生时,接收到通知后再去处理。修正了select模型的三个缺点(第三点使用共享内存修正-内核空间和用户空间使用相同的空间)。

(3)kafka Server Reactor模型

Reactor模型是处理大量连接和高并发的基础,Kafka SocketServer是给予Java NIO开发的,采用了Reactor的模型(已被大量实践证明非常高效,在Netty和Mina中广泛使用)。Kafka Reactor的模型包括三种角色:
在这里插入图片描述
a、Acceptor
主要职责是监听客户端的连接请求,并建立和客户端的数据传输通道,然后为这个客户端指定一个processor,它的工作就到此结束了,这样它就可以去响应下一个客户端的连接请求了。–主要处理连接

b、Processor
主要的职责就是负责从客户端读取数据和将响应返回给对应客户端,它本身就不处理具体的业务逻辑,每一个Processor都有一个Selector,用来监听多个客户端,因此可以费阻塞地处理多个客户端的读写请求,Processor将数据放入RequestChannel的RequestQueue中和从ResponseQueue读取响应。

c、Handler
处理具体的业务逻辑(KafkaRequestHandler、KafkaApis),主要的职责是从RequestChannel中的RequestQueue取出Request,处理以后再将Response添加到RequestChannel中的ResponseQueue中。

Kafka Reactor包含了一个Acceptor,负责接收客户端请求,N个Processor线程负责读写数据(为每一个Connection创建一个Processor去单独处理,每个P投入测试搜人中均引用独立的Selector),M个Handler来处理业务逻辑。在Acceptor和Processor,Processor和Handler之间都有队列来缓冲请求

快来成为我的朋友或合作伙伴,一起交流,一起进步!:
QQ群:961179337
微信:lixiang6153
邮箱:lixx2048@163.com
公众号:IT技术快餐
更多资料等你来拿!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

贝壳里的沙

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

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

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

打赏作者

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

抵扣说明:

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

余额充值