如何编写高性能的Netty客户端

Dav*_*ave 16 tcp protocol-buffers netty

我想要一个非常有效的TCP客户端来发送谷歌协议缓冲消息.我一直在使用Netty库来开发服务器/客户端.

在测试中,服务器似乎能够每秒处理多达500k的事务,而不会遇到很多问题,但客户端往往会以每秒180k的事务数达到峰值.

我的客户端基于Netty文档中提供的示例,但区别在于我只想发送消息而忘记,我不想要响应(大多数示例都得到了).无论如何都要优化我的客户端,以便我可以实现更高的TPS?

我的客户应该维护多个渠道,还是应该能够通过单一渠道实现更高的吞吐量?

Jes*_*jan 17

1)如果客户只对发送感兴趣,而不是接收,则可以始终禁用如下所示的频道阅读

channel.setReadable(false);
Run Code Online (Sandbox Code Playgroud)

2)通过为每个客户端提供多个客户端通道,您可以非常轻松地提高吞吐量,并且它也可以扩展.

3)您可以进行以下调整以提高性能(对于读/写)

  • 通过添加带有OrderdMemoryAwareThreadPoolExecutor的EXecutionHandler(具有最佳值的最小,最大通道内存),可以更好地拥有像pipline这样的SEDA

    bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
        @Override
        public ChannelPipeline getPipeline() throws Exception {
            return Channels.pipeline(
                    executionHandler1,//sharable
                    new MessageDecoderHandler(),
                    new MessageEncoderHandler(),
                    executionHandler2,//sharable
                    new BusinessLogicHandler1(),
                    new BusinessLogicHandler2());
        }
    });
    
    Run Code Online (Sandbox Code Playgroud)
  • 将通道的writeBufferHighWaterMark设置为最佳值(确保设置较大的值不会产生拥塞)

    bootstrap.setOption("writeBufferHighWaterMark", 10 * 64 * 1024);

  • 设置SO_READ,SO_WRITE缓冲区大小

    bootstrap.setOption("sendBufferSize", 1048576); bootstrap.setOption("receiveBufferSize", 1048576);

  • 启用TCP无延迟

    bootstrap.setOption("tcpNoDelay", true);