未在通道上设置远程通道创建选项值

Remoting channel creation options values not set on Channel

我是 运行 EAP 7.1.0 CR2 并且在远程连接的通道创建选项中看到了一些奇怪的东西。用于远程 EJB 调用。未在 xnio 层上设置选项配置。我发现 TCP_NODELAY 属性 未在通道上设置为我在创建时指定的值。

在我的独立 full.xml 文件中,我的远程连接 XNIO 属性设置为

<remote connector-ref="http-remoting-connector" thread-pool-name="ejbWorker">
    <channel-creation-options>
        <option name="READ_TIMEOUT" value="${prop.remoting-connector.read.timeout:20}" type="xnio"/>
        <option name="TCP_NODELAY" value="false" type="xnio"/>
        <option name="WORKER_READ_THREADS" value="2" type="xnio"/>
        <option name="WORKER_WRITE_THREADS" value="2" type="xnio"/>
        <option name="MAX_INBOUND_MESSAGES" value="300" type="remoting"/>
        <option name="MAX_OUTBOUND_MESSAGES" value="300" type="remoting"/>
    </channel-creation-options>
</remote>

我希望远程处理子系统能够设置这些。但是 XNIO 上的 TRACE 日志记录显示它没有。这是日志消息。

2017-11-22 19:42:20,170 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: JBoss EAP 7.1.0.GA (WildFly Core 3.0.3.Final-redhat-1) started in 265750ms - Started 1371 of 1652 services (502 services are lazy, passive or on-demand)
2017-11-22 19:43:22,937 TRACE [org.jboss.remoting.remote.connection] (ejbWorker I/O-2) Initialized connection from /192.168.0.4:48861 to /192.168.0.4:8084 with options {org.xnio.Options.TCP_NODELAY=>true,org.jboss.remoting3.RemotingOptions.SASL_PROTOCOL=
>remote,org.xnio.Options.REUSE_ADDRESSES=>true}

查看 wildfly-core 远程处理子系统中的代码,org.jboss.as.remoting.HttpConnectorAdd.launchServices 方法使用 org.jboss.as.remoting.ConnectorUtils.getFullOptions 获取属性映射。默认为此

{org.jboss.remoting3.RemotingOptions.SASL_PROTOCOL=>remote,org.xnio.Options.TCP_NODELAY=>true,org.xnio.Options.REUSE_ADDRESSES=>true}

我希望 OptionsMap 得到更新。使用频道创建选项中的设置。我的期望是错误的吗?

此致, 杰里米

无法禁用 TCP_NODELAY 套接字选项,因为这样做会干扰远程处理协议的正确操作。

我确实探索过在 Linux 上使用 TCP_CORK 来提高吞吐量而不牺牲延迟,它似乎工作得很好,但是它需要一个完成且经过良好测试的本机 XNIO 实现目前(充其量)是一个附带实验。

EJB 子系统 remote/channel-creation-options 设置不通过 org.jboss.as.remoting.HttpConnectorAdd。它们被传递到 org.jboss.as.ejb3.remote.EJBRemoteConnectorService,在那里它们被传递到远程处理 Endpoint.registerService 调用。 AFAICT 他们只有从传递给该方法的 OptionMap 中读取的选项是

  • RemotingOptions.TRANSMIT_WINDOW_SIZE,

  • RemotingOptions.MAX_OUTBOUND_MESSAGES

  • RemotingOptions.RECEIVE_WINDOW_SIZE

  • RemotingOptions.MAX_INBOUND_MESSAGES

  • RemotingOptions.MAX_OUTBOUND_MESSAGE_SIZE
  • RemotingOptions.MAX_INBOUND_MESSAGE_SIZE.

这是由 org.jboss.remoting3.remote.RemoteReadListener 完成的,因为它会在连接上收到通道打开请求后设置通道。