1

我们正在开发一个将安装在大约 1,000 名员工个人电脑上的 Windows 窗体应用程序。用户可以同时运行应用程序的多个实例。客户端都在一个 Intranet 上。

应用程序中的更改可能会导致数据库记录更改,而这些更改又必须传达给其他客户端,以便更新它们的 UI。

我们的团队讨论了两种不同的方法:

1.组播包

源客户端修改记录,然后发送一个多播数据包,其中的有效负载发生了变化。其他客户端接收到这个并获取指定的数据。我们需要考虑没有收到数据包的情况,然后主动检索数据。

此时我的问题是客户端如何知道它没有收到数据包?(不知道你不知道什么)这将我们带到某种事件日志中,其中包含数据库中的时间戳,并且 UI 控件跟踪它们的最后一次更新时间。他们成为焦点,检查他们的时间戳,并根据需要进行更新。

其他人说 UI 元素每次进入焦点时都会重新加载(想想 Outlook 中的模式,将控件带到带有 CAB 的堆栈工作区的前面)。并且多播是为了更新他们当前上下文已经改变的客户端。如果他们错过了它,他们将使用陈旧的数据,直到他们改变模式并回来。

2. WCF 和回调

客户端注册 WCF 合同以通过 tcp 绑定进行回调。与此相关的主要技术问题是服务器维护许多打开的套接字。我们已经阅读了它是如何在传统意义上不打开的,它被置于休眠状态最多 90 秒,然后在那时重新建立。我们还阅读了有关 Windows 2003 Server 机器可以处理的最大打开连接数,以及如何在注册表中修改它。

如果我们有 1,000 个到服务器的开放套接字连接,这会分崩离析吗?

如果有人遇到过同样的情况并尝试或评估过 WCF 方法,我们很乐意听到。

4

1 回答 1

1

我还没有实施过这样的情况。但是,我认为其中一种双工绑定不一定会有很高的开销。

这完全取决于服务器需要将多少信息发送回客户端。我了解您说这些信息将用于他们更新用户界面。然而,他们似乎可能并不都同时需要相同数量的信息。例如,如果西部地区的信息发生了变化,可能所有 1000 个客户都想知道发生了变化,他们可能都想更新西部地区的摘要级信息,但可能只有 1/4需要查看更改的详细信息。

如果是这种情况,那么我建议回调只提供有关已更改内容的信息,主要是在摘要级别。让那些对变更细节感兴趣的客户询问细节。您甚至可以提供最高一或两级层次结构的所有详细信息,然后对于其余部分,只需包含“这有时会发生变化的信息。这样,根据特定客户查看的层次结构级别,客户可以询问或不询问。

如有必要,您可以一起批量更新。如果客户端每秒只需要更新一次,那么您可以累积最后一秒的更改并一次发送它们。

您可能还想为某些任务使用一些对等绑定。也许您业务特定领域的客户希望了解彼此的工作内容——诸如此类。

于 2009-07-17T16:37:27.450 回答