2012-11-12 1 views
2

작업 : 여러 인스턴스에서 실행할 수있는 C# .net을 사용하여 콘솔 앱을 만들어야합니다. (확장 성 목적으로)C#에서 다중 인스턴스 응용 프로그램을 설계하는 방법은 무엇입니까?

스트레이트 포워드 응용 프로그램을 만들면 이제 간단합니다. 내 문제는 지금 내 애플 리케이션에 전역 변수가 있습니다. 이 앱이 무엇인지 생각해보십시오. 이것은 JSON 메시지를받는 작은 프로그램입니다 (메시징 부분에 RabbitMQ를 사용했습니다). 수신 한 메시지는 전역 변수에 저장됩니다. 이제는 여러 인스턴스에서 앱을 실행하기가 어렵습니다. 앱의 인스턴스를 두 개 이상 실행하면 다른 앱에서 메시지를받을 수 있기 때문일 수 있습니다. 그것은 RabbitMQ의 라운드 로빈 동작 때문입니다. (Exchange 만들기 또는 라우팅 키는 옵션이 아닙니다.)

공유 메모리 또는 MemoryMappedFile을 사용해 보았지만 작동하지 않습니다.

내가 마음에 가지고있는 또 다른 한 가지는 DB를 사용하는 것입니다. 하지만 이렇게하려면 좋은 디자인이 필요합니다. 누군가가 패턴, 예제 또는 기타 참조를 알고있는 경우. 알려줘.

귀하의 답변은 높이 평가됩니다.

+0

귀하의 의도에 대한 자세한 정보를 제공해 주시겠습니까? 여러 인스턴스가있는 메시지를 처리 ​​하시겠습니까? 뭔가를 병렬 처리 하시겠습니까? – Dusan

+0

안녕하세요 @ 두산, 여러 개의 인스턴스에서 메시지를 처리하는 것과 비슷합니다. (방식으로). 그래서 여기에 문제가 있습니다, 나는 RabbitMQ를 사용하고 있습니다. 내 응용 프로그램이 대기열에서 소모됩니다. 응용 프로그램의 여러 인스턴스를 실행하면 대기열에 2 명의 사용자가 있음을 의미합니다. 이제 메시지가 대기열로 들어옵니다. 첫 번째 앱으로 이동하고 다른 메시지가 오면 두 번째 앱으로 이동합니다. (라운드 로빈 패션). 이제 2 차 앱에서 얻을 수있는 메시지가 동일한 메시지 일 수 있으므로 ID를 사용하여 해당 메시지가 이미 존재하는지 확인하는 방법을 찾아야합니다. –

+0

OK, clear ... – Dusan

답변

1

저는 MemoryMappedFiles을 사용할 것입니다. DB를 무시하는 가장 간단한 방법입니다. 나는 왜 당신을 위해 일하지 않았는 지 잘 모르겠다.

응용 프로그램의 각 인스턴스는이 파일에 자신을 "등록"하고 데이터를 쓸 파일 부분을 할당합니다. 메시지를 받으면 파일 전체에 저장된 다른 인스턴스의 데이터를 확인하십시오.

모든 작업 (인스턴스 레지스터, 쓰기, 읽기)에 뮤텍스를 사용할 수 있습니다. 일관된 데이터 그림이 보장됩니다.

+0

안녕 Dusan, 나는 MemoryMappedFiles가 나를 위해 일할 것이라고 생각하지 않습니다. 첫 시도를 할 수 있다고하더라도 여전히 바람직하지는 않습니다. 앱의 다른 인스턴스가 다른 컴퓨터에서 실행될 수 있기 때문입니다. –

+0

안녕하세요. 이 경우 어떤 종류의 공유 ​​리소스를 사용해야합니다. 필자가 생각하기에, 데이터베이스는 동시 액세스를 해결할 때 간편하고 간단하게 접근 할 수 있습니다. – Dusan

+0

그러나 사용자 정의 솔루션을 사용하려면 일부 상황에서 적절한 방식으로 동시 데이터를 처리해야합니다. Petreson 's Algorithm을 출발점으로 생각해보십시오. 간단하고 간단하게 동시성을 해결할 수 있습니다. http://en.wikipedia.org/wiki/Peterson%27s_algorithm – Dusan

1

메모리 매핑 된 파일이 실제로 작동하지 않는 경우 아키텍처를 약간 변경하는 방법에 대해 설명합니다. 메인 콘솔 어플리케이션 (서버의 일종)이 있으면, 필요에 따라 다른 콘솔 어플리케이션 (클라이언트 종류)을 생성 할 수 있습니다. 그들은 Anonymous Pipes for Local Interprocess Communication (또는 다른 프로세스 간 통신 메커니즘)을 사용하여 메시지가 이미 처리되었거나 서버에 목록이없는 경우 서버와 확인합니다.

0

아키텍처는 다음과 같습니다.

컨트롤러. 큐에서 메시지를 읽고 할당합니다.

1 개 이상의 처리기. 컨트롤러는 부하에 따라 필요에 따라 하나 이상의 핸들러를 인스턴스화합니다. 핸들러는 명확한 시작/끝을 가져야합니다. 즉, 하나를 실행하고 메시지를 전달하면 해당 메시지가 제대로 처리되면 완전히 종료됩니다.


또는 Biztalk 또는 유사한 메시지 처리 응용 프로그램 서버를 구입하십시오. 그것이 바로 그러한 것들을위한 것입니다.

귀하의 가장 큰 관심사는 실제로 안정성에 관한 것입니다. 특히 메시지가 실제로 처리되었음을 알았습니다. 따라서 하드웨어 장애 (데이터베이스와 같은), 컨트롤러와 핸들러 간의 통신 메커니즘 (무엇이든 될 수 있음) 및 장시간 실행되는 프로세스를 가정 한 몇 가지 응답 방식을 견뎌내는 저장 메커니즘이 필요합니다. 아마 핸들러 중 하나가 배꼽을 넘지 않았 음을 확인하기 위해 하트 비트 조각이있을 것입니다. 확실히 메시지가 실패 할 경우 자동으로 재 처리하는 방법입니다.마지막으로 시스템을 압도하지 못하도록 X 번호를 동시에 실행하도록 처리기를 조종 할 방법이 필요합니다.

즉, 메시지를 삭제하거나 무시하거나 처리하지 않는 한 "간단한"앱이 아닙니다.

관련 문제