【发布时间】:2015-01-16 12:24:57
【问题描述】:
我有一个通过 Net.TCP 绑定托管的 WCF 服务,许多客户端 (> 100) 可以连接到该服务并接收各种广播消息。相同的消息被发送到所有客户端,我目前正在做的当前方式是让专用线程在 BlockingCollection 上等待新消息,一旦新消息到达,它就会遍历客户端回调连接列表并调用接收消息作为参数的方法。
所以我的代码目前看起来像这样:
var msg = ... get message from queue ...
foreach(var client in clients)
client.SendMessage(message)
这种设计存在以下问题:
- 在我完成向所有客户端发送消息之前,客户端无法接收新消息
- 我想检测慢速客户端并可能断开它们
- 消息被序列化的次数与我有多少客户端一样多(我可以更改它,以便在发送消息之前对其进行序列化,但我需要将 SendMessage 的签名者更改为 SendMessage(byte[] content),这是不是我想做的事)
有人遇到过此类问题吗?任何提示/技巧/提示?
【问题讨论】:
-
你已经和 NetTCPBinding 结婚了吗?如果您选择 BasicHTTPBinding 或 NetHTTPBinding 之类的东西,它们的行为类似于 Web 服务器(请求、响应、关闭连接),您不会被锁定在持久连接中,随时允许数百个并发连接。但这意味着在每台客户端机器上都有一个守护程序,定期访问主机并检查队列是否有任何出站通知。
-
您建议每个客户端定期轮询服务。恕我直言,在数据到达时将数据推送到客户端的服务效率要低得多。此外,我需要客户端拥有最新数据,这意味着轮询间隔必须非常小,这会使一切消耗更多资源。
-
您对客户端轮询主机是正确的......这就是使用 WCF 中类似 HTTP 的协议所需要的。您是否在每台客户端计算机上都驻留了一个程序,用于监听这些入站通知?我
-
客户端应用程序(Windows 窗体应用程序)通过标准 WCF Net.TCP 绑定连接到我正在侦听某个端口的服务。当他们连接时,服务检索并存储客户端回调通道,以便它可以向客户端发送数据。把它想象成一个聊天服务器,你只能看到传入的消息/
-
这是您的程序,但在我看来,您可以向您的客户端应用程序添加一个计时器循环,轮询主机队列中的消息,关闭连接并等待下一个循环。我已经完成了 NetTCPBinding 和 BasicHTTPBinding;这些以 HTTP 为中心的协议快如闪电。从字面上看,我已经在运行 BasicHTTPBinding 的单个服务器上运行了数百个并发连接,每个连接都在自己的线程上,上传和下载大文件。因此,虽然在纸面上这似乎是一个不太优雅和高效的解决方案,但我的负载测试显示却讲述了一个不同的故事。并且消除了连接池问题
标签: c# .net wcf networking tcp