2017-11-24 5 views
0

나는 매우 무거운 계산을 수행 할 http-server를 작성하고 있습니다. 비즈니스 로직 및 IO 차단과 관련된 일부 인코더 - 디코더 파이프 라인이 있습니다.IO 용 Netty do-nothing 코덱?

.addLast(ioGroup, new ChannelDuplexHandler()) //<---- Only for IO 
.addLast(logicGroup, new HttpRequestDecoder()) 
.addLast(logicGroup, new HttpObjectAggregator(Int.MaxValue)) 
.addLast(logicGroup, new HttpResponseEncoder()) 
.addLast(logicGroup, new ChunkedWriteHandler()) 
.addLast(logicGroup, new ResponseBodyDecoder()) 
.addLast(logicGroup, new MyBusinessLogic()) 

그것의 Netty에서 다음과 같이 할 commmon이다

public void initChannel(Channel ch) { 
    ch.pipeline() 
     //All actions in these handlers are very heavy and involve some IO 
     .addLast(logicGroup, new HttpRequestDecoder()) 
     .addLast(logicGroup, new HttpObjectAggregator(Int.MaxValue)) 
     .addLast(logicGroup, new HttpResponseEncoder()) 
     .addLast(logicGroup, new ChunkedWriteHandler()) 
     .addLast(logicGroup, new ResponseBodyDecoder()) 
     .addLast(logicGroup, new MyBusinessLogic()) 
} 

그래서 나는 또 다른 노동자

EventLoopGroup ioGroup = new NioEventLoopGroup(4) 

을 생성하고 처음에 간단한 처리기를 추가하기로 결정? 아니면 더 나은 방법이 있습니까?

답변

2

보통 IO 스레드에서 핸들러를 실행하려면 파이프 라인에 처리기를 추가 할 때 executorGroup을 지정하지 않는 것이 좋습니다. 나의 제안은 파이프 라인이를 구성하는 것입니다 : 이것은 다른 스레드에 MyBusinessLogic 실행이 있고 IO 스레드를 차단하지 않습니다

EventExecutorGroup executorGroup = new DefaultEventExecutorGroup(numberOfThreads); 

... 

public void initChannel(Channel ch) { 
    ch.pipeline() 
     .addLast(new HttpRequestDecoder()) 
     .addLast(new HttpObjectAggregator(Int.MaxValue)) 
     .addLast(new HttpResponseEncoder()) 
     .addLast(new ChunkedWriteHandler()) 
     .addLast(new ResponseBodyDecoder()) 
     .addLast(executorGroup, new MyBusinessLogic()); 
} 

. ResponseBodyDecoder도 CPU/블록에서 매우 무거 우면 여기 executorGroup을 사용할 수 있습니다.

+0

방금 ​​깨달은 것은 이것입니다. 리트리브 덩어리는 또한 상당한 시간이 걸립니다. 그래서 나는 그것을 IO 쓰레드와 분리 할 것이다. –

+0

'ChunkedInput'에서'HttpResponseEncoder'를 실제로 응답하기까지는 많은 시간이 걸립니다. 'ChunkedInput :: readChunk'는 필자의 경우 무거운 연산이다. –

+0

그런 다음 EvenLoop에서도 이동하십시오. –