我的问题很简单,但答案可能不是。
我有成千上万的工作人员执行相同的任务,我希望他们在许多远程虚拟机(云或网络)上以并行方式执行
思路是这样的:
class ThreadManager
{
public void main()
{
for (int i = 0; i<300; i++)
{
myWorker wk;
if (i < 100)
wk = new myWorker(IP_Computer_1);
else if (i < 200)
wk = new myWorker(IP_Computer_2);
else
wk = new myWorker(IP_Computer_3);
wk.RunWorkerAsync();
}
}
internal class myWorker :: BackgroundWorker
{
public string IP_Computer;
{...}//constructor
protected override void OnDoWork(DoWorkEventArgs e)
{
WriteToDatabaseTable("BAZINGA ! Greetings from computer " + Dns.GetHostName());
//SQL server DB is hosted on a publicly accessible domain
base.OnDoWork(e);
}
}
}
当然,这是伪代码,你明白了:通过网络将线程/工作线程分配给不同的计算机/虚拟机(不仅是多核)
我有哪些基本/最简单的选择?
我对任何轻便高效的解决方案都持开放态度(我不想进行复杂的调度/应用程序工作流重新设计等......请让我们保持原样)
注意:这不是一个无辜的问题。我知道所有关于网格/云计算、高性能计算、亚马逊网络服务、Azure 等的大惊小怪……我花了很多时间阅读和尝试一些东西,我认为有很多(金钱)业务出去。有时回到基础并提出简单的问题是很好的,看看我们是否真的需要一个过于复杂/复杂/侵入/昂贵的解决方案来解决基本问题(我们不是拥有庞大网络的财富 500 强,而只是一家小型研究公司具有特定/原子计算需求)
最佳答案
执行此操作的最简单方法是将“DoWork”建模为 WCF 服务上的方法。 使用 NetTCP 绑定(bind)和 load balance across multiple machines .如果机器是无状态克隆,并且所有状态都保存在数据库中,这是合适的。在那种情况下,您不应该关心哪台机器为您的请求提供服务,并且您不需要在应用程序级别使用 IP 地址。
这不提供通信保证、可靠性或故障转移。例如,如果服务机器在请求期间“死机”,则该请求将不会在另一台机器上重新启动。这可能正好满足您的需求。
如果您想要有保证的交付(即即发即弃)和事务持久性,请考虑为您的 WCF 服务使用 MSMQ 传输。在这种情况下,服务机器以事务方式出列,并且只有在执行了数据库更新时才提交事务。
关于c# - 在不同的虚拟机上发送 C# worker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5983263/