lost server replies/errors with netty's object decoder

Viewed 301

I have a very simple netty app which serves both as server and a client.

Client uses channel.writeAndFlush() to send request to server and then blocks on monitor.wait().

In client's InboundAdapter in channelRead() I find the appropriate monitor and do monitor.notify() to let the requesting client thread to proceed working on the server's reply.

On the server in ChannelHandler's channelRead() I do the following:

To limit the amount of requests being processed I submit a task which does the real work as a new task to existing EventLoop: ctx.executor().submit(new Task()). I that task I do heavy IO operations and after that I writeAndFlush() results back to client.

Here is my pipeline setup:

new ObjectEncoder(), 
new ObjectDecoder(LibConstants.Search.MAX_REQUIEST_SIZE, ClassResolvers.cacheDisabled(null))

Here is the bootstrap config:

new ServerBootstrap()
   .channel(NioServerSocketChannel.class)
   .option(ChannelOption.SO_BACKLOG, 1000)
   .option(ChannelOption.SO_KEEPALIVE, true)

I have 2 problems:

  1. Rather often I get io.netty.handler.codec.DecoderException: java.io.UTFDataFormatException on the client when receiving a reply from server. I cannot find any obvious reason for this. Since my pipeline setup is so simple.
  2. A reply from the server just wouldn't appear on the client. I the logs I see a successful flush on the server but the reply never arrived at the client. This is very hard to deal with since my app is very latency sensitive. Any timeout I would set will kill my user experience. This all happens over a VPN network so there is a possibility that VPN device misbehaves in some weird way but I hoping that TCP would handle any sort of packet loss/corruption which can happen in the channel.

Any advice or experience you can share will be very appreciated!

0 Answers
Related