7

我有一个c# 多线程蒙特卡罗模拟,应用程序已经结构化,可以将其划分为独立执行的任务,任务控制器执行任务,聚合中间结果,检查收敛(早期终止标准)然后返回最终结果,目前这是使用 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/

或使用来自 .net 的 JavaSpaces、Jini 或找到等效的 .net 技术

http://java.sun.com/developer/technicalArticles/tools/JavaSpaces/
http://www.jini.org

谢谢

4

1 回答 1

3

我将研究为此使用基于空间的架构的可能性。

master 会将作业写入一个空间(本质上是一个对象存储库)。消费客户端总是在寻找工作,当工作变得可用时,他们将从空间中提取、处理并将结果写回该空间或另一个空间(全部在事务下)。您可以将作业标记为属于特定运行,以便对结果进行分组。

这样做的好处是很容易扩展(只需添加更多的消费者)。消费者必须确定他们何时可以工作,并且只需要配置有关空间的信息(如何找到它)。生产者与消费者集完全分离。

因为工作是在事务下处理的,如果一个消费者未能完成,工作将返回到空间并可供另一个消费者处理。

您可以轻松处理中间结果。生产者从空间中获取结果,并且可以在结果可用时获得中间体。您可以轻松取消作业。只需将它们从空间中删除即可。

您可以非常轻松地添加更多生产者。他们只是写到同一个空间,如果工作被适当地标记,结果就会明确地与生产者联系在一起。

不幸的是,我不确定 .Net 可以使用哪些框架(我来自 Java 世界并且会使用Javaspaces - 这些使用动态发现,并且几乎不需要配置)。但值得一些谷歌搜索。也许(如果这足够强大的话),您可以编写 C# 生产者/消费者来连接到 Javaspace 基础设施。

于 2009-08-04T10:39:38.080 回答