1. Computer Science / / 2025. 1. 14. 16:52

[CS] PubSub구조 (발행-구독 모델)

728x90
발행-구독 모델은 비동기 메시징 페러다임이다. 발행-구독 모델에서 발신자의 메세지는 특별한 수신자가 정해져 있지 않다.
대신 발행된 메세지는 정해진 범주에 따라, 각 범주에 대한 구독을 신청한 수신자에게 전달된다
수신자는 발행자에 대한 지식이 없어도 원하는 메세지만을 수신할 수 있다
이러한 발행자와 구독자의 디커플링은 더 나이나믹한 네트워크 토폴로지와 높은 확장성을 허용한다

1. pub-sub구조에서 수신자는 발행자에 대한 지식 없이 원하는 메세지만을 수신할 수 있다

유튜브 개발체널을 구독하고 새로 올릴때마다 정보를 받고싶어하는 수신자가 있다고 가정하자. 이 수신자의 관심사는 '구독한 유튜브 개발체널'이다. 오로지 그것만 필요하다.

발행자가 누구인지, 어디에 있는지는 관심이 없다. 그저 유튜브 체널에 새로운 소식이 오면, 그에 대한 정보만 받으면 된다

수신자는 '유튜브 개발채널'을 구독한다. 이 채널에 누가 어떻게 정보를 넣어주는지는 관심사가 아니다

발행자와 수신자 사이에는 브로커 또는 버스라고 불리는 중간 컴포넌트가(앞서 말한 채널에 해당함)있다.

발행자는 중간 컴포넌트의 존재를 안다. 수신자도 중간 컴포넌트를 안다. 하지만 발신자와 수신자는 서로를 모른다. 중간 컴포넌트만 알면 되기 때문이다

 

2. 발신자의 메세지는 특별한 수신자가 정해져 있지 않다

특별한 수신자가 따로 정해져 있지 않다. 발신자는 메세지를 구독을 신청한 수신자들에게 전달할 뿐이다. 구독을 했으면 메세지를 보내고 안했으면 안보낸다

3. pub-sub구조는 비동기 메세징 패러다임이다

즉, 비동기 메세징과 관련된 이론적인 틀/방법이라는것,

동기/비동기 개념을 먼저 짚어보면, 동기는 어떤 일의 수행과 동시에 결과가 나오는 것 (정확히는 동시에 나오도록 노력하는것)이다

비동기는 어떤 일의 수행 즉시 결과가 나온다는 보장이 애초에 없는 것이다. Node.js의 콜백이 전형적인 비동기의 예시이다.

발행자는 이벤트가 발생했을 때마다 중간컴포넌트(브로커 또는 버스)에게 알려준다. 그러면 중간컴포넌트는 각 이벤트들을 잘 필터링해서 받아야 할 수신자들에게 고루 보내준다. 즉 이벤트가 발생했다고 해서 곧바로 수신자가 그 정보를 얻을 수 있는 것은 아니다. 이벤트가 발생했다고 해서 발행자가 곧바로 수신자에게 정보를 넘겨주는 것이 아니기 때문이다 (observer패턴에 대해서도 정리를 한번 하면 좋겠다)

여기서 곧바로 라는 단어에 주의하자. 예를들어 A라는 이벤트가 발생해서 발행자가 해당 이벤트에 대한 정보를 중간 컴포넌트에게 넘겨줬다고 하자. 중간컴포넌트는 A이벤트에 대한 정보를 구독한 수신자에게 정보를 보내주었다. A이벤트가 발생한 시점부터 수신자가 정보를 받는 시점까지 0.00000001초가 걸렸다고 가정하자. 이벤트가 발생하자마자 수신자가 정보를 얻은 것이나 다름없지 않나? 비동기가 아니라 동기 아닌가?

 

발행자가 이벤트를 중간컴포넌트에게 알려주고 나면, 발행자는 더이상 그 이벤트에 신경쓰지 않는다.
중간컴포넌트에게 이벤트를 알려주는 행위를 하고 난 다음, 그 행위의 결과를 기다리지 않고 바로 다른 자기 할일을 한다. 중간컴포넌트가 A이벤트에 대한 정보가 수신인에게 잘 전달되었는지 등을 발행자는 전혀 신경쓰지 않는다

따라서 A이벤트가 발생하고 나서 수신인이 해당 이벤트에 대한 정보를 얻기까지 0.0000001초가 걸리든, 10초가 걸리든 비동기 동작이다

 

동기/비동기 개녚을 짚어봤으니, 이제 "왜?"비동기 메세징을 하는지를 생각해보면
여느 라이브러리, 프로토콜 등이 그렇듯이 어떤 문제가 있는데, 그 문제를 해결하고 싶어서 나온게 pub-sub구조하고 생각한다

1. 브로드캐스팅 관점 - 내가 관찰하고 있는 어떤 대상에게 특정 이벤트가 일어나면, 그것을 관련된 다른 대상들에게 효율적으로 알려주고 싶다
2. 디커플링의 관점 - 그런데 이벤트를 통지받아야 하는 대상들을 내가 일일히 관리하지 않고 종속관계를 느슨하게 하고 싶다

1과2의 관점을 만족시키는 구조가 필요했고, 이에 대한 직관적인 해답으로서 pub-sub구조가 나온 것이다

pub-sub구조는 특성상 일방향으로 수신자가 이벤트에 대한 정보를 얻기만하면 되는 경우처럼 Active-Passive한 구조로 전달만 하면 되는 경우에 유용하다

 

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유