영구 메시징/서비스 버스 - 내 자신의 롤 또는 학습 곡선을 위험에 빠뜨리십니까?

StackOverflow https://stackoverflow.com/questions/828778

  •  06-07-2019
  •  | 
  •  

문제

다양한 알림을 위해 서버에 메시지를 보내야하는 클라이언트 응용 프로그램이 있습니다. 클라이언트가 때때로 연결될 수 있도록 메시지 큐 접근 방식을 사용하겠습니다. 대기열 처리는 큐에서 메시지를 제거하고 웹 서비스를 호출하여 다른 큐에 넣어 최종적으로 처리됩니다. 이 질문은 고객 환경에 관한 것입니다. 서버 환경은 이미 결정되었습니다.

MSMQ를 올바르게 설치/구성하고 안전하기 위해 모든 클라이언트 PC를 제어 할 수없고 MSMQ 큐의 내용을 조사하기위한 툴링 품질로 인해 지원이 더 어려워지기 때문에 MSMQ를 사용하고 싶지 않습니다. . SQL Server 2005 Express는 모든 기계에 있으며 응용 프로그램의 데이터를 저장하는 데 사용됩니다.

나는 현재 두 가지 옵션으로 줄어 듭니다.

  1. 메시지를 직렬화 한 후 테이블에 저장하는 상당히 기본적인 지속적인 메시지 큐를 작성한 다음 사용합니다. ThreadPool.QueueUserWorkItem 각 메시지 유형에 대해 핸들러에 의해 처리되도록합니다. 모두 a System.Transactions.TransactionScope 따라서 성공적으로 처리 된 경우 지속적인 대기열에서만 제거됩니다.
  2. 로컬 데이터베이스를 사용하는 서비스 브로커 전송과 함께 클라이언트에서 NSERVICEBUS (팀으로서 우리가 팀으로 간 서비스 버스입니다)를 사용하십시오.

서비스 버스에 대한 경험이 거의 없습니다 (여전히 서비스 버스 용어를 얻지 못합니다). 따라서 필요한 방식으로 내 요구 사항을 충족하는 훨씬 간단한 글을 쓰는 것과 비교하여 학습 곡선에 대해 걱정하고 있습니다 (배포는 고려 사항).

누구든지 생각이 있습니까?

도움이 되었습니까?

해결책 3

결국 나는 내 자신의 sqltransport로 구성된 기본 메시지 버스를 작성하여 메시지가 올라가고 별도의 스레드가 메시지를 처리하기 위해 SQL Server 데이터베이스 테이블에 메시지를 직렬화하고 SQL Server 데이터베이스 테이블에 저장하도록했습니다.

다른 팁

글쎄, 나는 MSMQ를 제안 할 것이라는 것을 모르겠지만, '자신의 롤'에 대해 생각할 가장자리 사례가 많이 있다고 제안 할 것입니다.

스레드 풀 접근 방식을 사용하더라도 관리하는 경우 주문 문제가있을 수 있습니다. 스레드 풀에 순차적으로 게시 될 수 있습니다. ~ 아니다 스레드 풀이 작업 항목을 처리하는 방법으로 인해 순서대로 실행됩니다.

또한 메시지의 지속성, 존재가 얼마나 오래 존재 해야하는지, '치명적인'비 배달 상태를 감지하는 방법 및이 경우해야 할 일에 대해 생각해야합니다.

시나리오에는 앱이 메시지를 대기하는 것과 동시에 내려 오는 시나리오에는 여러 가지 잠재적 인 에지 사례가 있습니다. 예를 들어, 메시지가 대기 되었음에도 불구하고 메시지가 대기되었음을 인정하지 못할 수 있습니다. 예, 큐 승인을 ACK 할 수는 있지만 ACK 서클에 끝없이 들어갈 수 있습니다 ...

앱이 연결될 때 앱을 감지하고 해당 시점에서 모든 데이터를 보내지 않겠습니까?

우리 자신의 서비스 버스를 작성한 후 나는 그것이 사소한 사업이 아니라고 말할 수 있으며 다른 모든 구현자가 이미 들어온 것과 동일한 엣지 케이스에 부딪 칠 것입니다. Kyoryu는 매우 중요한 두 가지를 제기합니다.

당신이 당신의 자신을 굴려야하는지는 사내에서 가지고있는 기술에 달려 있으며 앞으로 솔루션을 유지하기 위해 가질 것입니다.

또 다른 고려 사항은 시스템의 최종 규모와 신뢰성 요구 사항입니다. 사내 솔루션의 규모가 충분히 규모됩니까?

Zeromq (Transport), Cassandra (피어 발견 및 지속성) 및 protobuf (직렬화)를 기반으로 한 동료 투 피어 메시지 버스 인 Zebus.

  1. 클라이언트와 같이 클라이언트 배포가 없음 그것은 단지 라이브러리 일뿐입니다.
  2. 메시지 지속성 Cassandra를 사용하여 제공되며 다양한 에지 케이스를 처리합니다 (이것은 우리 생산 환경에서 정기적으로 테스트됩니다).
  3. 잘 수행되고 중개인 솔루션이므로 단일 성능 병목 현상이 없습니다.
  4. 디렉토리를 Cassandra와 같은 사용 가능한 데이터 저장소와 함께 사용할 수 있으므로 단일 고장 지점이 없습니다.

오픈 소스 및 생산 테스트입니다 https://github.com/abc-arbitrage/zebus

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top