通过不同的虚拟机发送 C# 辅助角色

本文关键字:角色 虚拟机 | 更新日期: 2023-09-27 17:56:21

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

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

这是这个想法:

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


当然,这是伪代码,你得到的想法:通过网络(不仅是多核

)将线程/工作线程分配给不同的计算机/虚拟机我有哪些基本/最简单的选项?我对任何轻巧有效的解决方案持开放态度(我不想进入复杂的调度/应用程序工作流程重新设计等......让我们保持原样,请

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

通过不同的虚拟机发送 C# 辅助角色

最简单的

方法是将"DoWork"建模为 WCF 服务上的方法。使用 NetTCP 绑定,并在多台计算机之间进行负载平衡。如果计算机是无状态克隆,并且所有状态都在数据库上维护,则这很合适。 在这种情况下,您不应该关心您的请求为哪台计算机提供服务,也不需要在应用程序级别使用 IP 地址。

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

如果需要有保证的传递(也称为即发即弃)和事务持久性,请考虑对 WCF 服务使用 MSMQ 传输。在这种情况下,服务机器以事务方式取消排队,并且事务仅在执行数据库更新时提交。

NGrid 一个开源网格计算怎么样?如果您想自己完成所有工作,则需要相当多的编码才能将容错融入您的自定义解决方案中。最困难的是将故障保留在本地,而不会影响整个系统。

你有很多

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

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

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

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

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

无论哪种方式,您都必须首先解决通信问题(您是通过 WCF 之类的东西推送,还是让从站从队列中提取)等。

.

NET 没有简单的内置方法来执行此操作。 您可能希望使工作线程可序列化,并通过消息队列(可能使用 System.Messaging 和 MSMQ)将它们发送到节点。