【问题标题】:WCF Net.TCP: Most efficient way to broadcast messages to a lot of clientsWCF Net.TCP:向大量客户端广播消息的最有效方式
【发布时间】: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)

这种设计存在以下问题:

  1. 在我完成向所有客户端发送消息之前,客户端无法接收新消息
  2. 我想检测慢速客户端并可能断开它们
  3. 消息被序列化的次数与我有多少客户端一样多(我可以更改它,以便在发送消息之前对其进行序列化,但我需要将 SendMessage 的签名者更改为 SendMessage(byte[] content),这是不是我想做的事)

有人遇到过此类问题吗?任何提示/技巧/提示?

【问题讨论】:

  • 你已经和 NetTCPBinding 结婚了吗?如果您选择 BasicHTTPBinding 或 NetHTTPBinding 之类的东西,它们的行为类似于 Web 服务器(请求、响应、关闭连接),您不会被锁定在持久连接中,随时允许数百个并发连接。但这意味着在每台客户端机器上都有一个守护程序,定期访问主机并检查队列是否有任何出站通知。
  • 您建议每个客户端定期轮询服务。恕我直言,在数据到达时将数据推送到客户端的服务效率要低得多。此外,我需要客户端拥有最新数据,这意味着轮询间隔必须非常小,这会使一切消耗更多资源。
  • 您对客户端轮询主机是正确的......这就是使用 WCF 中类似 HTTP 的协议所需要的。您是否在每台客户端计算机上都驻留了一个程序,用于监听这些入站通知?我
  • 客户端应用程序(Windows 窗体应用程序)通过标准 WCF Net.TCP 绑定连接到我正在侦听某个端口的服务。当他们连接时,服务检索并存储客户端回调通道,以便它可以向客户端发送数据。把它想象成一个聊天服务器,你只能看到传入的消息/
  • 这是您的程序,但在我看来,您可以向您的客户端应用程序添加一个计时器循环,轮询主机队列中的消息,关闭连接并等待下一个循环。我已经完成了 NetTCPBinding 和 BasicHTTPBinding;这些以 HTTP 为中心的协议快如闪电。从字面上看,我已经在运行 BasicHTTPBinding 的单个服务器上运行了数百个并发连接,每个连接都在自己的线程上,上传和下载大文件。因此,虽然在纸面上这似乎是一个不太优雅和高效的解决方案,但我的负载测试显示却讲述了一个不同的故事。并且消除了连接池问题

标签: c# .net wcf networking tcp


【解决方案1】:

看来您必须使用多播而不是专用通信。因此,每个新客户端都需要加入演员频道(有关详细信息,请参阅 IGMP),然后您的服务器将在您需要发布的每条消息中触发一次。

【讨论】:

  • 你是在建议我改用另一种技术?我的问题是 - 使用 WCF 可以提高效率吗?也许 WCF 无法提供我正在寻找的东西,但我想看看是否有人知道如何使它与 WCF 有效地工作。
  • 使用 UDP 传输创建多播应用程序:“WCF 现在支持使用 UdpBinding 编写多播应用程序。这种传输在服务需要同时向多个客户端发送小消息的情况下很有用。” msdn.microsoft.com/en-us/library/hh556229(v=vs.110).aspx
猜你喜欢
  • 2016-12-02
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 2018-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多