20.2.2. 配置 Netty TCP

Netty TCP 是一个简单的、非加密的基于 TCP 套接字的传输协议。Netty TCP 可以使用旧的阻塞式 Java IO,也可以使用非阻塞式的 Java NIO。我们推荐在服务器端使用 Java NIO 以获得更好的扩充性来容纳很多并发连接。如果并发连接的数量较少,Java IO 可以获得比 NIO 更少的延迟。
我们不推荐在不信任的网络里运行 Netty TCP 连接,因为它是非加密的。使用 Netty TCP 时,所有的连接都是从客户端初始化的。

例 20.1. Default EAP 配置里的 Netty TCP 配置示例

<connectors>
  <netty-connector name="netty" socket-binding="messaging"/>
  <netty-connector name="netty-throughput" socket-binding="messaging-throughput">
    <param key="batch-delay" value="50"/>
  </netty-connector>
  <in-vm-connector name="in-vm" server-id="0"/>
</connectors>
<acceptors>
  <netty-acceptor name="netty" socket-binding="messaging"/>
  <netty-acceptor name="netty-throughput" socket-binding="messaging-throughput">
    <param key="batch-delay" value="50"/>
    <param key="direct-deliver" value="false"/>
  </netty-acceptor>
  <in-vm-acceptor name="in-vm" server-id="0"/>
</acceptors>

配置示例也展示了 HornetQ 的 JBoss EAP 6 实现在接收器和连接器配置里是如何使用套接字绑定的。这和 HornetQ 的独立版本不同,它要求声明专门的主机和端口。
下表描述了 Netty TCP 配置属性:

表 20.1. Netty TCP 配置属性

属性 默认值 描述
batch-delay 0 毫秒 在将数据包写入到传输数据之前,HornetQ 可以在最大为 batch-delay 毫秒内批量处理写入操作。这通过增加消息传输的平均延迟,增加了很小型消息的总体吞吐量。
direct-deliver true 当消息到达服务器并被递送给等待的消费者时,在默认情况下,递送是在消息到达的相同线程里完成的。对于相对较小的消息和数量较少的消费者,这可以获得良好的延迟,但减少了吞吐量。对于更高的吞吐量,您可以将其设置为 “false”。
local-address [local address available] 对于 netty 连接器,它用来指定客户在连接远程地址时使用的本地地址。如果没有指定本地地址,那么连接器将使用任何可用的本地地址。
local-port 0 对于 netty 连接器,它用来指定客户在连接远程地址时使用哪个本地端口。如果使用 local-port default(0),那么连接器将让系统选取一个临时端口,其有效值为 0 到 65535。
nio-remoting-threads -1 如果使用 NIO,HornetQ 将默认使用三倍于核心(或 hyper-thread)数量(由 Runtime.getRuntime().availableProcessors() 确定)的线程来处理转入数据包。您可以设置自定义的值来覆盖这个值。
tcp-no-delay true 如果为 true,Nagle 算法将被启用。通过减少在网络上发送的数据包时距离,这个算法有助于提高 TCP/IP 网络的效率。
tcp-send-buffer-size 32768 字节 这个参数确定了 TCP 发送缓冲的大小(字节)
tcp-receive-buffer-size 32768 字节 这个参数确定了 TCP 接收缓冲的大小(字节)
use-nio false 如果为 true,Java 非阻塞式 NIO 将被使用。如果为 false,则使用旧的阻塞式 Java IO。如果您需要服务器处理许多并发连接,请使用非阻塞式 Java NIO,否则请使用阻塞式 Java IO。

注意

Netty TCP 属性对于所有类型的传输协议都是有效的(Netty SSL、Netty HTTP 和 Netty Servlet)。