...
Node-Redis Publish / Subscribe 구현 (v4 )
Node.js에서 Redis 모듈을 이용하여 publish/subscribe 하는 방법에 대해 포스팅 해본다.
우선 redis의 pub/sub 기본 기능과 더불어 노드에 redis 모듈 설치와 사용법에 대해서 모르면 다음 글을 먼저 정독하고 오길 권한다.
Pub/Sub 클래스 구현
구독자(객체) 구조 이기 때문에 클래스로 pub/sub을 구현해보았다.
해당 Redis 구현 코드는 최신 버젼 v4를 기준으로 작성 되었다.
v3을 쓰거나 legacymode 옵션을 활성화한 사용자들은 동작되지 않는다.
const express = require('express');
const redis = require('redis');
class Redis {
constructor() {
this.redisClient = redis.createClient();
this.redisClient.on('connect', () => {
console.info('Redis PubSub connected!');
});
this.redisClient.on('error', (err) => {
console.error('Redis PubSub Client Error', err);
});
this.redisClient.connect().then(); // redis v4 연결 (비동기)
}
// 이밖의 명령어 ...
}
class PubSub extends Redis {
constructor() {
super();
}
async subscribe(channel) {
await this.redisClient.subscribe(channel, (message) => {
console.log('message : ', message);
});
console.log('채널 연결 완료');
}
async unsubscribe(channel) {
await this.redisClient.unsubscribe(channel);
}
async pSubscribe(channel) {
await this.redisClient.pSubscribe(channel, (message, channel) => {
console.log('channel : %s , message : %s', channel, message);
});
console.log('채널(패턴) 연결 완료');
}
async pUnsubscribe(channel) {
await this.redisClient.pUnsubscribe(channel);
}
async publish(channel, message) {
await this.redisClient.publish(channel, message);
}
}
const router = express.Router();
const subscriber = new PubSub(); // 구독자
const publisher = new PubSub(); // 발행자
router.get('/sub', async (req, res, next) => {
await subscriber.subscribe('me'); // 채널 생성 & 구독
res.end();
});
router.get('/unsub', async (req, res, next) => {
await subscriber.unsubscribe('me'); // 구독 해제
res.end();
});
router.get('/psub', async (req, res, next) => {
await subscriber.pSubscribe('m*'); // 패턴 채널 생성 & 구독
res.end();
});
router.get('/punsub', async (req, res, next) => {
await subscriber.pUnsubscribe('m*'); // 패턴 구독 해제
res.end();
});
router.get('/pub', async (req, res, next) => {
await publisher.publish('me', 'hello world'); // 채널에 메세지 송신
res.end();
});
module.exports = router;
Redis Cli 터미널에서 pub/sub을 하기위해서는 subscriber 전용 터미널과 publisher 전용 터미널 2개이상이 필요했었다.
터미널을 여러개 띄웠듯이 서버 코드에서도 subscriber 전용 클라이언트 채널과 publisher 전용 채널이 각각 필요하다.
그래서 OOP(객체지향) 구조로 짰고, 각 객체마다 클래스 생성자로 독립된 레디스 연결을 해주고 구독(sub) 해준다.
그리고 나서, publisher 객체 채널에서 publish api로 me 채널에 메세지를 보내면, subscriber의 me 채널에 콘솔 메세지가 찍힐 것이다.
[REST API 순서]
- localhost:80801/sub
- localhost:80801/psub
- localhost:80801/pub
me 채널과 m* 패턴 채널에 연결했으니, me 채널에 메세지를 publish 하면 각 두개의 구독 채널에서 메세지를 수신 받는 걸 볼 수 있다.
인용한 부분에 있어 만일 누락된 출처가 있다면 반드시 알려주시면 감사하겠습니다
이 글이 좋으셨다면 구독 & 좋아요
여러분의 구독과 좋아요는
저자에게 큰 힘이 됩니다.