2012-11-19 4 views
0

TCP Netty 서버에 비동기 적으로 메시지를 보내는 Netty 클라이언트가 있습니다.서버 오류를 방지하기위한 메시지 대기열

주문을 유지하기 위해 서버 ChannelPipeline에는 ExecutionHandlerOrderedMemoryAwareThreadPoolExecutor이 결합되어 있습니다.

내 이해는 서버에 보낸 메시지가 채널에 대기열에 올라 있다는 것입니다. 메시지가 채널에 대기 중일 때 서버가 죽으면 메시지 손실을 방지해야합니다.

나의 현재 솔루션은 클라이언트 측에서 큐에 각 메시지를 추가하고 내가 각 메시지의 서버로부터 긍정 응답 메시지를 수신 할 경우에만 대기열에서 작업을 제거하는 것입니다. 어떻게 생각해?

답변

1

당신이 제안하는 것은 상당히 일반적이며 보내기 창이라고도합니다. 이전에 비슷한 기술을 사용해 왔지만 서버에서 이론적으로 처리하고 순서를 잘못 인식 할 수 있기 때문에 보낸 메시지를지도에 저장했습니다. 비동기 전송 할 수 SMPP 같은 프로토콜과도 JMS 공급자 (예를 들어 hornetQ을)처럼

TCP는 유사한 기술을 사용합니다. HTTP 파이프 라이닝은 비슷하지만 요청을 처리하고 승인해야합니다.

고려해야 할 사항 중 하나는 서버가 재전송 된 메시지로 수행하는 작업입니다. 이미 원래 메시지를 처리했을 수도 있지만 고객에게 도착하기 전에 확인이 손실되었습니다. 예를 들어, 메시지가 일종의 지불을 요구하는 경우, ack가 없어져서 두 번 청구하지 않으려 고합니다.