c# - 是否可以创建具有数千个长时间运行的 TCP 连接的可伸缩 WCF 服务?

标签 c# wcf .net-4.0 nettcpbinding

我正在尝试创建一个 WCF 服务,其中数千(~10,000)个客户端可以通过双工 NetTcpBinding 连接很长一段时间(几周,也许几个月)。

经过一些阅读,看起来托管在 IIS 中比自定义应用程序或 Windows 服务更好。

将 WCF 用于此类服务是否可以接受,甚至可能?如果是这样,我会在哪里遇到限制或性能问题,例如增加 WCF ListenBacklog 和 MaxConcurrentConnections?

谢谢!

最佳答案

为什么您需要将打开的连接保持数周/数月?这将引入很多复杂性、超时处理、错误处理、重新创建连接等。我什至怀疑这是否可行。

Net.tcp 连接使用传输 session 导致 WCF 服务的 PerSession 实例化 - 单个服务实例服务器所有请求并在整个 session 期间(在您的情况下为数周或数月) = instance and whole 它的内容仍然在内存中。任何中断或未处理的异常都会中断 channel 并关闭 session = 所有 session 的本地数据都将丢失,客户端必须创建新代理才能再次启动新 session 。此外,任何超时(默认为 20 分钟不活动)都将关闭 session 。最后 - 根据业务逻辑的复杂性,您会发现即使有数百个客户端需要同时处理,单个服务器也无法为所有客户端提供服务,并且一些客户端会超时(再次中断 session )。允许使用 net.tcp 进行负载平衡需要具有粘性 session ( session 亲和性)的负载平衡算法,整个体系结构变得更加复杂和脆弱。 net.tcp 中的可伸缩性意味着服务可以部署在多个服务器上,但整个客户端 session 必须由单个服务器处理(如果服务器死掉,服务器服务的所有 session 也会死掉)。

在 IIS/WAS/AppFabric 中托管有几个优势,其中两个是健康监控和进程回收。健康监控持续检查工作进程是否仍然存在并且可以处理请求 - 如果它不存在,它会静默启动新的工作进程并将新的传入请求路由到该进程。进程回收定期回收(默认设置为 29 小时后)应用程序域,使进程健康并减少内存泄漏。副作用是重新创建进程或应用程序域都会终止所有 session 。一旦您自行托管服务,您将失去所有服务,因此您必须自己处理服务的健康状况。

编辑:

恕我直言,健康状态信息不必通过 TCP 发送。那是不需要所有花哨的东西的信息。如果你丢失了一些信息,它不会影响任何东西 = 你可以使用 UDP 进行健康状态传输。

当使用 TCP 时,您不需要为了保持连接打开而保持代理/ session 打开。关闭代理时,TCP 连接不会立即关闭。它在池中保持打开状态很短的时间,如果任何其他代理需要连接到同一服务器,它会被重用(池中的默认空闲超时应为 2 分钟)- I discussed Net.Tcp transport in WCF in another answer .

我不喜欢回调——WCF 中的整个概念都被过度使用和滥用了。保持 10.000 个 TCP 连接打开几个月,以防有时能够将数据发送回几台 PC,这听起来很荒谬。如果你需要和 PC 通信,暴露 PC 上的服务,当你需要发送一些命令时调用它。只需添加在PC启动和PC即将关闭时调用服务器的功能+添加传输监控信息。

无论如何,每分钟有 10,000 台 PC 发送信息 - 这可能会导致您同时收到 10,000 个请求 - 它的效果与拒绝服务攻击相同。根据处理时间,您的服务器可能无法处理它们,许多请求将超时。您还可以考虑一些消息队列或发布-订阅协议(protocol)。消息将传递到队列或主题,服务器将持续处理它们。

关于c# - 是否可以创建具有数千个长时间运行的 TCP 连接的可伸缩 WCF 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6234192/

相关文章:

c# - 迁移到 .Net 4 : Null reference exceptions thrown when adding event in xaml

c# - PrivateFontCollection.AddMemoryFont 是否适用于 WOFF 文件?

c# - 将文本拆分为 2 种颜色

c# - 使用证书保护 IIS 中的 WCF 服务

c# - Nullable<DateTime> 在 WCF 服务中始终为 null?

c# - 能够在 WCF 中将主体对象从客户端传送到服务端

c# - 以 ASP.NET MVC 表格形式动态添加行

c# - MVC 5 尝试注册新帐户并获取 "Invalid column name ' 用户名'。”

.net-4.0 - 具有 Microsoft.Bcl.Async 的 .NET 4.0 应用程序无法在 .NET 4.5 构建服务器上构建

java - 在asp.net 4.0应用程序中使用Java .jar包?