Channler.write() 에는 파라메터로 Object 타입이 들어가게 되어있는데, 그렇게 되면 Response를 전송하는
시점에 전송해야할 데이터가 모두 메모리로 올라오게 될것 같은데,
다운로드 대상이 1G 이상이 되는 대용량 파일이어서 이렇게 되면 메모리가 부족해서 문제가 될듯 합니다.
대용량 파일 전송부분 어떻게 구현하면 되는지 팁 좀 부탁드려요.
혹시 대용량 파일의 경우, nio보다 io를 사용하는게 효과적인가요?
답변 부탁드립니다. 플리즈~~
2009/2/13 cappuccino <anda...@gmail.com>:
> 안녕하세요.
> NIO Framework을 이용해 HTTP로 파일 전송하는 부분에 대해서 스터디를 하고 있는 중입니다.
> Netty API를 살펴보면, Handler에서 ByteBuffer를 이용한 부분이
> ByteBufferBackedChannelBuffer만 있는것으로 보입니다.
> 근데 제가 원하는 부분은 대용량 파일 전송이라, Response를 스트림으로 보내는 것이 필요합니다.
>
> Channler.write() 에는 파라메터로 Object 타입이 들어가게 되어있는데, 그렇게 되면 Response를 전송하는
> 시점에 전송해야할 데이터가 모두 메모리로 올라오게 될것 같은데,
> 다운로드 대상이 1G 이상이 되는 대용량 파일이어서 이렇게 되면 메모리가 부족해서 문제가 될듯 합니다.
> 대용량 파일 전송부분 어떻게 구현하면 되는지 팁 좀 부탁드려요.
여러 개로 쪼개서 하나씩 보내시면 됩니다. 예를 들어 8KB 씩 읽어서 하나씩 쓰되 Channel.isWritable() 이
false 를 리턴하면 channelInterestChanged() 이벤트가 발생할 때까지 기다렸다가 다시
Channel.isWritable() 체크하면서 전송하시면 메모리 넘치지 않게 하면서 보내실 수 있습니다. Discard
예제의 클라이언트를 보시면 감이 잡히실 듯 하네요.
> 혹시 대용량 파일의 경우, nio보다 io를 사용하는게 효과적인가요?
> 답변 부탁드립니다. 플리즈~~
딱히 성능 차이가 있다고 말하기 어렵습니다. 커넥션 수가 많을 수록 NIO 가 유리합니다. 또한 Netty 는 IO 와
NIO 를 모두 지원합니다. 동일 API 를 사용하되 생성자만 바꿔 주면 NIO / IO 전환이 가능합니다.
org.jboss.netty.channel.socket.oio 패키지를 참조하시길 바랍니다.
그럼^^
-- Trustin Lee, http://gleamynode.net/