두 가지 아키텍처가 있습니다. 본질적으로 그들은 생산자와 소비자를 형성합니다. Piece 1 (p1)은 메시지를 처리하는 Piece 2 (p2)에 메시지를 게시합니다.이 프로세스는 메시지를 처리 한 후 ack해야하는 원격 노드로 메시지를 보내는 작업입니다.이 프로세스는 기껏해야 몇 초가 걸릴 수 있습니다.메시지 대기열 패턴
p2는 대기열에 유한 길이가 있으며 항목은 원격 노드에서 확인을받을 때까지 제거되지 않습니다. 이로 인해 p2는 p1에 대해 QUEUE_FULL 응답을 반환 할 수 있습니다. p1이이 응답을 받으면 큐를 유지합니다. 새 메시지가 생성 될 때마다이 메시지는 큐의 끝에 추가 된 다음 다시 QUEUE_FULL이 될 때까지 p2로 메시지를 보내는 큐를 순환합니다. 여기서 문제는 일단 p2의 대기열이 비어 있거나 공간이 있으면 메시지를 생성하기 위해 p1에 알릴 수 없다는 것입니다.
p2의 제작자 인스턴스마다 p1에 해당 제작자가 있습니다. 이는 아래의 잠재적 해결책에 중요합니다.
대기열에 공간이있을 때 p2에 p2를 알리기 위해 p2를 변경할 수있는 한 가지 해결책이 있습니다. 그러나이 솔루션은 한 번에 수천 개의 p2 대기열에서 가능하기 때문에 상당한 네트워크 오버 헤드 (http)가 필요합니다. 해당 p1 생산자에게 통보해야합니다.
다른 해결책은 p1이 메시지를 p2로 보내려고 계속 변경 될 수 있다는 것입니다. 문제는 p1의 프로듀서가 다음 메시지를 보내려고하기 전에 x를 sleep하는 스레드가 있어야한다는 것입니다.이 sleep/retry 메커니즘을 처리하는 싱글 톤이있을 수 있습니다 만, 여기서 논리는 생산자와 소비자가 증가함에 따라 많은 사람들이 다소 복잡해집니다. , 생산자
- 동기화가 꽉 루프에 대한
- 고려 번 읽을 때 긴 대기 낮은 생산자 카운트
- 고려하면 높은 생산자 카운트
- .. .. etc
p1이 게시되고 p2가 읽는 MQ 계층을 제안하는 것과 비슷합니다. 그러나 이것은 p2가 원격 노드가 사라 졌을 때 p1에 알릴 수없는 새로운 문제를 야기합니다. 그러나 이것은 p2에서 p1 로의 http 콜백에 의해 처리 될 수 있습니다 - 여기서의 오버 헤드 레벨은 원격 노드가가는 기회로 허용됩니다 멀리 떨어져있다.
MQ에 대한 필요성을 제거하는 디자인 패턴이 누락 되었습니까? (걱정할 다른 서비스, 모니터 등)? 생각 많이 감사합니다.
일부 다른 세부 사항 :
- 각 P1 생산 인스턴스는 요청은 대부분
- 각 P2 소비자가 전용 실행중인 스레드에게 있습니다에 대한 범위가
안녕하세요, Zach. 교장 선생님과 동의합니다. MQ를 추가하면 여러 단계에서 매우 유용합니다. 다른 서비스를 추가하는 것에 대한 기본 관심사는 주로 내가 일하는 프로세스와 관련이 있기 때문에이 옵션을 시작하기 전에 다른 모든 옵션을 확실히 다루고 싶었습니다. – Mike
그 위치에 있다는 것을 완전히 이해하십시오! 행운을 빕니다! –