번역
메시징은 모든 분산 시스템의 근본적인 부분입니다. 이 기능은 생산자가 원하는 수의 소비자에게 메시지를 보낼 수 있게 하며, 소비자에 대한 정보를 알 필요가 없습니다. 이는 진정한 비동기 및 분리 통신에 큰 도움이 됩니다.
RabbitMQ을 사용할 때, 위의 다이어그램은 매우 기본적이지만 전형적인 구조를 보여줍니다. 프로듀서는 스위치에 메시지를 보냅니다. 라우팅 논리에 따르면, 스위치는 메시지를 스위치에 묶인 큐에 넣습니다. 더 구체적으로, 브로드캐스트 타입 스위치라면 이 메시지의 복사본이 각 큐에 반복적으로 전송됩니다. 소비자는 그 메시지를 받고 처리할 수 있습니다.
위 구조가 생산자와 소비자에게 성공적으로 작동하려면 모든 RabbitMQ 구성 요소(예: 큐, 스위치, 바인딩)가 사전에 생성되어야 한다는 중요한 가정이 있습니다. 소비자는 스위치에 메시지를 보낼 수 없습니다. 스위치가 존재하지 않는다면, 존재하지 않는 큐에서 메시지를 처리할 수 없습니다.
따라서 생산자/소비자가 메시지를 보내거나 받기 전에 생산자/소비자 값이 큐, 스위치, 그리고 바인딩 관계를 생성하도록 하는 것이 이해하기 어렵지 않습니다. 각 방법의 장단점을 살펴보겠습니다.
1. 책임 구분
이미지 변환 (1. 프로듀서가 스위치를 생성 2. 컨슈머가 큐를 생성하고 큐를 스위치에 바인딩함)
생산자와 소비자가 완전히 분리되려면, 이상적으로는 생산자는 스위치에 대한 정보만 알고(대기열은 알지 못하고), 소비자는 대기열에 대해서만 알고, 스위치는 알지 못합니다. 바인딩 관계는 스위치와 큐 간의 관계를 나타냅니다
한 가지 가능한 방법은 생산자가 스위치 생성을 처리하고, 소비자가 큐를 생성하고 큐를 스위치에 묶는 것입니다. 이 분리 방법의 장점은 소비자가 큐를 필요로 할 경우 단순히 큐를 만들고 수요에 따라 묶기만 하면 되며, 생산자는 큐에 대한 정보를 알 필요가 없다는 점입니다. 하지만 이는 충분한 분리가 아닙니다: 소비자가 스위치를 알면 그것을 결합할 수 있기 때문입니다.
2. 생산자가 모든 것을 창조합니다
프로듀서가 실행 중일 때는 스위치, 큐, 바인딩과 같은 모든 필요한 컴포넌트를 생성하도록 설정할 수 있습니다. 이 접근법의 장점은 메시지가 손실되지 않는다는 점입니다(큐가 이미 생성되고 스위치에 바인딩되어 있어 소비자가 먼저 시작할 필요가 없기 때문입니다).
하지만 이는 생산자가 스위치에 연결해야 할 모든 큐를 알아야 함을 의미합니다. 이것은 매우 결합된 방식입니다. 그 이유는 새로운 큐를 추가할 때마다 제작자가 큐를 생성하고 결속하기 위해 재구성하고 배포해야 하기 때문입니다
3. 소비자가 모든 것을 창조한다
반대로 소비자가 실행 중에 필요한 스위치, 큐, 바인딩을 직접 생성하도록 하는 것입니다. 이전 방법과 마찬가지로, 이 방법은 소비자가 자신이 큐에 묶인 스위치에 대한 정보를 알아야 하므로 결합을 생성합니다. 스위치에 변경(예: 이름 변경)이 있으면 모든 소비자가 재구성되고 배포되어야 합니다. 대기줄과 소비자가 많을 때, 이러한 복잡성은 매우 부담스러울 수 있습니다.
4. 둘 다 아무것도 창조하지 않는다
완전히 다른 접근법은 생산자와 소비자 모두 필요한 부품을 직접 만들지 않는 것입니다. 대신, 관리자 플러그인이나 관리자 CLI의 사용자 인터페이스를 통해 미리 생성됩니다. 이 방법은 다음과 같은 장점에 기반합니다:
- 생산자와 소비자는 완전히 분리될 수 있습니다. 생산자는 교환만 알고, 소비자는 대기열만 알고 있습니다.
- 이 과정은 배포 파이프라인의 일부로서 쉽게 스크립트화되고 자동화될 수 있습니다
- 새로운 큐와 같은 변경 사항은 기존 배포된 퍼블리셔나 소비자를 건드리지 않고 추가할 수 있습니다
요약
분산 시스템에서는 비동기 메시지가 분리되는 유용한 방법이지만, 분리를 유지하려면 기본 메시지 구조(RabbitMQ에서는 큐, 스위치, 바인딩)를 효과적으로 유지하는 전략을 유지해야 합니다.
퍼블리셔와 소비자 서비스가 스스로 필요한 것을 만들 책임이 있을 수 있지만, 초기 메시지 손실, 결합, 운영 유지보수(구성 및 배포 측면) 측면에서 비용이 많이 들 수 있습니다.
메시징 시스템 구성을 제자리에 두고 처리하는 가장 좋은 방법은 애플리케이션 외부에서 스크립트를 작성하는 것입니다. 이로 인해 서비스는 분리된 상태를 유지하고, 대기열 시스템이 필요에 따라 동적으로 변경될 수 있으면서도 많은 기존 서비스에 영향을 주지 않습니다.
원문 언어:하이퍼링크 로그인이 보입니다. 원본 영어:하이퍼링크 로그인이 보입니다.
|