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

| 我正在尝试创建WCF服务,其中数千个(〜10,000个)客户端可以通过双工NetTcpBinding连接更长的时间(数周,甚至数月)。 经过一番阅读之后,似乎比使用自定义应用程序或Windows服务托管在IIS中更好。 将WCF用于此类服务是否可以接受,甚至可以?如果是这样,我应该在哪里遇到限制或性能问题,例如增加WCF ListenBacklog和MaxConcurrentConnections? 谢谢!     
已邀请:
        为什么您需要保持打开连接数周/数月?这将带来很多复杂性,超时处理,错误处理,重新创建连接等。我什至怀疑这样做是否可行。 Net.tcp连接使用传输会话,这导致WCF服务的“ 0”实例化-单个服务实例在会话的整个持续时间(您的情况是几周或几个月)中托管所有请求和生存=实例,并且其内容仍在记忆。任何中断或未处理的异常都会中断通道并关闭会话=所有会话的本地数据都将丢失,并且客户端必须创建新的代理才能重新启动新的会话。同样,任何超时(默认为20分钟不活动)都将关闭会话。最后,根据业务逻辑的复杂性,您会发现,即使数百个客户端需要在同一时间进行处理,单个服务器也无法为所有服务器提供服务,并且某些客户端将超时(再次中断会话)。允许使用net.tcp进行负载平衡需要具有粘性会话(会话相似性)的负载平衡算法,并且整个体系结构变得更加复杂和脆弱。 net.tcp中的可伸缩性意味着该服务可以部署在多个服务器上,但是整个客户端会话必须由单个服务器处理(如果服务器死了,那么服务器所服务的所有会话也都死了)。 在IIS / WAS / AppFabric中托管具有多个优势,其中两个是运行状况监视和流程回收。运行状况监视持续检查工作进程是否仍在运行并且可以处理请求-如果不是,它会静默启动新工作进程并将新的传入请求路由到该进程。流程回收会定期回收(默认设置为29小时后)应用程序域,从而使流程正常运行并减少内存泄漏。副作用是重新创建过程或应用程序域都将杀死所有会话。自行托管服务后,您将失去所有服务,因此您必须自己应对服务的健康状况。 编辑: IMHO健康状态信息不必通过TCP发送。那是不需要所有花哨的东西的信息。如果丢失了一些信息,则不会有任何影响;您可以将UDP用于健康状态传输。 使用TCP时,无需保持打开代理/会话的权限,只需保持打开连接即可。关闭代理时,TCP连接不会立即关闭。它在池中保持打开状态的时间很短,如果任何其他代理需要连接到同一台服务器,则该服务器将被重用(池中的默认空闲超时应为2分钟)-我在另一个答案中讨论了WCF中的Net.Tcp传输。 我不喜欢回调-WCF中的整个概念被过度使用和滥用。保持10.000 TCP连接打开数月,以防有时能够将数据发送回几台PC听起来很可笑。如果需要与PC通信,请在PC上公开该服务,并在需要发送一些命令时调用它。只需添加在PC启动时以及PC将要关闭时将调用服务器的功能+添加传输监视信息。 无论如何,每分钟有10.000台PC发送信息-这可能会导致您同时收到10.000个请求-与拒绝服务攻击具有相同的效果。根据处理时间的不同,您的服务器可能无法处理它们,许多请求将超时。您还可以考虑一些消息队列或发布-订阅协议。消息将被传递到队列或主题,服务器将连续对其进行处理。     

要回复问题请先登录注册