안녕하세요? vertx의 sockjs를 이용해 실시간 스트리밍 서버를 만들어보는 도중 궁금증이 있어 질문 올리게 되었습니다.
다름아니라 스트림 하는 데이터가 꽤 많은 상황에서 connection reset by peer 에러가 발생하면 vertx의 NetSocketImpl에서는 큐에 쌓인 것들을 차례로 write, flush 하고 후속처리를 하는것으로 보입니다.
그런데 이 경우 이미 끊긴 소켓을 향해 flush 하느라 대략 아래와 같은 메세지가 수만에서 수십만개 정도가 떨어지는것 같습니다(아마 큐에 쌓인 메세지 개수 혹은 크기에 따라 다른것 같습니다).
아래 stack trace를 따라가보면 NioEventLoop으로 전달된 flush 명령의 작동과정인것 같은데.. vertx로 wrapping된 소켓단에서는 제어할 수 있는 부분이 없어보였습니다.
혹시 제가 상황 파악을 제대로 한 것이 맞을까요? 만약 그렇지 않다면 이게 어떤 상황인것인지.. 혹 해결방법이 있을지 궁금합니다.
2018-01-11 09:10:25.865 ERROR 19082 --- [vert.x-eventloop-thread-3] io.vertx.core.net.impl.ConnectionBase : java.io.IOException: 연결이 상대편에 의해 끊어짐
2018-01-11 09:10:25.865 ERROR 19082 --- [vert.x-eventloop-thread-3] c.d.s.r.publisher.front.VerticleImpl : SockJsSocket(
172.51.2.195:57369) ExceptionHandler : 연결이 상대편에 의해 끊어짐
java.io.IOException: 연결이 상대편에 의해 끊어짐
at sun.nio.ch.FileDispatcherImpl.writev0(Native Method)
at sun.nio.ch.SocketDispatcher.writev(SocketDispatcher.java:51)
at sun.nio.ch.IOUtil.write(IOUtil.java:148)
at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:504)
at io.netty.channel.socket.nio.NioSocketChannel.doWrite(NioSocketChannel.java:433)
at io.netty.channel.AbstractChannel$AbstractUnsafe.flush0(AbstractChannel.java:875)
at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.forceFlush(AbstractNioChannel.java:368)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:639)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:580)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:497)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:459)
at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858)
at java.lang.Thread.run(Thread.java:748)