强大的分布式C#(WCF)架构设计

时间:2010-06-30 14:52:00

标签: c# wcf windows-services

我想设计一个新的分布式应用程序,但我有一些问题,我需要一些天才的建议,希望你们这些人:

方案

我目前支持的遗留应用程序开始介于各种裂缝之间。 它是使用.Net Remoting实现的分布式客户端 - 服务器应用程序。我无法准确解释它的作用,因为我不被允许.......但是我们只是说它有很多MATHS。我想使用WCF重新设计和重写应用程序。

先决条件

实施的服务器端将托管在Windows服务中。 客户端将是一个Windows窗体应用程序。 服务器端将执行大量内存密集型处理。 服务器会将此数据吐出到多个瘦客户端(20-ish)。 服务器大部分时间都会将数据传递给客户端,但有时客户端会将数据持久化回服务器。 传输数据的速度非常重要,但我很清楚WCF可以处理快速的数据分发。 加密/安全性并不重要,因为应用程序将在受到高度保护的本地网络上运行。

查询

鉴于上述信息:

1)我最喜欢哪种设计模式? - 请记住,我希望服务器不断地将新计算的信息立即推送到客户端,而不是当前实现涉及客户端连续从服务器拉出的信息。 2)我应该使用什么类型的WCF绑定来确保数据传输的最大速度? (尽可能接近实时是我追求的) 3)我应该使用类库来共享客户端和服务器应用程序之间的公共对象吗? 4)在客户端数据绑定我的对象以便在数据发生变化时不断查看实时更新的最佳方法是什么?

如果我忘记任何事情,请随意指出

非常感谢。

2 个答案:

答案 0 :(得分:6)

1)我最喜欢哪种设计模式?

根据您的评论,您希望将当前的轮询机制转换为基于事件的机制。也就是说,代替客户端不断检查服务器的结果,让服务器在新的计算结果可用时通知客户端。

我建议使用Juval Lowy的Publish-Subscribe Framework。

Publish-Subscribe Framework http://i.msdn.microsoft.com/cc163537.fig07(en-us).gif

this MSDN article详细介绍了此框架。您可以在Lowy的网站framework's source code免费下载IDesign.net

基本上,在Windows服务中执行计算的服务器逻辑是图形中的发布客户端,而各种WinForm应用程序是订阅客户端。发布/订阅服务存在于您的Windows服务中。它管理订阅客户端列表,并为您的服务器提供单个端点以发布计算结果。通过这种方式,您的服务器执行计算并将结果 一次 发布到发布/订阅服务端点。然后,发布/订阅服务负责将结果发布给订阅的客户端。

2)我应该使用哪种类型的WCF绑定来确保最大的数据传输速度?

如果您的所有WCF通信都在一台计算机上,那么您需要使用NetNamedPipeBinding。但是,由于您将分发,因此您希望使用NetTcpBinding

对于WCF绑定决策,我发现此图表很有用。

WCF Binding Selection Flow Chart

3)我应该使用类库来共享客户端和服务器应用程序之间的公共对象吗?

由于您可以控制客户端和服务器端,因此我强烈建议您共享类库,而不是使用Visual Studio的“添加服务引用”功能。有关详细讨论,请参阅this SO question-and-answer

4)在客户端对数据对象进行数据绑定以便在数据发生变化时不断查看实时更新的最佳方法是什么?

我怀疑这将取决于您用于显示数据的控件。立即想到的一种方法是让客户在收到每个计算结果时填写内存数据表。然后,可以将此数据表绑定到ListBox控件,例如,以计算顺序显示结果。

答案 1 :(得分:0)

这对我来说看起来你需要实现Observer模式,但是分布式。因此,对服务进行了新的计算,而WCF恰好是将通知推送回客户端的机制。

一般来说,您的业务逻辑位于Windows服务中,其中类型是Subject(Observable)。您可以为客户端发布端点以注册通知。这将是一个WCF服务,可能有两个操作:

  1. RegisterClient(...)
  2. UnregisterClient(...)
  3. 当客户注册服务时,它可以接收更新,一般来说,服务何时完成计算结果,它可以遍历所有已注册的客户端并启动推送。推送是通过客户端上的端点进行通信。

    客户端端点通常可以通过

    1. 通知(结果...);
    2. 您的服务器只有在有新数据时才会调用它...

      通常,您使用TCP来最大化吞吐量。

      这绝不是你应该做的,但也许是一个开始的方向?