발행-구독 모델
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
발행-구독 모델은 발행자가 메시지를 게시하고 구독자가 특정 메시지 하위 집합을 수신하는 비동기식 메시징 패턴이다. 이 모델은 메시지 필터링을 통해 구독자가 수신하는 메시지를 선택하며, 토픽 기반, 내용 기반, 하이브리드 방식이 있다. 발행자는 메시지 브로커에 메시지를 게시하고 구독자는 브로커에 구독을 등록하는 브로커 기반 모델과 브로커 없이 발행자와 구독자가 직접 통신하는 브로커리스 모델이 있다. 이 모델은 느슨한 결합과 확장성을 제공하지만, 발행자와 구독자의 분리로 인해 보안 및 메시지 전달 문제가 발생할 수 있다.
더 읽어볼만한 페이지
- 아키텍처 패턴 - 서비스 지향 아키텍처
서비스 지향 아키텍처(SOA)는 기능들을 독립적인 서비스 단위로 분리하여 느슨하게 결합함으로써, 네트워크를 통해 접근 가능한 서비스를 재사용하고 결합하여 응용 프로그램을 구축하는 소프트웨어 아키텍처이다. - 아키텍처 패턴 - 제어 반전
제어 반전은 프로그램의 제어 흐름을 프레임워크나 컨테이너가 관리하도록 하는 프로그래밍 원칙으로, 코드 결합도를 낮추고 유연성을 높이지만, 복잡성을 증가시킬 수 있다는 비판도 존재한다. - 메시지 지향 미들웨어 - 마이크로소프트 비즈토크 서버
마이크로소프트 비즈토크 서버는 다양한 시스템 통합 및 비즈니스 프로세스 자동화를 지원하는 서버 소프트웨어로, 여러 버전이 출시되었으며 어댑터, 가속기 등의 기능을 제공하고 대한민국 여러 산업 분야에서 활용되었으나 클라우드 기반 솔루션의 등장으로 입지가 변화하고 있다. - 메시지 지향 미들웨어 - ZeroMQ
ZeroMQ는 다양한 메시징 패턴을 지원하고 높은 성능을 제공하는 메시지 라이브러리이다.
| 발행-구독 모델 | |
|---|---|
| 개요 | |
| 유형 | 디자인 패턴 |
| 분류 | 행동 디자인 패턴 |
| 목적 | 객체 간의 결합도를 줄여 유연성과 확장성을 높임 |
| 참여자 | 발행자 (Publisher): 메시지를 생성하고 발행하는 객체 구독자 (Subscriber): 발행된 메시지를 수신하고 처리하는 객체 메시지 브로커 (Message Broker): 발행자와 구독자 사이에서 메시지를 중개하는 역할 |
| 장점 | 낮은 결합도: 발행자와 구독자는 서로를 직접 알 필요가 없음 확장성: 새로운 구독자를 쉽게 추가 가능 유연성: 발행자와 구독자는 독립적으로 변경 가능 |
| 단점 | 복잡성 증가: 메시지 브로커 도입으로 시스템 복잡도 증가 메시지 전달 보장 어려움: 발행자가 메시지 전달을 보장할 수 없음 디버깅 어려움: 메시지 흐름 추적이 어려울 수 있음 |
| 구현 | |
| 기본 구현 | 사용자 인터페이스 이벤트 처리 메시지 큐 시스템 분산 시스템 통신 |
| 예시 코드 | 위키백과 영문 문서 예시 코드 참고 |
| 활용 | |
| 사용 사례 | 뉴스 구독 서비스 주식 시세 알림 소셜 미디어 피드 IoT 기기 데이터 수집 |
| 관련 패턴 | 옵서버 패턴 (Observer Pattern): 발행-구독 패턴의 특수한 형태 메시지 큐 (Message Queue): 비동기 메시지 전달 시스템 이벤트 드리븐 아키텍처 (Event-Driven Architecture): 이벤트 기반 시스템 아키텍처 |
| 참고 자료 | |
| 서적 | Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions - Gregor Hohpe, Bobby Woolf |
| 관련 용어 | 메시지 큐 (Message Queue) 이벤트 (Event) 브로커 (Broker) 토픽 (Topic) 필터 (Filter) |
2. 메시지 필터링
발행-구독 모델에서 구독자는 일반적으로 게시된 전체 메시지의 하위 집합만 수신한다. 수신 및 처리를 위해 메시지를 선택하는 프로세스를 "필터링"이라고 한다. 필터링에는 토픽 기반과 내용 기반의 두 가지 일반적인 형태가 있다.
'''토픽 기반''' 시스템에서 메시지는 "토픽" 또는 명명된 논리 채널로 게시된다. 토픽 기반 시스템의 구독자는 자신이 구독하는 토픽에 게시된 모든 메시지를 받는다. 발행자는 구독자가 구독할 수 있는 토픽을 정의할 책임이 있다.
'''내용 기반''' 시스템에서 메시지는 해당 메시지의 속성 또는 내용이 구독자가 정의한 제약 조건과 일치하는 경우에만 구독자에게 전달된다. 구독자는 메시지를 분류할 책임이 있다.
일부 시스템은 이 두 가지의 '''하이브리드'''를 지원한다. 발행자는 토픽에 메시지를 게시하고 구독자는 하나 이상의 토픽에 내용 기반 구독을 등록한다.
2. 1. 토픽 기반 필터링
토픽 기반 시스템에서 메시지는 "토픽"으로 발행되거나 논리 채널들로 명명된다. 구독자는 특정 토픽을 구독하여 해당 토픽에 발행된 모든 메시지를 수신하며, 같은 토픽을 구독하는 구독자들은 모두 같은 메시지를 받는다. 발행자는 구독자가 구독할 메시지의 클래스를 정의한다.2. 2. 콘텐츠 기반 필터링
콘텐츠 기반 시스템에서 메시지는 메시지의 속성이나 내용이 구독측이 정의한 제약 조건에 일치하는 것만 수신된다. 따라서 구독측이 메시지 분류를 해야 한다. 시스템에 따라서는 토픽 기반 시스템과 조합하기도 한다. 발행측은 토픽에 메시지를 보내고, 구독측은 각 토픽에 추가적인 제약 조건을 정의하여 수신 메시지를 필터링한다.2. 3. 하이브리드 필터링
토픽 기반 필터링과 콘텐츠 기반 필터링을 결합한 방식이다. 발행자는 토픽에 메시지를 게시하고, 구독자는 토픽과 함께 내용 기반 조건을 설정하여 메시지를 수신한다.3. 네트워크 구성 (토폴로지)
많은 발행-구독 시스템에서 발행자는 메시지 브로커 또는 이벤트 버스에 메시지를 게시하고, 구독자는 해당 브로커에 구독을 등록하여 브로커가 필터링을 수행하도록 한다. 브로커는 일반적으로 발행자에서 구독자로 메시지를 라우팅하는 저장 후 전달 기능을 수행한다. 또한 브로커는 라우팅 전에 큐에서 메시지의 우선 순위를 지정할 수 있다.
구독자는 빌드 시간, 초기화 시간 또는 런타임에 특정 메시지를 등록할 수 있다. GUI 시스템에서 구독자는 빌드 시간 등록에 해당하는 사용자 명령(예: 버튼 클릭)을 처리하도록 코딩할 수 있다. 일부 프레임워크 및 소프트웨어 제품은 XML 구성 파일을 사용하여 구독자를 등록한다. 이러한 구성 파일은 초기화 시간에 읽힙니다. 가장 정교한 대안은 런타임에 구독자를 추가하거나 제거할 수 있다는 것이다. 이 마지막 방식은 데이터베이스 트리거, 메일링 리스트 및 RSS에서 사용된다.
데이터 배포 서비스(DDS) 미들웨어는 중간에 브로커를 사용하지 않는다. 대신, pub/sub 시스템의 각 발행자와 구독자는 IP 멀티캐스트를 통해 서로에 대한 메타데이터를 공유한다. 발행자와 구독자는 이 정보를 로컬에 캐시하고 공유된 인식을 통해 서로를 발견하여 메시지를 라우팅한다. 실제로 브로커가 없는 아키텍처는 발행자에서 구독자로 효율적인 분산 라우팅을 허용하는 오버레이 네트워크를 구축해야 한다. 존 클라인버그는 효율적인 분산 라우팅에는 탐색 가능한 스몰 월드 토폴로지가 필요하다는 것을 보여주었다. 이러한 스몰 월드 토폴로지는 일반적으로 분산 또는 연합 발행/구독 시스템에 의해 구현된다.[2] 위치 인식 발행/구독 시스템[3]은 짧은 거리와 저비용 링크를 통해 구독을 라우팅하여 구독 전달 시간을 줄이는 스몰 월드 토폴로지를 구축한다.
다른 발행-구독 시스템에서는 분산 라우팅과 필터링 기능에 의해 발행자와 구독자 사이의 메시지 브로커를 제거하였다. 때때로 데몬의 도움이 요구된다. 특별히 고성능옵션을 포함하는 발행/구독 토픽들은 IP 멀티캐스트 그룹들에 맵핑된다. 그래서 데이터는 발행자로부터 구독자들에게 직접적으로 전달될 수 있다. 콘텐츠 기반의 필터링은 메시지가 애플리케이션 레이어로 전달되기 전에 구독자 내에서 수행될 수 있다.
3. 1. 브로커 기반 모델
많은 발행/구독 시스템에서 발행자는 메시지 브로커 또는 이벤트 버스에 메시지를 게시하고, 구독자는 해당 브로커에 구독을 등록하여 브로커가 필터링을 수행하도록 한다. 브로커는 일반적으로 발행자에서 구독자로 메시지를 라우팅하는 저장 후 전달 기능을 수행하며, 라우팅 전에 큐에서 메시지의 우선 순위를 지정할 수 있다. 구독자는 빌드 시간, 초기화 시간 또는 런타임에 특정 메시지를 등록할 수 있다.3. 2. 브로커리스 모델 (분산 모델)
많은 발행/구독 시스템에서 발행자는 메시지 브로커 또는 이벤트 버스에 메시지를 게시하고, 구독자는 해당 브로커에 구독을 등록하여 브로커가 필터링을 수행하도록 한다. 브로커는 일반적으로 발행자에서 구독자로 메시지를 라우팅하는 저장 후 전달 기능을 수행한다.[2] 그러나 브로커리스 모델에서는 중간 브로커 없이 발행자와 구독자가 직접 통신한다.데이터 배포 서비스(DDS) 미들웨어는 이러한 브로커리스 모델을 사용한다. 각 발행자와 구독자는 IP 멀티캐스트를 통해 서로에 대한 메타데이터를 공유하고, 이 정보를 로컬에 캐시하여 서로를 발견하고 메시지를 라우팅한다.[2]
이러한 브로커가 없는 아키텍처는 효율적인 분산 라우팅을 위해 오버레이 네트워크를 구축해야 한다. 존 클라인버그는 효율적인 분산 라우팅에는 탐색 가능한 스몰 월드 토폴로지가 필요하다는 것을 보여주었다.[2] 위치 인식 발행/구독 시스템[3]은 짧은 거리와 저비용 링크를 통해 구독을 라우팅하여 구독 전달 시간을 줄이는 스몰 월드 토폴로지를 구축한다.
다른 출판-구독 모델은 메시지 브로커를 사용하지 않고, 라우팅 및 필터링 기능을 출판 측이나 구독 측에 분산시킨다. 이때, 예를 들어 데몬을 보조로 활용한다.
4. 역사
최초의 발행-구독 시스템 중 하나는 1987년 컴퓨팅 기계 협회(ACM) 운영 체제 원리 심포지엄(SOSP '87)에서 발표된 아이시스 툴킷(Isis Toolkit)의 "뉴스" 하위 시스템이었다. 이 시스템은 "분산 시스템에서 가상 동기성 활용"이라는 논문에서 설명되었다.[4] 프랭크 슈먹(Frank Schmuck)은 완전한 기능을 갖춘 발행-구독 솔루션을 개발한 선구자로 알려져 있다.[4]
5. 장점
'''느슨한 결합'''(Loose Coupling): 발행자는 구독자에게 느슨하게 결합되어 있으며, 구독자의 존재를 알 필요조차 없다. 주제가 초점이 되면서, 발행자와 구독자는 시스템 토폴로지를 알지 못하도록 허용된다. 각자는 다른 것과 독립적으로 정상적으로 계속 작동할 수 있다. 전통적인 밀접하게 결합된 클라이언트-서버 패러다임에서 클라이언트는 서버 프로세스가 실행되지 않는 동안 서버에 메시지를 게시할 수 없으며, 클라이언트가 실행되지 않는 한 서버도 메시지를 받을 수 없다. 많은 발행/구독 시스템은 발행자와 구독자의 위치뿐만 아니라 시간적으로도 분리한다. 이러한 발행/구독 시스템을 사용하는 미들웨어 분석가들이 사용하는 일반적인 전략은 구독자가 백로그를 처리하도록 하기 위해 발행자를 중단하는 것이다(일종의 대역폭 제한).
'''확장성'''(Scalability): 발행-구독 모델은 병렬 연산, 메시지 캐싱, 트리 기반 또는 네트워크 기반 라우팅 등을 통해 기존의 클라이언트-서버 방식보다 더 나은 확장성을 제공한다. 그러나 특정 유형의 긴밀하게 결합된 대규모 엔터프라이즈 환경에서는 시스템이 확장되어 발행-구독 인프라를 공유하는 수천 개의 서버를 갖춘 데이터 센터가 되면 현재의 벤더 시스템은 이러한 이점을 잃는 경우가 많다. 이러한 맥락에서 높은 부하 조건에서 발행-구독 제품의 확장성은 연구 과제이다.
반면에, 엔터프라이즈 환경 밖에서는 발행-구독 패러다임이 단일 데이터 센터의 범위를 훨씬 넘어선 볼륨에 대한 확장성을 입증했으며, RSS 및 Atom과 같은 웹 신디케이션 프로토콜을 통해 인터넷 전체에 분산 메시징을 제공한다. 이러한 신디케이션 프로토콜은 저사양 웹 서버에서도 (잠재적으로) 수백만 개의 개별 구독자 노드에 메시지를 신디케이션할 수 있는 기능을 제공하기 위해 더 높은 지연 시간과 전송 보장 부족을 수용한다.
5. 1. 느슨한 결합 (Loose Coupling)
발행자는 구독자에게 느슨하게 결합되어 있으며, 구독자의 존재를 알 필요조차 없다. 주제가 초점이 되면서, 발행자와 구독자는 시스템 토폴로지를 알지 못하도록 허용된다. 각자는 다른 것과 독립적으로 정상적으로 계속 작동할 수 있다. 전통적인 밀접하게 결합된 클라이언트-서버 패러다임에서 클라이언트는 서버 프로세스가 실행되지 않는 동안 서버에 메시지를 게시할 수 없으며, 클라이언트가 실행되지 않는 한 서버도 메시지를 받을 수 없다. 많은 발행/구독 시스템은 발행자와 구독자의 위치뿐만 아니라 시간적으로도 분리한다. 이러한 발행/구독 시스템을 사용하는 미들웨어 분석가들이 사용하는 일반적인 전략은 구독자가 백로그를 처리하도록 하기 위해 발행자를 중단하는 것이다(일종의 대역폭 제한).5. 2. 확장성 (Scalability)
발행-구독 모델은 병렬 연산, 메시지 캐싱, 트리 기반 또는 네트워크 기반 라우팅 등을 통해 기존의 클라이언트-서버 방식보다 더 나은 확장성을 제공한다. 그러나 특정 유형의 긴밀하게 결합된 대규모 엔터프라이즈 환경에서는 시스템이 확장되어 발행-구독 인프라를 공유하는 수천 개의 서버를 갖춘 데이터 센터가 되면 현재의 벤더 시스템은 이러한 이점을 잃는 경우가 많다. 이러한 맥락에서 높은 부하 조건에서 발행-구독 제품의 확장성은 연구 과제이다.반면에, 엔터프라이즈 환경 밖에서는 발행-구독 패러다임이 단일 데이터 센터의 범위를 훨씬 넘어선 볼륨에 대한 확장성을 입증했으며, RSS 및 Atom과 같은 웹 신디케이션 프로토콜을 통해 인터넷 전체에 분산 메시징을 제공한다. 이러한 신디케이션 프로토콜은 저사양 웹 서버에서도 (잠재적으로) 수백만 개의 개별 구독자 노드에 메시지를 신디케이션할 수 있는 기능을 제공하기 위해 더 높은 지연 시간과 전송 보장 부족을 수용한다.
6. 단점
발행-구독 시스템의 가장 심각한 문제점은 주요 장점의 부작용, 즉 발행자와 구독자의 분리에서 비롯된다.
브로커(서버)를 사용하는 발행-구독 모델 시스템에서는 구독 측이 브로커에게 메시지 전송을 요구하는 것이 대역 내에서 이루어지기 때문에 보안 문제가 발생할 수 있다. 브로커를 속여서 잘못된 클라이언트에 메시지를 보내거나, 클라이언트가 서비스를 받지 못하도록 하는 것이 가능하다. 구독의 정당성을 검증하도록 했을 경우, 브로커가 과부하에 걸릴 가능성도 있다.
브로커를 사용하지 않는 시스템에서도, 구독 측이 인증되지 않은 메시지를 수신할 가능성이 있다. 인증되지 않은 발행 측은 부정하고 손해를 입히는 메시지를 시스템 내에 보낼 수 있다. 이는 시스템이 브로드캐스트나 멀티캐스트를 사용하기 때문에 발생한다. 이러한 부정 접근에 대한 방어책으로는, 현재로서는 암호화(SSL/TLS 등)밖에 없다.
6. 1. 메시지 전달 문제
발행-구독 모델은 발행자와 구독자의 분리(decoupling)라는 주요 장점으로 인해 몇 가지 문제점을 갖는다.대부분의 발행-구독 시스템은 애플리케이션에서 필요로 하는 강한 속성 명세 구현을 어렵게 만든다. 예를 들어, 발행-구독 시스템은 특정 시간 동안 메시지 전달을 시도하지만, 모든 구독자가 메시지를 성공적으로 수신했는지 확인하지 않고 중단할 수 있다. 이러한 경우, 보장된 전달을 위해서는 발행자와 구독자 쌍을 발행-구독 아키텍처 외부에서 더 긴밀하게 연결해야 한다 (예: 구독자가 수신 메시지를 발행자에게 알리는 방식). 발행자는 구독자가 실제로 메시지를 수신하고 있는지 알 수 없는 상태에서 수신하고 있다고 가정할 수 있다.
중복 구독자를 추가하면 최소한의 추가적인 복잡성으로 메시지 전달의 안정성을 높일 수 있다. 예를 들어, 공장에서 장비 문제 발생 시 발행-구독 시스템을 통해 알림을 보내는 경우, 로거(logger)가 실패하면 오류 메시지가 기록되지 않을 수 있다. 클라이언트/서버 시스템에서는 중복 로깅 서버를 추가하거나 대체 서버를 동적으로 생성해야 하지만, 발행-구독 시스템에서는 기존 로거와 동일한 중복 로깅 구독자를 추가하여 간단하게 해결할 수 있다.
발행-구독 패턴은 소규모 네트워크에서는 잘 작동하지만, 노드 및 메시지 수가 증가하면 불안정성이 발생할 수 있다. 예를 들어, 구독자 요청이 네트워크 처리량을 포화시키는 로드 급증 현상이나, 시스템 사용량 증가에 따른 메시지 전달 속도 저하 현상이 발생할 수 있다.
브로커를 사용하는 시스템에서는 브로커가 구독자에게 메시지를 보내는 행위가 인밴드 방식이므로 보안 문제가 발생할 수 있다. 브로커가 잘못된 클라이언트에게 알림을 보내거나, 서비스 거부 요청을 증폭시킬 수 있으며, 생성된 구독 추적에 따른 과부하가 발생할 수 있다.
브로커를 사용하지 않는 시스템에서도 구독자가 권한 없는 데이터를 수신할 수 있다. 인증되지 않은 발행자가 시스템에 잘못되거나 손상된 메시지를 보낼 수 있으며, 이는 브로드캐스트나 멀티캐스트를 사용하는 시스템에서 특히 문제가 된다. 암호화 (SSL/TLS 등)를 통해 무단 접근을 방지할 수 있지만, 권한 있는 발행자의 손상된 메시지 전송은 막을 수 없다.
6. 2. 보안 문제
대부분의 발행-구독 시스템은 발행자와 구독자를 분리함으로써 얻는 장점에 대한 부작용으로 보안 문제를 갖는다.브로커 기반 시스템에서 브로커는 다양한 공격의 대상이 될 수 있다. 예를 들어, 브로커는 잘못된 클라이언트에게 알림을 보내도록 속거나, 서비스 거부(DoS) 공격을 받아 과부하될 수 있다. 브로커는 생성된 구독을 추적하기 위해 리소스를 할당하면서 과부하가 걸릴 수 있다.
브로커리스 시스템에서도 보안 문제는 존재한다. 인증되지 않은 발행자가 악의적인 메시지를 발행/구독 시스템에 유포할 수 있다. 특히 브로드캐스트나 멀티캐스트 환경에서 이러한 문제가 두드러진다.
이러한 문제에 대한 방어책으로 암호화 (SSL/TLS)를 사용하여 미인증 접근을 방지할 수 있지만, 권한 있는 발행자가 손상된 메시지를 보내는 것을 막을 수는 없다.
7. 발행/구독 모델을 구현한 미들웨어
턱시도는 확장성과 트랜잭션 발행/구독 기능을 지원하는 트랜잭션 처리 시스템이다.
참조
[1]
서적
Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions
Addison-Wesley Professional
[2]
서적
Proceedings of the 12th ACM International Conference on Distributed and Event-based Systems
http://urn.kb.se/res[...]
ACM Press
2018
[3]
간행물
Locality-Awareness in a Peer-to-Peer Publish/Subscribe Network
Springer Berlin Heidelberg
2012
[4]
서적
Proceedings of the Eleventh ACM Symposium on Operating Systems Principles - SOSP '87
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com