通过不同的虚拟机发送C#工作者

时间:2011-05-12 19:18:25

标签: c# .net multithreading networking

我的问题很简单,但答案可能不是。

我有成千上万的工作人员执行相同的任务,我希望他们能够在许多远程虚拟机(云或网络)上以并行方式执行

这是一个想法:

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);
       }
    }
}

当然,这是伪代码,你明白了:通过网络将线程/工作人员分配到不同的计算机/ VM(不仅是多核)

我有哪些基本/最简单的选择? 我对任何轻松有效的解决方案持开放态度(我不想进入复杂的调度/应用程序工作流程再造等等......让我们保持原样,请保持原样)

注意:这不是一个无辜的问题。我知道关于网格/云计算,HPC,亚马逊网络服务,Azure等的所有大惊小怪...我花了很多时间阅读和尝试的东西,我的意见是,有很多(钱)业务走出去。有时回到基础并提出简单的问题以确定我们是否真的需要一个过于复杂/复杂/侵入性/昂贵的解决方案来解决基本问题(我们不是拥有庞大网络的财富500强企业,而只是一家小型研究公司)具有特定/原子计算需求)

5 个答案:

答案 0 :(得分:5)

最简单的方法是将“DoWork”建模为WCF服务上的方法。 使用NetTCP绑定和load balance across multiple machines。如果计算机是无状态克隆,并且在数据库上维护所有状态,则这是合适的。在这种情况下,您不应该关心哪个机器为您的请求提供服务,并且您不需要在应用程序级别使用IP地址。

它不提供通信保证,不提供可靠性或故障转移。例如,如果服务机器在请求期间“死亡”,则不会在另一台机器上重新启动该请求。这可能适合您的需求。

如果您需要有保证的交付(又名“即发即弃”)和交易持久性,请考虑为您的WCF服务使用MSMQ传输。在这种情况下,服务机器以事务方式出列,并且仅当已执行数据库更新时事务才会提交。

答案 1 :(得分:1)

NGrid开源网格计算怎么样?如果您想自己完成所有这些操作,则需要进行大量编码才能将自定义解决方案中的容错能力纳入其中。最困难的是在不影响整个系统的情况下保持本地故障。

答案 2 :(得分:1)

你的......好......问题中有很多未解答的问题。从概念上讲,这是一项非常简单的任务,但是一旦你开始获得一些细节,它就会变得越来越具有挑战性。

正如您在问题中所述,我了解您希望解雇并忘记分布式处理器的任务。这意味着每个任务都是原子的,不需要返回。一种方法是在分布式节点上创建一个监听服务器,然后主节点将发送包含要执行的序列化工作对象的消息。然后,分布式节点将触发新线程(或工作进程)以执行处理。

然后问题开始根据涉及的功能增加而扩大。

答案 3 :(得分:1)

首先要了解的是,您当然可以轻松地将数据发送到其他计算机(即WCF)......但是,您无法轻松发送代码/逻辑。因此,您可以通过以下两种方式之一来解决问题:

  • 有一个“安装程序”,您手动接收工作人员并将其分发给将参与练习的每台计算机,然后通过WCF,MSMQ或任何其他数量的远程通信将这些数据发送给他们。技术
  • 让主进程能够序列化.net程序集,将其传输到每个从属/工作进程,并让该工作程序将程序集加载到应用程序域中,然后继续向它们发送要处理的位。

无论哪种方式,你都必须首先解决通信问题(你是通过像WCF这样的东西推进,还是从队列中拉出奴隶)等等。

答案 4 :(得分:0)

.NET没有简单的内置方法来做到这一点。您可能希望使您的worker可序列化并通过消息队列将它们发送到节点(可能使用System.Messaging和MSMQ)。