다섯 시리즈의 Netty 소스 코드 분석 :의 Netty 멀티 스레드 모델

소개

우리는 항상 말했다 Netty결국 왜 고성능 애플리케이션이 인 고성능 서버입니다? 스레딩 모델은 직접 네트워크 응용 프로그램의 성능에 영향을 미치는 것이 문서 Netty모델의 시작을 멀티 스레드는 고성능 특성을 발표했다.

멀티 스레딩 모델

질문 (1) 기존의 IO 모델

우리 자신 인 경우 Netty네트워크 응용 프로그램의 디자이너, 당신은 고성능 네트워크 애플리케이션을 설계 할, 얼굴 첫 번째 문제는 네트워크 프로그래밍의 성능 병목 현상을 해결하는 방법입니다. 따라서 네트워크 애플리케이션 성능 병목 현상은 무엇인가? 우리는 모두 사용하는 기존의 네트워크 응용 프로그램을 알고 BIO차단하는 모델 IO. 네트워크 프로그램의 처리 중 read()write()동작은 현재 스레드를 차단하는 것이다. 따라서, 종래의 IO각 모델 사이 socket의 접속 처리를위한 별도의 쓰레드를 가질 것이다.
그림 삽입 설명 여기
그러나 인터넷의 현재 시대에, 클라이언트 연결은 수백만 - 수십억 수준은, 서버가 핸들 클라이언트 요청에 너무 많은 스레드를 만들 수 없습니다 수 있습니다. 이것은 전통적인 IO성능 병목 네트워크 연결.

(2) 최적화 모델

기존의 내용으로 IO성능 병목 모델은 각 서버에 필요한 socket비즈니스 프로세스의 요구를 충족하기 위해 스레드를 할당 연결. 또한 클라이언트 요청을 처리 할 수있는 많은 연결을 설정할 필요가 없습니다 수있는 방법이 있습니까? 당신이 스레드가 여러 요청을 처리 할 경우 BIO달성 할 수 없습니다. 따라서, 우리는 사용할 수 뛰어난 최적화이 섹션의 작업을. 연습은 사용하는 모드로, 소위 모드에서는 I / O 다중 동기화 메커니즘의 블로킹을 사용하는 모드입니다. 더 이상 설명을 확장 없습니다.javaNIONettyReactorReactor

에서 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 처리 readwrite이벤트.

게시 88 개 원래 기사 · 원 찬양 49 ·은 10 만 + 조회수

추천

출처blog.csdn.net/Diamond_Tao/article/details/105031472