2011-05-12 57 views
4

我的問題很簡單,但答案可能不是。

我有成千上萬執行相同的任務的工人,我想他們以並行的方式在許多遠程虛擬機(雲或網絡)通過不同的虛擬機發送C#工作人員

這裏執行的理念是:

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強企業,而只是一家小型研究公司與特定/原子計算需求)

+0

我不知道我同意你對雲的否定...... _overly複雜/複雜/入侵/昂貴_ – 2011-05-12 19:21:22

+0

可能重複[如何開始使用.NET網格計算](http://stackoverflow.com/questions/3249198/how-to -get-started-with-net-grid-computing) – 2011-05-12 19:24:44

+0

@Forgotten分號:我看到一個,並想知道如果一年後有更多的機會有這樣一個基本問題更全面的答案... – 2011-05-12 19:43:36

回答

5

最簡單的方法是將您的「DoWork」建模爲WCF服務的方法。 使用NetTCP綁定和load balance across multiple machines。如果機器是無狀態克隆,並且數據庫上的所有狀態都保持不變,則這是合適的。在這種情況下,您不應該關心哪臺計算機爲您的請求提供服務,並且您不需要在應用程序級別與IP地址對接。

這不提供通信保證,沒有可靠性或故障切換。例如,如果維修機器在請求期間「死亡」,該請求將不會在另一臺機器上重新啓動。這可能適合您的需求。

如果您希望保證傳遞(又名即忘即發)和事務持久性,請考慮爲您的WCF服務使用MSMQ傳輸。在這種情況下,服務機器以事務方式出隊,並且事務僅在數據庫更新已經執行時才提交。

+0

非常感謝你的洞察力,我會試一試(我不知道具體如何,但我會閱讀文檔並嘗試API) 。作爲可靠性和故障轉移,這不是問題,我有一個並行交叉檢查系統,如果某些服務失敗,我將在下一個進程池中重新運行它。 – 2011-05-12 20:00:12

+0

我歡迎並逐步指導或任何有用的可用資源,以幫助我開始。感謝您的答案。 – 2011-05-12 20:19:59

0

.NET沒有簡單的內置方式來做到這一點。您可能想讓您的工作人員可序列化並通過消息隊列將其發送到節點(可能使用System.Messaging和MSMQ)。

+0

是的,沒有簡單的內置方式來做這是我的猜測......至於節點的東西,如果你可以給我更多關於前端的細節/資源,使它更具體一點,那麼它會很棒。 – 2011-05-12 19:40:56

+1

我不同意; WCF使它變得相當容易。 – Cheeso 2011-05-12 19:41:17

1

NGrid如何開源網格計算。如果你想自己做,你需要相當多的編碼才能在你的定製解決方案中容錯。最困難的是保持本地故障而不影響整個系統。

+0

Ngrid已停止維護3年,我更願意讓用戶反饋深入挖掘。至於容錯性,我的應用程序不會處理這個問題。如果一名工人失敗了,我會交叉檢查並重新運行。 – 2011-05-12 19:39:07

+0

http://sourceforge.net/projects/ngrid/最後更新:2009-08-05。不要過度活躍:( – 2011-05-12 19:42:17

1

在你的......好的問題中有很多未解答的問題。從概念上講,這是一項非常簡單的任務,但是一旦你開始獲得一些細節,它就變得越來越具有挑戰性。

正如你的問題所述,我明白你想發射和忘記任務分佈式處理器。意思是每個任務都是原子的,不需要返回。一種方法是在分佈式節點上創建一個監聽服務器,然後主節點將發送包含要執行的序列化工作對象的消息。然後,分佈式節點將觸發一個新線程(或工作進程)來執行處理。

然後,根據涉及的功能多少,問題開始擴大。

+0

從概念和建築的角度來看,這聽起來很合理。從編程的角度來看,有各種選項,我不知道從哪裏開始 – 2011-05-12 19:52:49

+0

這可能有幫助。http://www.c- sharpcorner.com/UploadFile/amit_agrl/DistributedComputing11232005043409AM/DistributedComputing.aspx – Bueller 2011-05-12 20:02:22

1

首先要明白的是,你當然可以很容易地發送數據到其他計算機(即WCF)......但是,你不能輕易發送代碼/邏輯。所以,你可以接近問題的方式有兩種:

  • 有一個「安裝程序」來手動把工人和他們分發到會參加這次演習的每臺計算機,然後發送數據塊通過WCF或MSMQ或任何其他數量的遠程通信技術進行處理
  • 主進程是否能夠序列化.net程序集,將其傳輸到每個從/進程進程,並讓該進程將進程加載到應用程序域,然後繼續向它們發送要處理的位。

無論哪種方式,你必須首先解決通信問題(你通過像WCF推,或者你有奴隸從隊列中提取)等