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이라 한다.
Sub/Pub 관계는 msg를 event 기반, 중개자를 통한 전달을 특징으로 하는 구조이다.
코드예시를 통해 Pub/Sub의 기본구조를 이해해보자.
코드를 살펴보기전에 pub/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를 별도로 설정하고,
하는 과정이 추가되면 기본적은 골격이 완성될 것이다.
redis는 이러한 sub/pub기능을 제공하고 있어 redis module을 많이 사용한다.
또한 redis는 cache memory로 활용할 수 있는데, 빠른 이벤트 및 메시지 전달이 가능해진다.
이 경우 메시지는 보관되지 않고, 전달하는 것에 집중한다.
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