[node.js] Subscriber / Publisher

Hyo Kyun Lee·2021년 7월 30일
0

node.js

목록 보기
31/34

1-1. Subscriber/Publisher Pattern

message queue 경로를 통해 서로 종속적인 관계에 있는 module을 분리하는 과정

Publisher는 data를 전달하는 주체, Subscriber는 data를 전달받는 대상이다.

서로 직접적으로 data를 주고받는 과정을, Publisher가 evenet를 발생하는 등의 특정 시점에서 Subscriber가 data를 받는 과정을 활용하는 방법이다.

위 도식에서 알 수 있듯이, Publusher가 event를 publish하는 시점에서 Event channel를 거쳐 Subscriber에게 data가 전달된다.

subscriber는 해당 channel을 subscribe해야 해당 data를 받을 수 있고, 이 Publisher와 subscriber의 관계를 Sub/Pub Pattern이라 한다.

1-2. 특징

Sub/Pub 관계는 msg를 event 기반, 중개자를 통한 전달을 특징으로 하는 구조이다.

  • pub/sub는 넓게 보면 module을 분리하여 특정 시점에 data를 보내는 것으로, microservice 환경구조와 흡사하다.
  • 서로 component들의 분리를 되어 각 module의 관리 및 유지보수가 쉬워진다.
  • Publisher는 data를 보낼때 기본적으로 subscriber가 존재한다는 가정하에 보내며, 이로 인한 불필요한 data 전달 및 자원사용이 이루어질 수 있다.
  • 버그가 많아진다.

1-3. 코드예시(기본구조)

코드예시를 통해 Pub/Sub의 기본구조를 이해해보자.

코드를 살펴보기전에 pub/sub를 이해하기위한 항목을 살펴본다.

  • pub, sub class가 존재한다.
  • event 시점을 발생하고(class 호출 시), 이 발생한 event에 따라 어떻게 동작하는지 logic을 정의하는 eventemitter module를 사용한다.
  • pub가 보낸 msg를 sub가 받아 출력한다.
"use strict";
const events = require("events");
const eventsEmitter = new events.EventEmitter();
let eventName = "greeting";
class Publisher {
  constructor() {}

  publishMessage() {
    let message = "hello";
    eventsEmitter.emit(eventName, message);
  }
}
class Subscriber {
  constructor() {
    eventsEmitter.on(eventName, (greeting) => {
      console.log("Someone sent me a greeting: " + greeting);
    });
  }
}
// Lets create our publisher and subscriber
const publisher = new Publisher();
const subscriber = new Subscriber();
publisher.publishMessage();
//Someone sent me a greeting: hello

이 코드의 구조에서 eventemitter 함수와 같은 원리로 event 발생시점의 pub, sub 함수나 class를 설정하여 동일한 logic을 구현할 수 있다.

실무에서는 중개자 역할을 하는 channel class를 별도로 설정하고,

  • publisher가 event를 pub했을때 channel이 sub에게 전달하고
  • sub가 channel을 구독하여 해당 event를 받는

하는 과정이 추가되면 기본적은 골격이 완성될 것이다.

2. caching

redis는 이러한 sub/pub기능을 제공하고 있어 redis module을 많이 사용한다.

또한 redis는 cache memory로 활용할 수 있는데, 빠른 이벤트 및 메시지 전달이 가능해진다.
이 경우 메시지는 보관되지 않고, 전달하는 것에 집중한다.

3. 참조링크

sub/pub 기본구조
https://medium.com/@pongpiraupra/decoupling-modules-using-publisher-subscriber-in-node-js-7dd22206ad13
https://edu.goorm.io/learn/lecture/557/%ED%95%9C-%EB%88%88%EC%97%90-%EB%81%9D%EB%82%B4%EB%8A%94-node-js/lesson/174391/publisher-subscriber

caching
https://www.happykoo.net/@happykoo/posts/81

0개의 댓글