使用 netTcpBinding 的慢(ish)WCF 连接速度

Posted

技术标签:

【中文标题】使用 netTcpBinding 的慢(ish)WCF 连接速度【英文标题】:Slow(ish) WCF connection speed with netTcpBinding 【发布时间】:2012-02-21 02:27:46 【问题描述】:

我知道这个主题已经在 SO 上多次提出,但我找不到我正在寻找的关于 WCF 的预期连接延迟的确切答案。

基本上我有一个自托管的 WCF 服务(服务器),它在工厂环境中进行警报处理。这些警报的端到端延迟需要最小化,所以我正在研究连接时间。警报以不同的方式传递,其中之一是通过 netTcpBinding WCF 服务。 atm 的另一个服务应用程序(客户端)。在同一台服务器上运行正在使用服务器通过此绑定传递警报,通常效果很好。

我的问题是来自客户端的初始连接延迟,因为 IChannel.Open() 调用需要 100-500 毫秒。平均约 300 毫秒。通过 TCP/IP 在同一台服务器上创建连接似乎非常高。 (使用原始套接字进行快速测试,我得到了大约 1 毫秒的连接速度。)

在客户端中,我在启动时手动创建 ChannelFactory,并在需要发送警报时将其重用于“channelFactory.CreateChannel()”。在此之后,我明确地 Open() IChannel,这是我担心的时间。该服务发送一批警报,然后关闭并处置 IChannel。快速重新连接需要 0 毫秒,但考虑到我现在在没有启用安全等功能的情况下运行以进行测试,因此通常需要 3-5 分钟才能发出警报,然后在“长时间”暂停后重新打开速度很慢。

我的绑定配置非常基本:

<binding name="AlarmService_NetTcpBindingConfig"
            hostNameComparisonMode="StrongWildcard"
            closeTimeout="00:01:00"
            portSharingEnabled="false"
            listenBacklog="20"
            maxConnections="50"
            transactionFlow="false"
            transferMode="Buffered"
            >
    <security mode="None">
        <message clientCredentialType="None" />
        <transport clientCredentialType="None" protectionLevel="None" />
    </security>
    <reliableSession enabled="false" />
</binding>

所以基本上问题是(除了贩卖挫败感:)),如果这是我可以通过 WCF netTcpBinding 预期的连接延迟?

我唯一能想到的还没有尝试过的就是按照“配置Net.TCP端口共享服务”文章(http://msdn.microsoft.com/en-us/library/ aa702669.aspx),看看是否有帮助。连接共享(尽管如上所述为绑定禁用)可能是问题吗?还有其他人研究过连接速度/延迟吗?

【问题讨论】:

【参考方案1】:

您可以尝试代理池。 Here is a sample

如果您在 IIS 上托管服务,则必须启动 nettcp 端口共享服务。它允许您在多个 wcf 服务之间共享一个端口。我认为这对打开频道的性能没有任何影响

【讨论】:

客户端仅打开一个连接,并且此连接“长时间”处于空闲状态(通常为 3-5 分钟),所以我看不出代理池在这种情况下有何帮助?底层的 TCP/IP 连接肯定会关闭。 (除了看起来我得到了一个开放的连接,如果我在短时间内重新连接,因为这需要大约 0 毫秒。)根据我所做的研究,它是 ChannelFactory 应该花费“大量”时间来创建,并且已经被缓存了。 关于端口共享 - 我是自托管 WCF 服务,所以我不需要端口共享。一些博客等已经表明它可能是一种性能。问题虽然,但100-500毫秒。我给你的似乎有点过分了。这几乎是唯一的事情(通过编辑 SMSvcHost.exe.config 文件禁用它)我还没有尝试过,所以如果有人有这方面的经验,我想知道。 :)

以上是关于使用 netTcpBinding 的慢(ish)WCF 连接速度的主要内容,如果未能解决你的问题,请参考以下文章

使用 netTcpBinding 时,在 WCF 中实现加密的最简单方法是啥?

NetTcpBinding(读取 WindowsStreamSecurityBindingElement)如何加密/签署消息?

使用 netTcpBinding 为 WCF 服务启用基于证书的身份验证

无法在 Fiddler 中显示 netTcpBinding 请求

Azure:使用完整 IIS 的内部 WebRole 通信 (netTcpBinding)

netTcpBinding 或 wsHttpBinding