사용 사례
스트림은 초기에 기존 대기열 유형이 제공할 수 없거나 제공할 수 없는 단점이 있는 4가지 메시징 사용 사례를 다루기 위해 개발되었습니다.
- 대형 팬아웃
여러 구독자에게 동일한 메시지를 전달하려는 경우 사용자는 현재 각 소비자에 대한 전용 대기열을 바인딩 해야 합니다. 소비자 수가 많으면 특히 지속성 또는 복제를 원할 때 잠재적으로 비효율적입니다. 스트림을 사용하면 많은 소비자가 비파괴적인 방식으로 동일한 대기열에서 동일한 메시지를 소비할 수 있으므로 여러 대기열을 바인딩 할 필요가 없습니다. 스트림 소비자는 읽기 로드가 클러스터 전체에 분산되도록 복제본에서 읽을 수도 있습니다. - 리플레이 / 시간 여행
현재의 모든 RabbitMQ 대기열 유형에는 파괴적인 소비동작이 있으므로 소비자가 메시지 사용을 마치면 대기열에서 메시지가 삭제되므로 소비된 메시지를 다시 읽을 수 없습니다. 스트림을 사용하면 로그의 어느 시점에나 첨부하고 그 곳에서 읽을 수 있습니다. - 처리 성능
영구 대기열 유형은 기존 로그 기반 메시징 시스템과 경쟁할 수 있는 처리량을 제공할 수 없습니다. 스트림은 성능을 주요 목표로 하여 설계되었습니다. - 대형로그
대부분의 RabbitMQ 큐는 빈 상태로 수렴하도록 설계되었으며 이와 같이 최적화되어 지정된 큐에 수백만 개의 메시지가 있는 경우 성능이 저하될 수 있습니다. 스트림은 메모리 내 오버헤드를 최소화하면서 효율적인 방식으로 더 많은 양의 데이터를 저장하도록 설계되었습니다.
단일 활성 소비자
스트림에 대한 단일 활성 소비자는 RabbitMQ 3.11 이상에서 사용할 수 있는 기능입니다. 스트림에서 독점 소비 및 소비 연속성을 제공합니다. 동일한 스트림과 이름을 공유하는 여러 소비자 인스턴스가 단일 활성 소비자를 활성화 하는 경우 이러한 인스턴스 중 하나만 한 번에 활성화되므로 메시지를 수신합니다. 다른 인스턴스는 유휴 상태가 됩니다.
단일 활성 소비자 기능은 2가지 이점을 제공합니다.
- 메시지는 순서대로 처리됩니다. 한 번에 하나의 소비자만 있습니다.
- 소비 연속성이 유지됩니다. 활성 소비자가 중지하거나 충돌하면 그룹의 소비자가 이어받습니다.
슈퍼 스트림
슈퍼 스트림은 큰 스트림을 더 작은 스트림으로 분할하여 확장하는 방법입니다. 단일 활성 소비자와 통합되어 파티션 내에서 메시지 순서를 유지합니다. 슈퍼스트림은 RabbitMQ 3.11 이상에서 사용 가능합니다.
슈퍼 스트림은 개별 일반 스트림으로 구성된 논리적 스트림입니다. 이는 RabbitMQ 스트림을 사용하여 게시 및 소비를 확장하는 방법입니다. 큰 논리 스트림은 파티션 스트림으로 분할되어 여러 클러스터 노드에서 스토리지와 트래픽을 분할합니다. 슈퍼 스트림의 토폴로지는 AMQP 0.9.1 모델을 기반으로 합니다. 즉, 이들 간의 교환, 대기열 및 바인딩입니다.
- 슈퍼 스트림은 개별 스트림에 비해 복잡성을 추가하므로 스트림과 관련된 모든 사용 사례에 대한 기본 솔루션으로 간주해서는 안됩니다. 개별 스트림의 한계에 도달했다고 확신하는 경우에만 슈퍼 스트림 사용을 고려해야 합니다.
지연적 모드
스트림은 모든 데이터를 디스크에 직접 저장하며, 메시지가 작성된 후에는 메시지를 읽을 때까지 메모리를 사용하지 않습니다.
글로벌 QoS(Quality of Service)
메시지가 소비자에게 전달될 때 처리되는 방식의 구성을 나타냅니다. 전역 QoS 설정은 채널의 모든 소비자에게 적용되므로 여러 소비자가 동일한 대기열의 메시지를 처리하는 시나리오에서 유용할 수 있습니다. 각 소비자에게 전달되는 메시지 수를 제한하여 단일 소비자가 시스템을 압도하거나 메시지 지연을 유발하는 것을 방지할 수 있습니다.
전역 QoS 설정은 메시지가 처음 대기열에 개시될 때가 아닌 소비자에게 전달될 때만 적용된다는 것이 중요합니다. 또한, 전역 QoS설정은 소비자별 QoS 설정으로 재정의 할 수 있으므로 개별 소비자가 다른 메시지 전달 속도를 요청할 수 있습니다.
데이터 보존
스트림은 변경할 수 없는 추가 전용 디스크 로그로 구현됩니다. 즉, 디스크가 부족할 때까지 로그가 무한정 커집니다. 이 부적절한 시나리오를 방지하기 위해 총 로그 데이터 크기/ 또는 기간 기준으로 로그에서 가장 오래된 데이터를 삭제하는 스트림당 보존 구성을 설정할 수 있습니다.
성능 특성
스트림은 어떤 작업을 수행하기 전에 모든 데이터를 디스크에 유지하므로 가장 빠른 디스크를 사용하는 것이 좋습니다. 디스크 I/O가 많은 스트림의 특성으로 인해 메시지 크기가 증가하면 처리량이 감소합니다.
쿼럼 대기열과 마찬가지로 스트림도 클러스터 크기의 영향을 받습니다. 스트림에 복제본이 많을수록 데이터를 복제하고 합의를 달성하기 위해 더 많은 작업을 수행해야 하므로 일반적으로 처리량이 낮아집니다.
데이터 안전
스트림은 여러 노드에서 데이터를 복제하고 게시자 확인은 데이터가 스트림 복제본의 쿼럼에 복제된 후에만 발행됩니다.
스트림은 항상 디스크에 데이터를 저장하지만 운영체제 페이지 캐시에서 기본 저장 매체로 데이터를 명시적으로 플러시 하지 않고 대신 필요할 때 운영 체제에 의존합니다.이는 제어되지 않은 서버 종료로 인해 해당 노드에서 호스팅되는 복제본의 데이터 손실이 발생할 수 있음을 의미합니다. 이론적으로 이것은 확인된 데이터 손실의 가능성을 열어주지만 정상적인 작동 중에 이러한 일이 발생할 가능성은 매우 적으며 단일 노드의 데이터 손실은 일반적으로 시스템의 다른 노드에서 다시 복제됩니다.
자원 사용
스트림은 일반적으로 쿼럼 대기열보다 CPU 및 메모리 사용량이 적습니다.
모든 데이터는 디스크에 저장되며 기록되지 않은 데이터만 메모리에 저장됩니다.
오프셋 추적
오프셋 추적은 분산시스템에서 메시지 대기열의 메시지 처리 진행 상황을 추적하는데 사용되는 메커니즘입니다. 메시지 대기열에서 메시지는 일반적으로 여러 소비자에게 전달되며 오프셋 추적은 각 소비자가 어떤 메시지를 처리했는지 추적하는데 사용됩니다.
브로커 제공 오프셋 추적 기능을 사용할 때 오프셋은 메시지가 아닌 데이터로 스트림 자체에 유지됩니다. 즉, 오프셋 지속성이 요청되면 오프셋 지속성 요청당 약간의 양만큼 스트림이 디스크에서 증가합니다.
제한사항
메시지 인코딩
스트림은 내부적으로 메시지를 AMQP 1.0 인코딩 데이터로 저장합니다. 이는 AMQP 0.9.1을 사용하여 게시할 떄 변환이 발생함을 의미합니다. AMQP 0.9.1 메시지에 배열 또는 테이블과 같은 복잡한 값이 있는 헤더 항목이 포함된 경우 이러한 헤더는 변환되지 않습니다. 헤더는 AMQP 1.0 메시지 내에 애플리케이션 속성으로 저장되고 여기에는 문자열 및 숫자와 같은 단순 유형의 값만 포함될 수 있습니다.
UI 메트릭 정확도
관리 UI는 스트림의 실제 수를 약간 초과하는 메시지 수를 표시할 수 있습니다. 스트림 저장소가 구현되는 방식으로 인해 오프셋 추적 정보도 메시지로 계산되어 메시지 수를 인위적으로 더 크게 만듭니다. 이는 대부분의 시스템에서 실질적인 차이를 만들지 않습니다.
어떨 때 스트림을 사용해야 할까요?😁
RabbitMQ 스트림은 분산된 추가 전용 메시지 스트림을 제공하는 기능입니다. 스트림은 대기시간이 짧고 처리량이 높은 대용량 데이터를 처리하도록 최적화되어 있습니다. 다음은 RabbitMQ의 스트림 사용을 고려할 수 있는 몇 가지 시나리오 입니다.
- 로그 집계
여러 소스에서 로그를 수집하고 분석해야 하는 경우 스트림을 사용하여 쉽게 검색하고 분석할 수 있는 중앙 위치에 로그 데이터를 저장할 수 있습니다. - 이벤트 소싱
시스템에서 발생한 이벤트 기록을 유지해야 하는 경우 스트림을 사용하여 발생하는 이벤트를 저장하여 신뢰할 수 있는 감사 추적을 제공할 수 있습니다. - 실시간 분석
스트리밍 데이터의 실시간 분석을 수행해야 하는 경우 스트림을 사용하여 여러 소스에서 실시간으로 데이터를 수집하고 처리할 수 있습니다. - IoT 데이터 수집
많은 수의 센서 또는 장치에서 데이터를 수집하는 경우 스트림을 사용하여 데이터를 저장하고 처리하여 확장 가능하고 내결함성이 있는 솔루션을 제공할 수 있습니다. - 분산 추적
분산 추적 시스템을 사용하여 애플리케이션의 성능을 모니터링 하는 경우 스트림을 사용하여 추적 데이터를 저장하고 분석하기 위한 안정적이고 확장 가능한 솔루션을 제공할 수 있습니다.
해당 글은 RabbitMQ 공식 문서를 참고하여 작성되었습니다.
https://www.rabbitmq.com/streams.html
Streams — RabbitMQ
Streams Streams are a new persistent and replicated data structure which models an append-only log with non-destructive consumer semantics. They can be used via a RabbitMQ client library as if it was a queue or through a dedicated binary protocol plugin an
www.rabbitmq.com
'개인 지식 > RabbitMQ' 카테고리의 다른 글
What is AMQP 0-9-1 Model ? (0) | 2023.04.07 |
---|