c# - 在不同的虚拟机上发送 C# worker

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


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

我有哪些基本/最简单的选择? 我对任何轻便高效的解决方案都持开放态度(我不想进行复杂的调度/应用程序工作流重新设计等......请让我们保持原样)

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

最佳答案

执行此操作的最简单方法是将“DoWork”建模为 WCF 服务上的方法。 使用 NetTCP 绑定(bind)和 load balance across multiple machines .如果机器是无状态克隆,并且所有状态都保存在数据库中,这是合适的。在那种情况下,您不应该关心哪台机器为您的请求提供服务,并且您不需要在应用程序级别使用 IP 地址。

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

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

关于c# - 在不同的虚拟机上发送 C# worker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5983263/

相关文章:

c# - 泛型约束有什么用?例如 : where T : IComparable

c# - Windows 窗体中的数据注释支持

.net - 仅使用 .dll 引用通过 .Net 连接到 IBM DB2

c# - Parallel.For 并获得下一个空闲线程/ worker

c# - 计时器说它已启用,但从不执行

c# - 单独的枚举类?

c# - 如何找到数组的模式(最频繁的元素)?

python - 关于keras.utils.Sequence的澄清

java - 使用 onKeyReleased 事件创建搜索引擎的用途

Java 线程意外行为