마스터/슬레이브 설정으로 개발 한 고 가용성 Windows 서비스에서 문제가 있습니다..NET에서 서비스 간의 통신
컨텍스트 :
하는 서비스 자체는 두 개의 엔드 포인트에 데이터를 동기화. 하나의 엔드 포인트는 로컬 데이터베이스에 동기화되고, 하나의 엔드 포인트는 외부 데이터베이스에 동기화됩니다. 로컬 인 데이터베이스는 두 시스템에서 복제되므로 마스터와 슬레이브가 모두이를 동기화해야합니다. 외부 엔드 포인트는 한 번만 동기화하면됩니다.
마스터는 기본적으로 외부 서비스와 동기화되며, 마스터가 다운되면 슬레이브가 인계합니다. 마스터가 다시 올라가고 슬레이브가 외부와 계속 동기화되면 마스터는 슬레이브에게 작업의 일부를 완료하도록 요청한 다음 마스터에게 나머지 작업을 계속할 수 있도록 알려줍니다.
이 모든 것은 비동기 적으로 발생해야하며, 프로그램이 멈추고 응답하기를 원하지 않습니다. (데이터를 처리하는 슬레이브처럼) 응답하기를 기다리지 않습니다.
이미 모든 로직을 구현했습니다.
설정 : 두 개의 서로 다른 시스템에서 실행
두 Windows 서비스. 현재 Named Pipes를 통해 통신이 이루어지고 있습니다.
문제 :
명명 된 파이프는 수행되고있는 처리량을 충분히 신뢰할 수 없습니다. 또한 종종 충돌이 발생하고 다시 연결/닫고 다시 열 때 많이 사용됩니다. 나는 또한 메시지를 보내거나받을 때 많은 '멈춤'이라는 문제에 직면한다. 재 시도가 가끔은 효과가 있지만 재 시도하지 말아야한다고 생각합니다. 두 인스턴스간에 안정적인 통신이 필요합니다.
솔루션 :
나는 명명 된 파이프에 대한 대안을 찾고 있었어요,하지만 난 그 일을 할 확신있는 해결책을 찾을 수 없습니다. 대부분의 기술은 http를 통한 서비스와 클라이언트 간의 통신을위한 기술이기 때문입니다.
MSMQ를 통한 WCF도 내가 필요로하는 것이 아니기 때문에 둘 다 온라인 일 때만 통신이 이루어지기를 원하기 때문입니다. WCF는 일반적으로 데이터를 수신하고 응답을 보내는 한 끝점에 더 초점을 둡니다. 양방향 통신이 필요하므로 두 인스턴스 모두 언제든지 메시지를 수신하고 보낼 수 있어야합니다.
내 생각에 최선의 선택은 SignalR이지만, 나는 또한 확신하지 못한다.
Redis pub/sub 또는 RabbitMQ는 높은 처리량의 대안입니다. – Steve