m3n*_*tat 7 c# wcf open-source distributed-computing nettcpbinding
我有一个c#多线程蒙特卡罗模拟,应用程序已经结构化,可以分成独立执行的任务,TaskController执行任务,聚合中间结果,检查收敛(提前终止标准)然后返回最终结果,目前使用ThreadPool实现.
我想利用多台计算机来辅助计算.我没有使用IIS的批准或基础设施(这是政策不会改变)但我可以使用例如WCF与NetTcpBinding端点绑定,我已经测试了跨服务器的这种通信,它具有适当的权限和工作.
首先,我想有一个主exe(控制台应用程序)和其他服务器上的几个从属作为专用工作者(如果这些是exes?或Windows服务?),最终我可以将这个设置在数百个工作站上运行(以及在空闲时间(或屏幕保护程序处于活动状态时)公司内部作为服务器).
我自己可以写这个,但我必须处理通信,1,2路?提前终止(中间收敛结果检查),取消不再需要的任务,部署工作,发现可用和现成的机器以便部署工作,如果工作站不再闲置,则限制/暂停工作?分布式系统中的其他所有内容?
主人(任务控制人员)应该知道所有奴隶工人的地址(ip)并告诉他们做什么工作(如果他们可用),或者奴隶工人是否只知道主地址并在他们处于有效位置时请求工作这样做,或沟通应该双向流动?这将是一个24小时制的时钟,每天开始大约9次运行,以支持不同的业务区域.
我正在寻找.net网格/分布式库的建议,可以提供帮助和一些建筑建议.
更新
有没有人使用以下任何一种?
http://www.digipede.net/ (commercial)
http://www.gridbus.org/~alchemi/
http://ngrid.sourceforge.net/
http://www.osl.iu.edu/research/mpi.net/
Run Code Online (Sandbox Code Playgroud)
或者使用来自.net的JavaSpaces,Jini或者找到了等效的.net技术
http://java.sun.com/developer/technicalArticles/tools/JavaSpaces/
http://www.jini.org
Run Code Online (Sandbox Code Playgroud)
谢谢
我会研究为此使用天基架构的可能性。
主节点会将作业写入一个空间(本质上是一个对象存储库)。消费客户端总是在寻找工作,当工作可用时,他们将从空间中提取、处理并将结果写回到该空间或另一个空间(所有这些都在事务下)。您可以将作业标记为属于特定运行,以便对结果进行分组。
这样做的优点是很容易扩展(只需添加更多消费者)。消费者必须确定他们何时可以工作,并且只需要配置有关空间的信息(如何找到它)。生产者与消费者完全解耦。
由于工作是在事务下处理的,因此如果使用者未能完成,工作将返回到空间并可供另一个使用者处理。
您可以轻松处理中间结果。生产者从空间中获取结果,并在结果可用时导出中间体。您可以轻松取消工作。只需将它们从空间中移除即可。
您可以非常轻松地添加更多生产者。他们只是写入相同的空间,如果作业被适当标记,结果就会明确地与生产者联系在一起。
不幸的是,我不确定哪些框架可用于 .Net(我来自 Java 世界,会使用Javaspaces - 这些框架使用动态发现,并且几乎不需要任何配置)。但值得谷歌搜索一下。也许(如果这足够强大的话),您可以编写 C# 生产者/消费者来连接到 Javaspace 基础设施。