赞
踩
#(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(对应一个客户端):
epoll是一种IO多路复用技术,在linux内核中广泛使用。常见的三种IO多路复用技术为select模型、poll模型和epoll模型。
select模型
需要将客户端套接字注册到select模型中,然后select模型轮训所有的套接字查看哪个套接字上是否有事件发生,缺点就是套接字最大支持1024个,其次就是主动轮训效率很低(造成大量cpu功耗),再就是事件发生后需要套接字从内核空间拷贝到用户空间,效率低。
poll模型
poll模型和select模型原理一样,但是修正了select模型最大套接字的限制的缺点(受限于系统打开的最大文件数以及内存的限制)。
缺点:1、主动轮训效率低。2、套接字需要从内核空间拷贝到用户空间,效率低。
epoll模型
epoll模型修改主动轮询为被动通知,当时间发生时,被动接收通知。所以epoll模型注册套接字后,主程序可以做其他事情,当事件发生时,接收到通知后再去处理。修正了select模型的三个缺点(第三点使用共享内存修正-内核空间和用户空间使用相同的空间)。
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技术快餐
更多资料等你来拿!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。