[CS] Pub/Sub 구조란 무엇인가?

오늘은 Pub&Sub 구조가 무엇인지에 대해서 알아보려 한다.

Sub/pub 구조

  • 발행-구독 모델, pub/sub system라고도 불림
  • 대신 발행된 메시지는 정해진 범주에 따라, 각 범주에 대한 구독을 신청한 수신자에게 전달된다.
    • 수신자는 발행자에 대한 지식이 없어도 원하는 메시지만을 수신할 수 있다.
  • 이러한 발행자와 구독자의 디커플링은 더 다이나믹한 네트워크 토폴로지와 높은 확장성을 허용한다.

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

ex) golang 관련 컨퍼런스가 새로 열릴 때마다 해당 컨퍼런스에 대한 정보를 받고싶어하는 수신자가 있다고 가정하자. 이 수신자의 관심사는 “새로운 컨퍼런스에 대한 정보”이다. 오로지 그것만 필요한 것이다. 발행자가 누구인지, 어디에 있는지, 뭘 하는 존재인지 같은 건 관심이 없다. 그저 새로운 컨퍼런스가 열린다고 할 때 그에 대한 정보만 받으면 된다. 수신자는 “golang컨퍼런스 알람” 채널을 구독한다. 이 채널에 누가 어떻게 정보를 넣어주는지는 관심사가 아니다.

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

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

발행자와 구독자는 디커플링 관계이다.
특별한 수신자가 따로 정해져 있지 않으며, 발신자는 메세지 구독을 신청한 수신자(들)에게 전달할 뿐이다.
구독을 했으면 메세지를 보내고, 안 했으면 안 보낸다.

3) pub/sub 구조는 비동기(Async) 메시징 패러다임

sync & Async

  • 동기(sync): 어떤 일의 수행과 동시에 결과가 나오는 것(정확히는 동시에 나오도록 노력하는 것)
  • 비동기(Async): 어떤 일의 수행 즉시 결과가 나온다는 보장이 애초에 없는 것

“왜” 비동기 메세징을 하는지

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

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

  • pub-sub구조는 특성상 일방향으로 수신자가 이벤트에 대한 정보를 얻기만 하면 되는 경우처럼 Active-Passive한 구조로 전달만 하면 되는 경우에 유용
  • Redis에서도 pub-sub 모델을 지원함

참고