Pub-Sub Pattern: ์ด๋ฒคํธ ๊ธฐ๋ฐ ํต์ ์ ํต์ฌ
์๊ฐ
Pub-Sub Pattern(๋ฐํ-๊ตฌ๋ ํจํด)์ ์ํํธ์จ์ด ์ํคํ ์ฒ์์ ์ด๋ฒคํธ ๊ธฐ๋ฐ ํต์ ์ ๊ตฌํํ๋ ํจํด ์ค ํ๋์ ๋๋ค. ์ด ํจํด์ ํน์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋, ๋ฐํ์(Publisher)๊ฐ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๊ณ , ํด๋น ์ด๋ฒคํธ์ ๊ด์ฌ์ด ์๋ ์ฌ๋ฌ ๊ฐ์ ๊ตฌ๋ ์(Subscriber)๊ฐ ์ด๋ฅผ ์์ ํ๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
Pub-Sub Pattern์ ๊ตฌ์ฑ์์
Publisher(๋ฐํ์): ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค๋ ์ฃผ์ฒด๋ก, ์ด๋ฒคํธ์ ๊ด๋ จ๋ ๋ฉ์์ง๋ฅผ ์์ฑํ๊ณ Pub-Sub ์์คํ ์ ์ ์กํฉ๋๋ค.
Subscriber(๊ตฌ๋ ์): ํน์ ์ด๋ฒคํธ์ ๊ด์ฌ์ด ์๋ ์ฃผ์ฒด๋ก, ๋ฐํ์๊ฐ ๋ณด๋ธ ๋ฉ์์ง๋ฅผ ์์ ํ๊ณ ๊ทธ์ ๋ฐ๋ฅธ ๋์์ ์ํํฉ๋๋ค.
Topic(์ฃผ์ ๋๋ ์ฑ๋): ์ด๋ฒคํธ์ ์ ํ ๋๋ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ๋ํ๋ด๋ฉฐ, ๋ฐํ์๋ ํน์ ์ฃผ์ ๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋ด๊ณ , ํด๋น ์ฃผ์ ์ ๊ด์ฌ์ด ์๋ ๊ตฌ๋ ์๋ ํด๋น ์ด๋ฒคํธ๋ฅผ ์์ ํฉ๋๋ค.
Pub-Sub Pattern์ ์ญํ
์ด๋ฒคํธ ๊ธฐ๋ฐ ํต์ : ๋น๋๊ธฐ์ ์ผ๋ก ์ปดํฌ๋ํธ ๊ฐ์ ํต์ ์ ๊ฐ๋ฅํ๊ฒ ํ๋ฉฐ, ๋์จํ ๊ฒฐํฉ์ ์ ๊ณตํฉ๋๋ค.
ํ์ฅ์ฑ: ์๋ก์ด ์ด๋ฒคํธ๋ ์ฃผ์ ๋ฅผ ๊ฐ๋จํ๊ฒ ์ถ๊ฐํ์ฌ ์์คํ ์ ํ์ฅํ๊ธฐ ์ฉ์ดํฉ๋๋ค.
์ ์ฐ์ฑ: ๋ฐํ์์ ๊ตฌ๋ ์ ๊ฐ์ ๊ด๊ณ๊ฐ ๋ ๋ฆฝ์ ์ด๋ฏ๋ก, ๋ณํ์ ๋์ํ๊ธฐ ์ฝ์ต๋๋ค.
Pub-Sub Pattern์ ์ฅ๋จ์
์ฅ์
๋์จํ ๊ฒฐํฉ: ๋ฐํ์์ ๊ตฌ๋ ์ ๊ฐ์ ์ํธ ์์กด์ฑ์ด ์ค์ด๋ค์ด ์ ์ฐ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ด ํฅ์๋ฉ๋๋ค.
ํ์ฅ์ฑ: ์๋ก์ด ์ด๋ฒคํธ๋ ๊ตฌ๋ ์๋ฅผ ์ถ๊ฐํ๋ ๋ฐ ์ฉ์ดํ๋ฉฐ, ์์คํ ์ ํ์ฅ์ด ์ฝ์ต๋๋ค.
๋ถ๋ฆฌ๋ ์ญํ : ๊ฐ ์ปดํฌ๋ํธ๊ฐ ์์ ์ ์ญํ ์๋ง ์ง์คํ ์ ์๋๋ก ํด์ค๋๋ค.
๋จ์
๋ฉ์์ง ์ ๋ฌ ์ง์ฐ: ๋น๋๊ธฐ์ ํต์ ์ผ๋ก ์ธํด ๋ฉ์์ง์ ์ ๋ฌ์ด ์ง์ฐ๋ ์ ์์ต๋๋ค.
๋๋ฒ๊น ์ด๋ ค์: ์ด๋ฒคํธ์ ํ๋ฆ์ด ๋ถ์ฐ๋์ด ์์ด ๋๋ฒ๊น ์ด ์ด๋ ค์ธ ์ ์์ต๋๋ค.
Pub-Sub Pattern์ ์์ ์ฝ๋
๋ค์์ JavaScript์์์ ๊ฐ๋จํ Pub-Sub ํจํด ์์ ์ฝ๋์ ๋๋ค.
// Pub-Sub ๋ผ์ด๋ธ๋ฌ๋ฆฌ
class PubSub {
constructor() {
this.subscribers = {};
}
subscribe(topic, callback) {
if (!this.subscribers[topic]) {
this.subscribers[topic] = [];
}
this.subscribers[topic].push(callback);
}
publish(topic, data) {
if (this.subscribers[topic]) {
this.subscribers[topic].forEach(callback => callback(data));
}
}
}
// ๋ฐํ์
class Publisher {
constructor(pubSub) {
this.pubSub = pubSub;
}
fireEvent() {
console.log('Event fired!');
this.pubSub.publish('event', { message: 'Hello, subscribers!' });
}
}
// ๊ตฌ๋
์
class Subscriber {
constructor(pubSub) {
this.pubSub = pubSub;
this.pubSub.subscribe('event', this.handleEvent.bind(this));
}
handleEvent(data) {
console.log('Event handled:', data.message);
}
}
// ์ฌ์ฉ ์์
const pubSub = new PubSub();
const publisher = new Publisher(pubSub);
const subscriber = new Subscriber(pubSub);
publisher.fireEvent();
์ฐ๊ด๋ ๊ธฐ์
Pub-Sub ํจํด์ ์ด๋ฒคํธ ๊ธฐ๋ฐ ์์คํ
์์ ์ฃผ๋ก ์ฌ์ฉ๋๋ฉฐ, ์ด์ ๊ด๋ จ๋ ๊ธฐ์ ๋ก๋ MQTT, Apache Kafka, RabbitMQ ๋ฑ์ด ์์ต๋๋ค
Pub-Sub ํจํด์ ๋ค์ํ ๋ถ์ผ์์ ์ฌ์ฉ๋๋ฉฐ, ์น ์ ํ๋ฆฌ์ผ์ด์
์์์ ๋น๋๊ธฐ ํต์ , ๋ถ์ฐ ์์คํ
์์์ ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ฑ์ ์ ์ฉ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์
์ ์ ์ฐ์ฑ๊ณผ ํ์ฅ์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
'IT' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Pinpoint: ๋ถ์ฐ ์์คํ ๋ชจ๋ํฐ๋ง ๋๊ตฌ (0) | 2024.03.05 |
---|---|
Redis: ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์บ์ฑ์ ํ์ (0) | 2024.03.05 |
Builder Pattern: ๊ฐ์ฒด ์์ฑ์ ์ ์ฐํจ๊ณผ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๋ค (0) | 2024.03.02 |
JVM(Java Virtual Machine)์ ์ดํด์ ํ์ฉ (0) | 2024.03.01 |
BFF(Backend For Frontend) ๊ฐ๋ ๋ฐ ํ์ฉ (0) | 2024.03.01 |
๋๊ธ