2013-05-23 2 views
0

많은 요청을 받아야하는 빠르고 빡빡한 HTTP 서버를 작성하고 있으므로 Netty의 HTTP 서버 구현이 매우 간단하고 작업을 수행하기 때문에 지난 날 Netty를 탐색 해 왔습니다.비동기 Netty HttpServer 및 HttpClient

내 다음 단계는 요청 처리의 일부이므로 외부 웹 서버에 HTTP 요청을 시작해야합니다. 내 직관은 동시에 많은 요청을 보낼 수있는 비동기 클라이언트를 구현하는 것이지만 올바른 접근 방식으로 약간 혼란 스럽다. 내 이해 Netty 서버 각 수신 메시지에 대한 작업자 스레드를 사용하는, 따라서 해당 작업자 스레드가 내 처리기가 작업을 완료 할 때까지 새 메시지를 받아들이도록 해제되지 것입니다. 여기에 펀치가 있습니다. 비동기식 HTTP 클라이언트가 있어도 각 응답을 기다려야하고 서버 처리기로 처리해야 할 필요는 없습니다. 동일한 작업자 스레드가이 모든 시간 동안 차단 상태를 유지합니다. 다른 방법은 클라이언트의 비동기 성질을 사용하여 미래의 객체를 신속하게 반환하여 스레드를 해제하고 리스너를 배치하는 것입니다 (클라이언트에 200 또는 202 상태를 리턴해야 함을 의미 함). 받은 및 클라이언트에 밀어 수 있습니다.

의미가 있습니까? 나는 내 가정과 어울려? 그런 종류의 Netty 액세서 서버 + 높은 동시성을 가진 외부 클라이언트를 구현하는 좋은 방법은 무엇입니까? 당신을 가정

감사합니다,

답변

2

는 인 Netty 4에 대해 요구하고

의 Netty 그렇게 같은 요청을 수락하고 채널을 실행하기 위해 사용하는 작업자 스레드의 고정 번호가됩니다 ServerBootstrap로 구성 : 귀하의 경우에는

Two threads accepting/processing requests 
bootstrap.group(NioEventLoopGroup(2)) 

One thread accepting requests, two threads processing. 
bootstrap.group(NioEventLoopGroup(1), NioEventLoopGroup(1)) 

, 당신은 채널 자체가 나가는 HTTP 요청을 만드는 HTTP를 코덱의 디코딩/인코딩 물건의 무리와 자신의 핸들러가 포함되어 있습니다. 서버가 들어오는 요청을 수락하거나 들어오는 HTTP 메시지를 디코딩하지 못하도록 막으려 고하지 말고,이를 완화하기 위해 수행 할 수있는 두 가지 작업이 있습니다.

먼저 비동기 netty 클라이언트를 사용하여 나가는 요청을 만들고, 나가는 요청이 반환 될 때 청취자가 원래 요청 채널에 응답을 쓰도록합니다. 즉, 차단 및 대기를하지 않기 때문에 요청을 처리하는 데 사용할 수있는 스레드 수보다 더 많은 동시 나가는 요청을 처리 할 수 ​​있습니다. 돈 보내는 요청을 의미

// Two separate threads to execute your outgoing requests.. 
EventExecutorGroup separateExecutorGroup new DefaultEventExecutorGroup(2); 

bootstrap.childHandler(new ChannelInitializer<SocketChannel>() { 
    @Override 
    public void initChannel(SocketChannel ch) { 
     ChannelPipeline pipeline = ch.pipeline(); 
     .... http codec stuff .... 
     pipeline.addLast(separateExecutorGroup, customHandler); 
    } 
}; 

:

둘째, 당신이 그것을 받아들이는 별도의 스레드에서 실행 의미 자체 EventExecutorGroup에서 사용자 정의 핸들러 실행을 가질 수/HTTP 채널 핸들러, 그래서 같은 코덱 들어오는 것들을 받아들이거나/처리하는데 사용될 쓰레드가 없다.

+0

답장을 보내 주셔서 감사합니다. 첫 번째 옵션을 사용하면 스레드/스레드 풀이 사용되는 리스너가 응답을 처리 할 때? 그리고 두 번째 옵션을 사용하면 어떤 블록과 '차단하고 싶지 않은 다른 논리'사이에 '중요/필수 처리'사이의 선을 그릴 수 있는지를 알 수 있습니다. 예를 들어 설명하면 처리 할 수 ​​있습니다. 내 이해가 맞습니까? – user2413964