2017-11-14 25 views
1

마스터/슬레이브 설정으로 개발 한 고 가용성 Windows 서비스에서 문제가 있습니다..NET에서 서비스 간의 통신

컨텍스트 :

하는 서비스 자체는 두 개의 엔드 포인트에 데이터를 동기화. 하나의 엔드 포인트는 로컬 데이터베이스에 동기화되고, 하나의 엔드 포인트는 외부 데이터베이스에 동기화됩니다. 로컬 인 데이터베이스는 두 시스템에서 복제되므로 마스터와 슬레이브가 모두이를 동기화해야합니다. 외부 엔드 포인트는 한 번만 동기화하면됩니다.

마스터는 기본적으로 외부 서비스와 동기화되며, 마스터가 다운되면 슬레이브가 인계합니다. 마스터가 다시 올라가고 슬레이브가 외부와 계속 동기화되면 마스터는 슬레이브에게 작업의 일부를 완료하도록 요청한 다음 마스터에게 나머지 작업을 계속할 수 있도록 알려줍니다.

이 모든 것은 비동기 적으로 발생해야하며, 프로그램이 멈추고 응답하기를 원하지 않습니다. (데이터를 처리하는 슬레이브처럼) 응답하기를 기다리지 않습니다.

이미 모든 로직을 구현했습니다.

설정 : 두 개의 서로 다른 시스템에서 실행

두 Windows 서비스. 현재 Named Pipes를 통해 통신이 이루어지고 있습니다.

문제 :

명명 된 파이프는 수행되고있는 처리량을 충분히 신뢰할 수 없습니다. 또한 종종 충돌이 발생하고 다시 연결/닫고 다시 열 때 많이 사용됩니다. 나는 또한 메시지를 보내거나받을 때 많은 '멈춤'이라는 문제에 직면한다. 재 시도가 가끔은 효과가 있지만 재 시도하지 말아야한다고 생각합니다. 두 인스턴스간에 안정적인 통신이 필요합니다.

솔루션 :

나는 명명 된 파이프에 대한 대안을 찾고 있었어요,하지만 난 그 일을 할 확신있는 해결책을 찾을 수 없습니다. 대부분의 기술은 http를 통한 서비스와 클라이언트 간의 통신을위한 기술이기 때문입니다.

MSMQ를 통한 WCF도 내가 필요로하는 것이 아니기 때문에 둘 다 온라인 일 때만 통신이 이루어지기를 원하기 때문입니다. WCF는 일반적으로 데이터를 수신하고 응답을 보내는 한 끝점에 더 초점을 둡니다. 양방향 통신이 필요하므로 두 인스턴스 모두 언제든지 메시지를 수신하고 보낼 수 있어야합니다.

내 생각에 최선의 선택은 SignalR이지만, 나는 또한 확신하지 못한다.

+0

Redis pub/sub 또는 RabbitMQ는 높은 처리량의 대안입니다. – Steve

답변

1

MassTransitRabbitMQ 이상 보셨나요?

우리는 몇 년 동안 내부 서비스 및 클라이언트/서비스 통신 모두를 위해 이들을 매우 성공적으로 함께 사용했습니다.

+0

나는 그것을 들여다 보겠다.하지만 MassTransit의 소개에 의하면 그것은 내가 필요한 바로 그 것 같다. 그러나 이것은 서버에 몇 가지 의존성을 설치해야한다는 것을 의미하며, 이는 번거 로움이 될 수 있습니다 ... –

+0

그것을 조사해 보았습니다. 설정을 시도했습니다.내 주요 질문은 지금, 두 서버 모두에서 RabbitMQ 인스턴스를 구성해야합니까? 따라서 주인이 노예에 무언가를 요구할 때마다, 주인은 노예에 사실을 말하고, 노예가 주인에게서 무언가를 묻는 경우에 그것은 다른 방법입니다. 나는 손님을보다 안전한 사람으로 바꾸는 방법을 알아낼 수 없다. –

+0

RMQ 서버는 어디에도있을 수있다. 우리는 그것을 다른 상자에 가지고있다. 각 노드가 동일한 RMQ 인스턴스에 있도록 [MT 메시지 사용자를위한 교환 수신] (http://masstransit-project.com/MassTransit/usage/containers/autofac.html)을 구성하기 만하면됩니다. – ultra909