密集分布式C#(WCF)体系结构设计

密集分布式C#(WCF)体系结构设计,c#,wcf,windows-services,C#,Wcf,Windows Services,我想设计一个新的分布式应用程序,但我有几个问题需要一些天才的建议,希望你们能给我一些建议: 脚本 我目前支持的一个遗留应用程序已经开始陷入困境。 它是一个使用.Net远程处理实现的分布式客户端服务器应用程序。我不能确切地解释它是做什么的,因为我不被允许……但我们可以说它做了很多数学运算。我想使用WCF重新设计和编写应用程序 预备知识 实现的服务器端将托管在Windows服务中。 客户端将是一个windows窗体应用程序。 服务器端将执行大量内存密集型处理。 服务器将把这些数据输出到多个瘦客户机(

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

脚本 我目前支持的一个遗留应用程序已经开始陷入困境。 它是一个使用.Net远程处理实现的分布式客户端服务器应用程序。我不能确切地解释它是做什么的,因为我不被允许……但我们可以说它做了很多数学运算。我想使用WCF重新设计和编写应用程序

预备知识 实现的服务器端将托管在Windows服务中。 客户端将是一个windows窗体应用程序。 服务器端将执行大量内存密集型处理。 服务器将把这些数据输出到多个瘦客户机(20个)。 大多数情况下,服务器会将数据传递给客户端,但偶尔客户端会将数据持久化回服务器。 数据传输的速度非常重要,但是我很清楚WCF可以处理数据的快速分发。 加密/安全性没有那么重要,因为应用程序将在高度保护的本地网络上运行

询问 鉴于上述信息:

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

如果我忘记了什么,请随时指出
非常感谢您的帮助。

在我看来,您需要实现观测者模式,但它是分布式的。从而对服务进行新的计算,而WCF恰好是将通知推回到客户端的机制

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

  • 注册客户机(…)
  • 注销客户端(…)
  • 当客户机向服务注册时,它可以接收更新,广义地说,当服务完成计算结果时,它可以迭代所有注册的客户机并启动推送。推送是通过客户端上的端点进行的通信

    客户端端点通常可以由

  • 通知(结果…) 当您的服务器有新数据时,只需调用它

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

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

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

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

    我建议使用Juval Lowy的发布-订阅框架


    (来源:)

    中详细描述了该框架。你可以在Lowy的网站上免费下载

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

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

    如果您的所有WCF通信都在一台机器上,那么您应该使用。但是,由于您将是分布式的,因此您希望使用

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

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

    由于您同时控制客户端和服务器端,我强烈建议您共享类库,而不是使用VisualStudio的“添加服务引用”功能。有关这方面的详细讨论,请参阅

    4)在客户端对我的对象进行数据绑定的最佳方式是什么,以便在数据更改时不断查看实时更新?


    我怀疑这将取决于您使用什么控件来显示数据。一种立即浮现在脑海中的方法是让客户机在收到每个计算结果时填写内存中的数据表。例如,可以将此数据表绑定到一个列表框控件,该控件按计算顺序显示结果。

    这是我在WCF上看到的最一致、最完整的答案。皮蒂,我只能+1它。