발행-구독 패턴 (Publish-Subscribe Pattern)
쉽게 풀면
잡지 구독을 생각해 보세요. 잡지사(발행자, publisher)는 "누가 이 잡지를 읽는지" 전혀 몰라도 그냥 잡지를 찍어냅니다. 독자(구독자, subscriber)는 특정 잡지를 구독 신청만 해두면, 새 호가 나올 때마다 자동으로 받아봅니다. 잡지사와 독자는 서로 직접 연락하지 않고, 오직 "구독 목록을 관리하는 배급사(브로커)"를 통해서만 연결됩니다. 소프트웨어에서도 마찬가지입니다. 어떤 프로그램(발행자)이 "주문 완료" 같은 이벤트를 특정 채널(토픽)에 발행하면, 그 채널을 구독하고 있는 다른 프로그램들(구독자)이 자동으로 그 소식을 받아 각자 필요한 작업을 처리합니다. 발행자는 구독자가 몇 명인지, 누구인지 몰라도 되므로 시스템의 각 부분을 서로 느슨하게 연결(decoupling)할 수 있습니다.
왜 중요한가
발행-구독 패턴은 대규모 분산시스템에서 구성요소 간 결합도를 낮추어 유연성과 확장성을 확보하는 핵심 설계 원리이기 때문에, 사물인터넷, 마이크로서비스 아키텍처, 실시간 데이터 처리 시스템 등 다양한 분야의 논문에서 시스템 구조를 설명할 때 기본 개념으로 다뤄집니다. 발행자와 구독자를 새로 추가하거나 제거해도 나머지 시스템에 영향을 최소화할 수 있다는 특성 때문에, 대규모 센서 네트워크나 이벤트 기반 애플리케이션 연구에서 특히 자주 인용됩니다.
논문에서는 이렇게 쓰입니다
이 문장은 "센서에서 나온 데이터를 처리하는 부분을 직접 연결하지 않고 중간 채널을 통해 주고받도록 설계해서, 센서나 처리 모듈을 나중에 추가하거나 바꾸기 쉽게 만들었다"는 뜻입니다.
사물인터넷(IoT) 분야에서는 배터리와 대역폭이 제한된 기기 간 통신을 효율화하기 위해 경량 발행-구독 프로토콜을 활용하는 연구가 흔합니다.
소프트웨어공학 연구에서는 여러 서비스로 나뉜 시스템에서 한 서비스의 장애가 전체로 번지는 것을 막기 위한 설계 기법으로 이 패턴을 다룹니다.
조금 더 깊게 보면
발행-구독 패턴을 구현하는 방식은 크게 특정 이름의 채널(토픽)을 기준으로 구독을 관리하는 토픽 기반 방식과, 메시지 내용 자체의 속성을 기준으로 구독을 걸러내는 내용 기반 방식으로 나뉩니다. 실제 시스템에서는 카프카(Kafka), MQTT, RabbitMQ 같은 메시지 브로커 소프트웨어가 이 패턴을 구현하는 데 널리 쓰이며, 논문에서는 어떤 브로커나 프로토콜을 사용했는지, 그리고 메시지 전달의 신뢰성(최소 한 번 전달, 최대 한 번 전달 등)을 어떻게 보장했는지가 성능 비교의 중요한 축이 됩니다.
주의할 점
발행-구독 패턴은 흔히 메시지 큐와 혼동되지만, 메시지 큐가 하나의 메시지를 여러 소비자 중 "한 명"에게만 전달해 작업을 분배하는 데 초점이 있다면, 발행-구독은 하나의 메시지를 구독 중인 "모두"에게 동시에 전달하는 데 초점이 있습니다. 또한 중계자(브로커)가 장애를 일으키면 발행자와 구독자 사이의 소통 전체가 끊길 수 있으므로, 결함허용 설계가 함께 고려되어야 합니다.