通过不同的虚拟机发送C#worker

通过不同的虚拟机发送C#worker,c#,.net,multithreading,networking,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_Compute

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

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

以下是想法:

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);
       }
    }
}
类线程管理器
{
公共图书馆
{

for(int i=0;i.NET没有简单的内置方法来实现这一点。您可能希望使工作线程可序列化,并通过消息队列将其发送到节点(可能使用
System.Messaging
和MSMQ).

开源网格计算怎么样。如果你想自己完成这一切,你需要大量的编码来将容错能力融入到你的定制解决方案中。最困难的是在不影响整个系统的情况下保持故障的局部性。

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

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


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

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

这不提供通信保证、可靠性或故障切换。例如,如果服务计算机在请求过程中“死亡”,请求将不会在另一台计算机上重新启动。这可能正好满足您的需要


如果您希望保证交付(又名“开火并忘记”)和事务持久性,考虑使用MSMQ传输为您的WCF服务。在这种情况下,服务机在事务上进行排队,并且只有在执行了数据库更新时事务才提交。

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

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

无论哪种方式,您都必须首先解决通信问题(您是通过类似WCF的方式推送,还是让从机从队列中拉出)等。

我不确定我是否同意你对云计算的否定意见……过于复杂/复杂/侵入性/昂贵可能重复的@遗忘分号:我看到了那个,想知道一年后是否有更多机会对这样一个基本问题有更全面的答案…@亚伦:我尝试了亚马逊EC2和Az截至目前,我还没有找到使用windows群集EC2实例来执行计算过程的方法(HPC实例仅限于Linux),而对于Azure,我们有存储问题,因为我们必须执行高速I/O操作,更不用说应用程序(re)部署是一件痛苦的事情,因为它不像虚拟机那样无缝。无论如何,我并不反对云计算,我只是想知道是否有一种基本的、简单的、循序渐进的方法来在云上执行集群/网格,或者其他虚拟机的网格已经停止维护3年了,我更喜欢让用户反馈,以便对其进行更深入的挖掘宽容,这不是我的应用程序处理的问题。如果工作人员失败,我将进行交叉检查,以了解情况并再次运行。最新更新:2009-08-05。看起来不太活跃:(是的,我想没有简单的内置方法来实现这一点……关于节点的事情,如果你能给我更多关于前端的细节/资源,使其更具体,那就太好了。我不同意;WCF让它变得非常简单。从概念和架构的角度来看,这听起来很合理。从编程的角度来看,这是非常重要的有多种选择,我不知道从哪里开始这可能会有所帮助。谢谢你,这是非常有见地的。我会尝试一下(我不知道具体怎么做,但我会阅读文档并尝试API)。至于可靠性和故障切换,这不是问题,我有一个并行交叉检查系统,如果某些服务失败,我将在下一个进程池中重新运行它。我欢迎您提供逐步指南或任何有用的可用资源来帮助我开始这方面的工作。谢谢您的回答。