소개
우리는 항상 말했다 Netty
결국 왜 고성능 애플리케이션이 인 고성능 서버입니다? 스레딩 모델은 직접 네트워크 응용 프로그램의 성능에 영향을 미치는 것이 문서 Netty
모델의 시작을 멀티 스레드는 고성능 특성을 발표했다.
멀티 스레딩 모델
질문 (1) 기존의 IO 모델
우리 자신 인 경우 Netty
네트워크 응용 프로그램의 디자이너, 당신은 고성능 네트워크 애플리케이션을 설계 할, 얼굴 첫 번째 문제는 네트워크 프로그래밍의 성능 병목 현상을 해결하는 방법입니다. 따라서 네트워크 애플리케이션 성능 병목 현상은 무엇인가? 우리는 모두 사용하는 기존의 네트워크 응용 프로그램을 알고 BIO
차단하는 모델 IO
. 네트워크 프로그램의 처리 중 read()
및 write()
동작은 현재 스레드를 차단하는 것이다. 따라서, 종래의 IO
각 모델 사이 socket
의 접속 처리를위한 별도의 쓰레드를 가질 것이다.
그러나 인터넷의 현재 시대에, 클라이언트 연결은 수백만 - 수십억 수준은, 서버가 핸들 클라이언트 요청에 너무 많은 스레드를 만들 수 없습니다 수 있습니다. 이것은 전통적인 IO
성능 병목 네트워크 연결.
(2) 최적화 모델
기존의 내용으로 IO
성능 병목 모델은 각 서버에 필요한 socket
비즈니스 프로세스의 요구를 충족하기 위해 스레드를 할당 연결. 또한 클라이언트 요청을 처리 할 수있는 많은 연결을 설정할 필요가 없습니다 수있는 방법이 있습니까? 당신이 스레드가 여러 요청을 처리 할 경우 BIO
달성 할 수 없습니다. 따라서, 우리는 사용할 수 뛰어난 최적화이 섹션의 작업을. 연습은 사용하는 모드로, 소위 모드에서는 I / O 다중 동기화 메커니즘의 블로킹을 사용하는 모드입니다. 더 이상 설명을 확장 없습니다.java
NIO
Netty
Reactor
Reactor
에서 Netty
세계, EventLoopGroup
그것은 매우 중요한 핵심 개념이다. 소위는 EventLoopGroup
점이다 EventLoop
컬렉션이 이벤트 루프입니다. 어떤 NioEventLoop
폴링 멀티플렉서에 대한 책임, 수집 채널은 네트워크 연결, 클라이언트 액세스를 요청, 읽기 및 쓰기 관련 작업을 수행, 준비 상태 이미 사용 중입니다. bossGroup
이 연결 요청을 처리하는 데 사용되며, workerGroup
핸들 읽기 및 쓰기 요청에 사용됩니다. bossGroup
연결 요청을 처리 한 후, 접속에 제출할 것 workerGroup
, 처리 될 workerGroup
복수 갖고 EventLoop
, workerGroup
실제 읽기 및 쓰기 동작을 처리 할 수있다. 새 연결하는 전달됩니다 EventLoop
그것을 다루는? 이것은 부하 분산 알고리즘이 필요 Netty
폴링 알고리즘에 사용됩니다. Netty
지지체 여러 Reactor
같은 단일 스레드 모델 및 멀티 스레드로부터 마스터 모델로 모드는, 사용자가 실제 장면에 대응하는 스위칭 패턴을 시작하도록 파라미터를 설정할 수 있고, 다중 스레드 모델.
(3) 분석 코드
A, 단일 스레드 모델
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
try {
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup)
.channel(NioServerSocketChannel.class)
...
}
...
코드를 볼 수있는 바와 같이, 파라미터 생성 한 bossGroup
주로 EventLoopGroup 클라이언트 연결을 수신에 사용되며, 단일 스레딩 모델이다.
B, 멀티 스레딩 모델
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
...
}
...
그리고 다른 단일 스레드 모드는, 생성 된 멀티 스레드 모드 workerGroup
핸들을 IO
조작은 기본 수는 CPU 수의 두 배입니다.
C, 멀티 스레딩 마스터 모델
이 모델, 더 이상 하나의 클라이언트 연결을 수신 스레드에서 NIO
스레드를, 오히려 스레드 풀.
//创建boss线程组,处理客户端连接
EventLoopGroup bossGroup = new NioEventLoopGroup(2);
// 创建worker线程组用于SocketChannel 的数据读写
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
// 创建 ServerBootstrap 对象
ServerBootstrap b = new ServerBootstrap();
// 设置EventLoopGroup
b.group(bossGroup, workerGroup)
// 设置要被实例化的为 NioServerSocketChannel 类
.channel(NioServerSocketChannel.class)
...
}
...
개요
본 논문은 설명 Netty
에서 사용되는 다중 스레드 모델, Reactor
모델을. 접속 요청 처리 프로세싱 IO
스레드 절연 조작. 이벤트 기반 설문 조사 모니터링, 준비 상태의 채널에 지속적으로 액세스 할 수 있습니다. 상기 식에서 Boss
연결 요청 처리를 담당 스레드 풀 스레드 후, 수신 된 이벤트, 해당 동의를 socket
캡슐화 생성 NioSocketChannel
객체를과에 제출 workBoss
스레드 풀의 IO 처리 read
및 write
이벤트.