2009-08-06 5 views
1

두 가지 아키텍처가 있습니다. 본질적으로 그들은 생산자와 소비자를 형성합니다. 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 소비자가 전용 실행중인 스레드에게 있습니다에 대한 범위가
  • 답변

    3

    마이크,

    그것은 과정처럼 보인다 단지 MQ를 사용하지 않는 것이 (더 도입의 가능성과) 상당한 복잡성이있다? MQ를 사용하지 않을 이유가 많이있을 수 있습니다. 경험상 비용이 들지만 액세스 권한이 있으면 야생 포기와 함께 사용하십시오! :) 새로운 MQ 프로세스를 모니터하는 것이 코드와 비슷한 기능을 소개하는 것보다 훨씬 쉽습니다.

    이상적으로, 강력한 큐 P2, 또는 그 상태에 대해 알 필요 지금까지 정말 P1을 방지합니다. P1 행복 (메시지 주파수/크기/저장 용량 제한에 따라) P2로 메시지를 대기열 계속할 수 - P2는 원격 노드가 내려 갔다 P1 통지하는

    MQ는 정말로 필요를 경감한다. 원격 노드가 상당한 시간 동안 다운 된 경우 계획된 이벤트 였고 작업자는 P1을 종료 할 수 있기를 바랍니다. P2와 P1 사이의 관리 채널은 좋은 것처럼 들립니다.

    는 또한 복잡해 - 당신은 당신의 환경을 알고 있지만이 같은 질문으로 이어질 수 있습니다 "더 이상 왜 점점 아니에요 메시지?" - 서비스가 자율적으로 다른 서비스를 종료한다는 것이 밝혀졌습니다. 제대로 했어, 이것은 굉장하고 운영자에 대한 지원 부담을 덜어줍니다. 잘못하면 더 많은 지원 부담이 추가됩니다. 아무도 그 사람을 좋아하지 않아.

    당신은 또한 P2의 저장은 문제의 많은되지 않을 수 있습니다 데이터 계층에서 큐 수 있을까요?

    대기열 수용 (MQ, MSMQ, SQL 대기열)!

    +0

    안녕하세요, Zach. 교장 선생님과 동의합니다. MQ를 추가하면 여러 단계에서 매우 유용합니다. 다른 서비스를 추가하는 것에 대한 기본 관심사는 주로 내가 일하는 프로세스와 관련이 있기 때문에이 옵션을 시작하기 전에 다른 모든 옵션을 확실히 다루고 싶었습니다. – Mike

    +0

    그 위치에 있다는 것을 완전히 이해하십시오! 행운을 빕니다! –

    1

    검토 3 수

    • http 명령 호출 대신 서비스 명령을위한 또 다른 MQ를 열어 보겠습니다.
    • p2는 대기열이없는 하나의 스레드가 MQ로부터 메시지를 추출하여 처리를 위해 다른 스레드에 배치하는 다중 스레드라고 간주하십시오.
    • (!) MQ의 트랜잭션 버전을 사용합니다. 따라서 p2는 메시지를 즉시 추출 할 수 있으며 p1은 최대한 빨리 메시지를 배치 할 수 있습니다. 그러나 처리가 실패하면 대기열이 롤백됩니다.
    +0

    Z 나는이 아이디어를 좋아한다. P1 및 P2는 작년의 전체 XON/XOFF 흐름 제어와 유사하게 서로에 대한 제어 메시지 채널에 가입 할 수 있습니다. P1이 비게되면 P2의 제어 채널에 화재 발생을 알리는 메시지를 보냅니다. –

    +0

    하지만 신은 다른 MQ 서버 나 HTTP 서비스를 소개하지 않습니다. MQ 사용의 요점은 그것으로부터 벗어나는 것입니다. –

    +0

    @darthcoder, @ dewfy의 첫 번째 글 머리 기호를 다른 MQ 채널이 아닌 다른 MQ 서비스로 읽습니다. @dewfy - 관리 채널과 함께 좋은 아이디어, 간단하고 그것을 놓쳤습니다. 감사! – Mike

    관련 문제