Pub/Sub κΈ°λŠ₯

κ°•μ½”λ”©Β·2025λ…„ 10μ›” 24일

λ ˆλ””μŠ€

λͺ©λ‘ 보기
12/21

πŸ“¨ 2.7.3 Pub/Sub κΈ°λŠ₯
πŸ“˜ κ°œμš”

Pub/Sub (Publish/Subscribe) λͺ¨λΈμ€
λ°œν–‰μž(Publisher)κ°€ λ©”μ‹œμ§€λ₯Ό 보내면,
κ΅¬λ…μž(Subscriber)κ°€ ν•΄λ‹Ή 채널을 톡해 λ©”μ‹œμ§€λ₯Ό λ°›λŠ” κ΅¬μ‘°μž…λ‹ˆλ‹€.

Redis의 Pub/Sub은 λ°μ΄ν„°ν˜•(Data Type) 이 μ•„λ‹Œ 톡신 κΈ°λŠ₯으둜 μ œκ³΅λ©λ‹ˆλ‹€.

λ©”μ‹œμ§€λŠ” μ €μž₯λ˜μ§€ μ•ŠμœΌλ©°, μ‹€μ‹œκ°„ μ „λ‹¬λ§Œ κ°€λŠ₯ν•©λ‹ˆλ‹€.

πŸ” κΈ°λ³Έ λ™μž‘ κ°œλ…
πŸ”Ή ꡬ쑰 κ°œλ…

λ°œν–‰μž (Publisher): λ©”μ‹œμ§€λ₯Ό λ³΄λ‚΄λŠ” 주체

κ΅¬λ…μž (Subscriber): 채널을 κ΅¬λ…ν•˜μ—¬ λ©”μ‹œμ§€λ₯Ό λ°›λŠ” 주체

채널 (Channel): λ©”μ‹œμ§€κ°€ μ˜€κ°€λŠ” 경둜

ν•˜λ‚˜μ˜ 채널에 μ—¬λŸ¬ λͺ…μ˜ κ΅¬λ…μžκ°€ λ™μ‹œμ— 연결될 수 있으며,
λ°œν–‰μžκ°€ λ©”μ‹œμ§€λ₯Ό 보내면 ꡬ독 쀑인 λͺ¨λ“  κ΅¬λ…μžμ—κ²Œ μ¦‰μ‹œ μ „λ‹¬λ©λ‹ˆλ‹€.

πŸ“Š μ˜ˆμ‹œ ꡬ쑰

[λ°œν–‰μž] β†’ (채널1, 채널2, 채널N) β†’ [κ΅¬λ…μž1, κ΅¬λ…μž2, κ΅¬λ…μž3 ...]

πŸ’¬ μ˜ˆμ‹œ 상황

μ±„νŒ…λ°© μ‹œμŠ€ν…œμ„ 예둜 λ“€λ©΄:

μ‚¬μš©μž A, B, Cκ°€ 각각 관심 μžˆλŠ” β€œμ±„λ„β€μ„ κ΅¬λ…ν•©λ‹ˆλ‹€.

λ°œν–‰μžκ°€ 채널2에 λ©”μ‹œμ§€λ₯Ό λ°œν–‰ν•˜λ©΄,
채널2λ₯Ό ꡬ독 쀑인 λͺ¨λ“  μ‚¬μš©μžκ°€ λ™μ‹œμ— λ©”μ‹œμ§€λ₯Ό λ°›μŠ΅λ‹ˆλ‹€.

πŸ§‘β€πŸ’» μ‹€ν–‰ μ˜ˆμ‹œ
1️⃣ κ΅¬λ…μž μ‹€ν–‰
127.0.0.1:6379> SUBSCRIBE mychannel1 mychannel2 mychannel3
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "mychannel1"
3) (integer) 1
1) "subscribe"
2) "mychannel2"
3) (integer) 2
1) "subscribe"
2) "mychannel3"
3) (integer) 3

2️⃣ λ°œν–‰μž μ‹€ν–‰
127.0.0.1:6379> PUBLISH mychannel2 "Hello, World!"
(integer) 1

3️⃣ κ΅¬λ…μž μͺ½ κ²°κ³Ό
1) "message"
2) "mychannel2"
3) "Hello, World!"

🧩 μ£Όμš” λͺ…λ Ήμ–΄ μš”μ•½
λͺ…λ Ήμ–΄ μ„€λͺ… μ‹œκ°„ λ³΅μž‘λ„
PUBLISH channel message 채널에 λ©”μ‹œμ§€ λ°œν–‰ O(N+M)
SUBSCRIBE channel [channel...] μ§€μ • 채널 ꡬ독 O(N)
UNSUBSCRIBE [channel...] μ§€μ • 채널 ꡬ독 ν•΄μ œ O(N)
PSUBSCRIBE pattern [pattern...] νŒ¨ν„΄ 기반 채널 ꡬ독 (*, ? 지원) O(N)
PUNSUBSCRIBE [pattern...] νŒ¨ν„΄ ꡬ독 ν•΄μ œ O(N+M)
βš™οΈ Sharded Pub/Sub κΈ°λŠ₯ (Redis 7.0 이상)

Redis 7.0λΆ€ν„°λŠ” Sharded Pub/Sub κΈ°λŠ₯이 μΆ”κ°€λ˜μ–΄,
데이터 λΆ„μ‚° κ΅¬μ‘°μ—μ„œλ„ Pub/Sub을 μ‚¬μš©ν•  수 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

λͺ…λ Ήμ–΄ μ„€λͺ… μ‹œκ°„ λ³΅μž‘λ„
SPUBLISH shardchannel message μƒ€λ“œ 채널에 λ©”μ‹œμ§€ λ°œν–‰ O(N)
SSUBSCRIBE shardchannel [shardchannel...] μƒ€λ“œ 채널 ꡬ독 O(N)
SUNSUBSCRIBE [shardchannel...] μƒ€λ“œ 채널 ꡬ독 ν•΄μ œ O(N)

➑️ Sharded Pub/Sub은 Redis Cluster ν™˜κ²½μ—μ„œ ν΄λŸ¬μŠ€ν„° λ…Έλ“œ κ°„ νŠΈλž˜ν”½ λΆ€ν•˜λ₯Ό 쀄이기 μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€.

πŸ” Pub/Sub μƒνƒœ 확인 κ΄€λ ¨ λͺ…λ Ήμ–΄
λͺ…λ Ήμ–΄ μ„€λͺ…
PUBSUB CHANNELS ν™œμ„±ν™”λœ 채널 λͺ©λ‘ 확인
PUBSUB NUMSUB 각 채널별 κ΅¬λ…μž 수 확인
PUBSUB NUMPAT νŒ¨ν„΄ κ΅¬λ…μž 수 확인
PUBSUB SHARDCHANNELS / SHARDNUMSUB Sharded Pub/Sub μƒνƒœ 확인
🧠 λ™μž‘ 원리 μš”μ•½

λ°œν–‰μž(Publisher) β†’ PUBLISH λͺ…λ ΉμœΌλ‘œ λ©”μ‹œμ§€ λ°œν–‰

κ΅¬λ…μž(Subscriber) β†’ SUBSCRIBE λ˜λŠ” PSUBSCRIBE둜 채널 μˆ˜μ‹ 

μ¦‰μ‹œ 전달 (λΉ„μ €μž₯) β†’ λ©”μ‹œμ§€λŠ” Redis에 μ €μž₯λ˜μ§€ μ•ŠμœΌλ©°, μ‹€μ‹œκ°„ μ „μ†‘λ§Œ μˆ˜ν–‰

ν™•μž₯μ„± β†’ μ—¬λŸ¬ ν΄λΌμ΄μ–ΈνŠΈκ°€ λ™μ‹œμ— 같은 채널을 ꡬ독할 수 있음

⚠️ μ£Όμ˜μ‚¬ν•­

Pub/Sub은 μ €μž₯ν˜•μ΄ μ•„λ‹˜ β†’ μˆ˜μ‹ μžκ°€ μ˜€ν”„λΌμΈμ΄λ©΄ λ©”μ‹œμ§€λ₯Ό λ†“μΉ©λ‹ˆλ‹€.

κ³Όκ±° λ©”μ‹œμ§€λ₯Ό λ‹€μ‹œ 받을 수 μ—†μŒ.

λ©”μ‹œμ§€ 내ꡬ성을 μ›ν•œλ‹€λ©΄ Redis Streamsλ₯Ό μ‚¬μš©ν•΄μ•Ό 함 (Redis 5.0 이상).

Redis 7.0 μ΄ν›„μ—λŠ” Sharded Pub/Sub으둜 ν΄λŸ¬μŠ€ν„° ν™˜κ²½μ—μ„œλ„ ν™•μž₯ κ°€λŠ₯.

🧱 μ‹€ν–‰ μ˜ˆμ‹œ (볡수 채널 ꡬ독)

예λ₯Ό λ“€μ–΄ 기술 μ£Όμ œλ³„ 채널을 ꡬ성할 수 μžˆμŠ΅λ‹ˆλ‹€.

주제 채널 이름
Redis redis-interest
Memcached memcached-interest
MongoDB mongodb-interest
127.0.0.1:6379> SUBSCRIBE redis-interest memcached-interest mongodb-interest
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "redis-interest"
3) (integer) 1
1) "subscribe"
2) "memcached-interest"
3) (integer) 2
1) "subscribe"
2) "mongodb-interest"
3) (integer) 3

🧾 μš”μ•½
ν•­λͺ© μ„€λͺ…
λͺ¨λΈ Publisher β†’ Channel β†’ Subscriber
데이터 μ €μž₯ ❌ μ—†μŒ (μ‹€μ‹œκ°„ λ©”μ‹œμ§•λ§Œ 지원)
ν™œμš© μ˜ˆμ‹œ μ±„νŒ…λ°©, μ‹€μ‹œκ°„ μ•Œλ¦Ό, μ„œλ²„ κ°„ 이벀트 전솑
μ£Όμš” λͺ…λ Ήμ–΄ PUBLISH, SUBSCRIBE, PSUBSCRIBE, UNSUBSCRIBE
ν™•μž₯ κΈ°λŠ₯ Redis 7.0 이상 β†’ Sharded Pub/Sub
보완 κΈ°λŠ₯ μ˜μ†μ  λ©”μ‹œμ§• ν•„μš” μ‹œ Redis Streams μ‚¬μš©

profile
μ£Όλ‹ˆμ–΄ ν’€μŠ€νƒκ°œλ°œμž

0개의 λŒ“κΈ€