2011-05-12 6 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); 
     } 
    } 
} 
:

내가 같은 작업을 수행하는 근로자의 수천, 나는 그들에게 많은 원격 가상 머신 (클라우드 또는 네트워크) 여기

에 병렬 방식으로 실행하고자하는 아이디어입니다


물론 이것은 의사 코드입니다. 스레드/작업자를 다른 컴퓨터/네트워크 (멀티 코어는 물론)를 통해 할당하십시오.

기본/가장 간단한 옵션은 무엇입니까? 나는 가볍고 효율적인 솔루션에 개방적이다 (나는 복잡한 스케줄링/애플 리케이션 워크 플로우 리엔지니어링 등을하고 싶지 않다.).

NB : 이것은 아니다 무고한 질문. 그리드/클라우드 컴퓨팅, HPC, 아마존 웹 서비스, Azure 등에 대한 모든 소동에 대해 알고 있습니다 ... 나는 많은 시간을 보냈으며 물건을 시험해 보았습니다. 제 의견으로는 많은 (돈) 비즈니스가 있다는 것입니다. 밖에 나가. 때로 기본으로 돌아가 기본 문제를 해결하기 위해 지나치게 복잡한/복잡하고 침해적인/고가의 솔루션이 정말로 필요한지 알아보기 위해 간단한 질문을하는 것이 좋습니다. (우리는 거대한 네트워크를 가진 Fortune 500이 아니라 단지 작은 연구 회사 특정/원자 컴퓨팅 요구 사항이 있음)

+0

잘 모르겠어요를 해결해야합니다 나는 클라우드에 대한 네거티브에 동의합니다. 매우 복잡한/복잡한/침입적/비싼 _ –

+0

가능한 중복 [.NET 그리드 컴퓨팅 시작 방법] (http://stackoverflow.com/questions/3249198/how-to) –

+0

@Forgotten Semicolon : 1 년 후, 근본적인 문제에 대해보다 포괄적 인 대답을 할 수있는 기회가 더 있는지 궁금합니다. –

답변

5

가장 간단한 방법은 "DoWork"를 WCF 서비스의 한 메서드로 모델링하는 것입니다. NetTCP 바인딩을 사용하고 load balance across multiple machines. 이것은 기계가 상태없는 복제이고 모든 상태가 데이터베이스에서 유지 보수되는 경우에 적합합니다. 이 경우 요청에 따라 어떤 머신 서비스가 필요한지 신경 쓰지 않아야하며, 애플리케이션 레벨에서 IP 주소를 사용하지 않아도됩니다.

이는 통신 보장을 제공하지 않으며 안정성이나 장애 조치를 제공하지 않습니다. 예를 들어 서비스 기계가 요청 중에 "작동 중지"되면 다른 기계에서 요청이 재시작되지 않습니다. 이것은 당신의 요구에 잘 어울릴 수 있습니다.

배달 보장 (일명 화재 및 잊음) 및 트랜잭션 내구성을 원하면 WCF 서비스에 MSMQ 전송 사용을 고려하십시오.이 경우 서비스 시스템은 트랜잭션으로 대기열에서 제외되며 데이터베이스 업데이트가 수행 된 경우에만 트랜잭션이 커밋됩니다.

+0

매우 통찰력을 주셔서 감사합니다.이 방법을 시도해 보겠습니다. (정확하게는 모르겠지만 문서를 읽고 API를 사용해 보겠습니다) 안정성 및 장애 조치 (failover)에 관해서는 문제가되지 않습니다. 병렬 교차 점검 시스템이 있는데 일부 서비스가 실패하면 다음 프로세스 풀에서 다시 실행하게됩니다. –

+0

나는 단계별 가이드를 환영합니다. 도움이 될만한 유용한 리소스. 그 답변을 주셔서 감사합니다. –

0

.NET에는 이러한 작업을 쉽게 수행 할 수있는 기본 방법이 없습니다. worker를 serialize 할 수 있고 메시지 큐 (아마도 System.Messaging 및 MSMQ를 사용하여)를 통해 노드로 보내길 원할 것입니다.

+0

그래, 쉽게 할 수있는 기본 방법이 없다. 내 추측이었다 ... 노드 물건에 관해서는 프론트 엔드에 대한 자세한 내용/리소스를 제공하면 woudl이 훌륭해 지도록 구체적으로 설명 할 수 있습니다. –

+1

동의하지 않습니다. WCF를 사용하면 쉽게 쉽게 벗어날 수 있습니다. – Cheeso

1

어쨌든 NGrid은 오픈 소스 그리드 컴퓨팅입니다. 혼자서 모든 작업을 수행하려면 사용자 지정 솔루션에 내결함성을 확보하기 위해 상당한 코딩 작업이 필요합니다. 가장 어려운 점은 전체 시스템에 영향을 미치지 않고 장애를 로컬로 유지하는 것입니다.

+0

Ngrid는 3 년간 유지 보수가 중단되었으며, 사용자 의견을 더 깊이 파고 들기를 선호합니다. 내결함성으로, 그것은 내 애플 리케이션을 처리하는 문제가되지 않습니다. 작업자가 실패하면, 그것을 확인하고 다시 실행하도록 교차 검사를합니다. –

+0

http://sourceforge.net/projects/ngrid/ : 최종 업데이트 : 2009-08-05. 지나치게 생생하게 보이지 않는다. ( –

1

질문에 답글이 없습니다. 질문이 많습니다. 개념적으로 이것은 매우 간단한 작업이지만 일단 세부 정보를 얻으면 점점 더 어려워집니다.

귀하의 질문에 언급했듯이 나는 당신이 화재를 원하고 분산 프로세서에 대한 작업을 잊고 싶다는 것을 이해합니다. 각 작업이 원자 적이며 반환이 필요 없음을 의미합니다. 이를 수행하는 방법은 분산 노드에 수신 서버를 작성하여 주 노드가 직렬화 된 작업 오브젝트가 포함 된 메시지를 보내어 실행할 수 있도록하는 것입니다. 그런 다음 분산 노드는 새 스레드 (또는 작업자 프로세스)를 실행하여 처리를 수행합니다.

그런 다음 얼마나 많은 기능이 포함되는지에 따라 문제가 확대되기 시작합니다.

+0

개념적 관점과 건축 적 관점에서 볼 때 이는 합리적으로 들린다. 프로그래밍 관점에서 볼 때 다양한 옵션이 있으며 어디서부터 시작해야할지 모르겠다 –

+0

http : //www.c- sharpcorner.com/UploadFile/amit_agrl/DistributedComputing11232005043409AM/DistributedComputing.aspx – Bueller

1

먼저 이해해야 할 점은 확실하게 다른 컴퓨터 (예 : WCF)로 데이터를 보낼 수 있지만 코드/로직을 쉽게 보낼 수 없다는 것입니다. 따라서 다음 두 가지 방법 중 하나로 문제에 접근 할 수 있습니다 :

  • 수동으로 작업자를 데리고 운동에 참여할 각 컴퓨터에 배포하는 "설치 절차"가 있고 데이터 조각을 보내십시오 WCF 또는 MSMQ 또는 기타 원격 통신 기술을 통해 처리하는 방법
  • 마스터 프로세스가 .net 어셈블리를 serialize하고 각 슬레이브/작업자 프로세스로 전송하고 해당 작업자가 어셈블리를 응용 프로그램 도메인으로 이동 한 다음 작업 할 비트를 보내십시오.

어느 쪽이든, 당신은 먼저 등 통신 문제 (당신이 대기열에서 끌어 WCF 같은 것을 통해 넣거나, 당신은 노예를합니까),

관련 문제