2009-10-12 3 views
1

현재 PC에서 단일 인스턴스를 실행하는 C# 서비스가 있습니다. 여러 PC에서 실행되도록이 구성 요소를 분할하고 싶습니다. 각 PC에는 작업의 특정 부분이 지정되어야합니다. 한 대의 PC에 오류가 발생하면 작업을 백업 시스템으로 옮겨야합니다.C#의 고 가용성 및 확장 성

데이터 동기화는 DB로 수행 할 수 있으므로 큰 문제는 아닙니다. 나의 현재 아이디어는 들어오는 요청을 분할하여 PC 어레이로 전송하고 작업이 실제로 처리되는지 확인하는 일종의로드 밸런서를 사용하는 것이다.

어떻게 이러한 기능을 구현합니까? 나는 옳은 질문을하고 있는지 확신 할 수 없다. 이 목표를 달성하는 방법에 대한 나의 이해가 잘못 되었다면, 힌트를주십시오.

편집 : 아이디어는 위 (PC 및 결과에 대한 점검에로드 밸런서 splitswork 패키지) 주어진 궁금

  1. 이 모두 가능하다. 이 겉보기에 일반적인 문제가 이미 구현 된 솔루션의 일종 있다면, 그 솔루션을 사용하고 싶습니다.

  2. 가용성은 필수 조건입니다.

답변

6

내가 부하 공유의 풀 모델보다는 푸시 모델을보고 권 해드립니다. 작업을 푸시 할 때 조정 서버 /로드 밸런서는 시스템에서 현재 실행중인 모든 서버를 인식하여 요청을 전달할 위치를 알고 있어야합니다. 이것은 config에 설정되거나 동적으로 설정되어야합니다 (예 : 게시자 - 구독자 모델). 그런 다음 서버가 오프라인 상태인지 여부를 지속적으로 확인해야합니다. 완전히 가능하지만 응용 프로그램의 크기 조정을 복잡하게 만들 수 있습니다.

풀 아키텍처를 사용하면 중앙 작업 큐 (MSMQ, Sql Server Service Broker 또는 유사한 방식으로 호스트 됨)가 있으며 각 처리 서비스가 해당 큐에서 작업을 가져옵니다. WCF 서비스를 공개하여 외부 요청을 수용하고 대기열에 작업을 배치하십시오. 어떤 서버가 작업을 수행하는지에 대한 지식이 있어도 안전합니다. 이는 각 서버가 자신의 작업 부하를 모니터링하고 준비가되었을 때 작업을 선택하고 구성을 변경하지 않고이 모델에서 서버를 쉽게 추가하거나 제거 할 수 있다는 이점이 있습니다.

이 아키텍처는 NServiceBus 및 Windows Azure 웹 간의 통신 & 작업자 역할에 의해 지원됩니다.

0

서버를 사용하고 처리를 멀티 스레드하는 것은 어떻습니까? 또는 표준 데스크탑에서 많은 코어를 사용할 수 있으므로 PC에서의 멀티 스레딩도 가능합니다.

이것은 분명히 다운되는 기계를 다루지는 않지만 적은 투자로 더 많은 성능을 제공 할 수 있습니다.

+0

예, 단일 PC의 경우 좋은 생각이지만 여전히 가용성이 필요합니다. – mafu

1

(이 자체가 내가 대답 할 수있는 서비스에 대한 자세한 내용을 넣을 수 있습니다) 서비스의 동작에 따라 문제의 설정 처리해야

각 PC에 특정 부분을 할당해야합니다. 하나의 PC가 실패하면, 그 작품은 그렇지 않으면 다른 PC로 작업을 이동할 수 없습니다 백업 기계

로 이동해야합니다.

개별 PC에 작업을 배포하는 중앙 서버를 설치해야하는 유혹을 느낍니다. 즉, 각 시스템간에 몇 가지 통신 방식이 필요하며 중앙 서버에 어떤 작업이 할당되었는지 다시 기록 할 수 있습니다.

또한 CPU 사용량이 너무 많을 경우 각 컴퓨터에서 해당 CPU로드를 측정하고 작업을 거부해야합니다.

서비스에 대한 멀티 스레드 접근 방식은 오늘날 유비 쿼터스 인 다중 프로세서 코어를 효과적으로 활용할 수 있습니다.이것은 당신이 당신의 작업 부하를 분할하고 싶었 방법에 따라 달라집니다

0

,이 보통

  • 분할 다중 서비스

    이 다른 서버에 설치되는 동일한 서비스를 수단과 의지하여 동일한 작업 수행 같은 일을하십시오. 귀하의 서비스가 db 서버에서 거대한 데이터를 읽고 커다란 클라이언트 특정 데이터 파일을 생성하기 위해 처리하고 있다고 가정하고 마지막으로이 데이터 파일이 클라이언트로 전송되었습니다. 이 접근 방식에서는 diff 서버에 설치된 모든 서비스가 동일한 작업을 수행하지만 작업을 분할하여 성능을 향상시킵니다.

  • 분할 다중 서비스 각 서비스가 indivitual 작업에 할당 된 다른 목표에 작동됩니다이 방법에서

    하여 작업 부하의 일부입니다. 위의 예에서 하나의 서비스는 db에서 데이터를 읽고 거대한 데이터 파일을 생성하고 다른 서비스는 데이터 파일을 읽고 클라이언트로 전송하도록 구성됩니다.

나는 내 작품 중 하나 인 제 2 접근 방식을 구현했습니다. 이렇게하면 어떤 오류가 발생했을 때 오류를 격리하고 디버깅 할 수 있습니다.

0

부하 분산 장치의 일반적인 방법은 모든 서비스 인스턴스간에 서비스 요청을 균등하게 분할하는 것입니다.

각 작업 항목 (요청)에 대해 데이터베이스에 상대 정보를 저장할 수 있습니다. 그런 다음 각 서비스에는 버려진 작업 항목에 대한 백그라운드 스레드 검사 데이터베이스가 하나 이상 있어야합니다.

0

WCF (Windows Communication Foundation)를 통해 서비스를 게시하는 것이 좋습니다.

그런 다음 사용 가능한 서비스 공급자를 추적하고 작업을 정리할 수있는 "중앙"클라이언트 응용 프로그램을 구현하십시오. 중앙 애플 리케이션은 수행 할 작업의 스케줄러 및로드 밸런서 역할을합니다.

WCF에 대한 Juwal Lövy의 저서 ("프로그래밍 WCF 서비스")에서이 항목에 대한 좋은 소개를 확인하십시오. http://ngrid.sourceforge.net/

또는 Alchemi : http://www.gridbus.org/~alchemi/index.html

모두 당신이 시간에 시작하는 것이다로드 밸런서와 그리드 컴퓨팅 프레임 워크입니다

0

당신은 NGrid을 볼 수있다.

건배,

플로리안