是否可以创建一个具有数千个长时间运行的TCP连接的可扩展WCF服务



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

经过一点阅读,似乎在IIS中托管比在自定义应用程序或Windows服务中托管要好。

对这样的服务使用WCF是可以接受的,甚至是可能的吗?如果是这样,我在哪里会遇到节流或性能问题,例如增加WCF ListenBacklog&最大并发连接?

谢谢!

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

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

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

编辑:

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

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

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

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

最新更新