繁体   English   中英

是否可以使用数千个长期运行的 TCP 连接创建可扩展的 WCF 服务?

[英]Is it possible create a scalable WCF service with thousands of long-running TCP connections?

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

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

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

谢谢!

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

Net.tcp connections use transport session which leads to PerSession instancing of WCF service - the single service instance servers all requests and lives for the whole duration of the session (weeks or months in your case) = instance and whole its content is still in the memory。 任何中断或未处理的异常都会中断通道并关闭 session = 所有会话的本地数据都丢失,客户端必须创建新的代理才能再次启动新的 session。 此外,任何超时(默认为 20 分钟不活动)都将关闭 session。 最后 - 根据业务逻辑的复杂性,您会发现即使数百个客户端需要同时处理,单个服务器也无法为所有客户端提供服务,并且某些客户端将超时(再次中断会话)。 允许使用 net.tcp 进行负载平衡需要具有粘性会话(会话亲和性)的负载平衡算法,并且整个架构变得更加复杂和脆弱。 net.tcp 中的可扩展性意味着服务可以部署在多台服务器上,但整个客户端 session 必须由单个服务器处理(如果服务器终止,则服务器服务的所有会话也终止)。

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

编辑:

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

使用 TCP 时,您不需要维护代理 / session 打开只是为了保持打开连接。 TCP 关闭代理时连接不会立即关闭。 它会在短时间内在池中保持打开状态,如果任何其他代理需要连接到同一台服务器,它会被重用(池中的默认空闲超时应为 2 分钟) - 我在另一个答案中讨论了 WCF 中的 Net.Tcp 传输

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM