用于远程存储/管理计算的C#技术选项

时间:2016-07-04 19:16:10

标签: c# wcf

试图弄清楚我有哪些选项让本地运行的程序从远程源获得计算或计算结果。

问题: 我有一个数据采集应用程序,可以在测试设备时读取大量仪器并收集数据。这些数据不是通过各种形式的聚合(最小值,最大值,平均值等)而是应用于多个计算,并将结果保存到数据库中。在测试期间,此过程会多次发生。此应用程序在专用于执行此测试的计算机上运行,​​但测试之外的用户还需要执行相同的计算以进行实验,数据分析等。

过去,我们的两个应用程序(一个包含设备,另一个包含用户)将在每次计算更改后更新,然后在任何地方部署。这是一种痛苦。

问题: 我正在寻找解决这个问题的可能方案。

到目前为止我发现了什么。

1)。 WCF。

像: 只需更新服务器,两个程序现在都可以利用新的计算。

关注: DataContract将包含几个必须传递给函数的类。 ("数据"总大小可以从1 MB到1 GB,具体取决于具体情况)。目前还不确定数据量是否是实际问题。

2)。存储已编译的DLL并下载/加载它们。 在服务器中查询类库。下载它。将其加载到内存中并使用计算。

像: 不必来回传递大量数据。

关注: 现在驻留在每台计算机上的DLL。人们可能不会被迫更新到可能导致问题的正确版本。本地计算机上的DLL可能会带来安全风险。

2 个答案:

答案 0 :(得分:0)

这是一个非常棘手的问题,我认为有很多方法可以尝试解决它。以下是一些可以帮助您入门的想法

  1. 使用Akka.Net并查看可能能够解决远程部署问题的Akka.Remote。但是,如果您的用户决定加入群集ad-hoc而不是拥有一组固定的位置来分配计算,我不确定这是否符合您的需求?

  2. 如果计算是简单的数学公式,您可以将它们存储为一组规则并下载公式。即采取更多的规则引擎方法。请参阅C# expression trees

  3. 基于浏览器的解决方案。从远程部署的简易角度来看,这显然是赢家。如果您不想使用JavaScript,有很多选择,例如: PureScript,F#(Fable),ClojureScipt,ELM甚至可能是带有JSIL / Bridge的C#。从桌面移动到网络是一个很大的转变,所以请确保你知道你在做什么:)

答案 1 :(得分:0)

在尝试了几个选项后,我们发现来回发送数据太麻烦了。相反,我们选择使用我们需要的所有计算动态加载DLL,并使用一组接口来定义行为。

我所学到的和发现的很简单,我可以将DLL存储在数据库中,并将其直接加载到内存中,而不必先将其复制到硬盘驱动器,从而提供额外的保护层。使用SQL和FILESTREAM。它还提供了一种版本控制,我可以选择从数据库加载哪个版本的DLL并计算/重新计算各种值。

 // Read in File
 using (SqlFileStream fileStream = new SqlFileStream(path, transaction, System.IO.FileAccess.Read))
 {
      byte[] buffer = new byte[size];
      int bytesRead = fileStream.Read(buffer, 0, buffer.Length);

       // Load Assembly
       Assembly DLL = Assembly.Load(buffer);

       Type myInterfaceType = DLL.GetType("MyNamespace.MyClass");

       // Get access to the root interface
       IMyInterface myClass = (IMyInterface)Activator.CreateInstance(myInterfaceType);

 }