DBMS/Redis

๐Ÿ—ƒ๏ธ REDIS์˜ PUB/SUB ๊ธฐ๋Šฅ (์ฑ„ํŒ… / ๊ตฌ๋… ์•Œ๋ฆผ)

์ธํŒŒ_ 2022. 7. 7. 10:38

redis-pub-sub

Redis Publish / Subscribe

Publish / Subscribe ๋ž€ ํŠน์ •ํ•œ ์ฃผ์ œ(topic)์— ๋Œ€ํ•˜์—ฌ ํ•ด๋‹น topic์„ ๊ตฌ๋…ํ•œ ๋ชจ๋‘์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐœํ–‰ํ•˜๋Š” ํ†ต์‹  ๋ฐฉ๋ฒ•์œผ๋กœ ์ฑ„๋„์„ ๊ตฌ๋…ํ•œ ์ˆ˜์‹ ์ž(ํด๋ผ์ด์–ธํŠธ) ๋ชจ๋‘์—๊ฒŒ ๋ฉ”์„ธ์ง€๋ฅผ ์ „์†ก ํ•˜๋Š”๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ํ•˜๋‚˜์˜ Client๊ฐ€ ๋ฉ”์„ธ์ง€๋ฅผ Publishํ•˜๋ฉด, ์ด Topic์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋‹ค์ˆ˜์˜ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฉ”์„ธ์ง€๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ์ด๋‹ค.

์‰ฝ๊ฒŒ ์ƒ๊ฐํ•˜๋ฉด, Youtube ์ฑ„๋„ ๊ตฌ๋…๊ณผ ๋น„์Šทํ•˜๋‹ค. ๊ตฌ๋…๊ณผ ์ข‹์•„์š”(Subscribe )๋ฅผ ๋ˆ„๋ฅด๋ฉด, ๋‚˜์ค‘์— ํฌ๋ฆฌ์—์ดํ„ฐ๊ฐ€ ์ƒˆ๋กœ์šด ๊ธ€์„ ๋ฐœํ–‰(Publish)ํ•˜๋ฉด ๊ตฌ๋…์ž ํ•œํ…Œ๋งŒ ์•Œ๋ฆผ(notification)์ด ์˜ค๊ฒŒ ๋˜๋Š” ์›๋ฆฌ๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

redis-pub-sub

Publish / Subscribe ๊ตฌ์กฐ์—์„œ ์‚ฌ์šฉ๋˜๋Š” Queue๋ฅผ ์ผ๋ฐ˜์ ์œผ๋กœ Topic์ด๋ผ๊ณ  ํ•œ๋‹ค.

๊ทธ๋ž˜์„œ ๋ ˆ๋””์Šค์˜ pub/sub ๊ธฐ๋Šฅ์€ ์€ ์ฃผ๋กœ ์ฑ„ํŒ… ๊ธฐ๋Šฅ์ด๋‚˜, ํ‘ธ์‹œ ์•Œ๋ฆผ๋“ฑ์— ์‚ฌ์šฉ๋œ๋‹ค. ์ด๋ฅผํ…Œ๋ฉด ๋‚ ์”จ์ •๋ณด๋ฅผ ๊ตฌ๋…ํ•œ ์‚ฌ๋žŒ์—๊ฒŒ ์ฃผ๊ธฐ์ ์œผ๋กœ ๋‚ ์”จ์ •๋ณด๋ฅผ ๋ณด๋‚ด๊ฑฐ๋‚˜, ํŠน์ •ํ•œ ์ž‘์—…์„ ๋ฐ˜๋ณต ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์ž์—๊ฒŒ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ž‘์—…์„ ๋ณด๋‚ด ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•˜๊ฑฐ๋‚˜, ๋˜๋Š” ํ˜„์žฌ ์•ฑ์— ๋กœ๊ทธ์ธํ•œ ์œ ์ €์—๊ฒŒ ํ‘ธ์‹œ๋ฅผ ๋ฐœ์†กํ•˜๋Š” ํ™œ๋™๋“ค์ด ๋ชจ๋‘ pub/sub์˜ ์›๋ฆฌ๋กœ ๋งŒ๋“ค์–ด ์ง„๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

๋‹ค๋งŒ ์œ ์˜ํ• ์ ์ด ์žˆ๋Š”๋ฐ, ์ด๋Ÿฌํ•œ redis์˜ pub/sub ์‹œ์Šคํ…œ์€ ๋งค์šฐ ๋‹จ์ˆœํ•œ ๊ตฌ์กฐ๋กœ ๋˜์–ด์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. Pub/Sub ์‹œ์Šคํ…œ์—์„œ๋Š” ์ฑ„๋„์— ๊ตฌ๋… ์‹ ์ฒญ์„ ํ•œ ๋ชจ๋“  subscriber์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.  ๊ทธ๋Ÿฐ๋ฐ ๋ฉ”์‹œ์ง€๋ฅผ "๋˜์ง€๋Š”" ์‹œ์Šคํ…œ์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋ฉ”์‹œ์ง€๋ฅผ ๋”ฐ๋กœ ๋ณด๊ด€ํ•˜์ง€๋„ ์•Š๋Š”๋‹ค. ์ฆ‰, ์ˆ˜์‹ ์ž(ํด๋ผ์ด์–ธํŠธ)๊ฐ€ ๋ฉ”์„ธ์ง€๋ฅผ ๋ฐ›๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์•„, subscribe ๋Œ€์ƒ์ด ํ•˜๋‚˜๋„ ์—†๋Š” ์ƒํ™ฉ์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ publishํ•ด๋„ ์—ญ์‹œ ์‚ฌ๋ผ์ง„๋‹ค. ๊ทธ๋ž˜์„œ ์ผ๋ฐ˜ ๋ฉ”์‹œ์ง€ํ์ฒ˜๋Ÿผ ์ˆ˜์‹  ํ™•์ธ์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค.(์ „์†ก ๋ณด์žฅ์„ ํ•˜์ง€ ์•Š์Œ)

๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๋ฉด ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ์ชฝ๋„ ๋ณด๋‚ด๊ณ  ๋, ๋ฐ›๋Š” ์ชฝ๋„ ๋ฐ›๊ณ  ๋์ด ๋˜๊ฒŒ ์‹ฌํ”Œํ•˜๊ฒŒ ๋˜์–ด ์žˆ๋‹ค.

๊ทผ๋ฐ ์ด๋ ‡๊ฒŒ ๋‹จ์ˆœํ•œ ๊ธฐ๋Šฅ๋งŒ ์ œ๊ณตํ•˜๋‹ˆ ์“ธ๋ชจ๊ฐ€ ์—†์ง€ ์•Š๋Š๋ƒ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์›น์†Œ์ผ“์„ ์ด์šฉํ• ๊ฒฝ์šฐ ์ถ”๊ฐ€์ ์ธ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์ด ํ•„์š”ํ•˜๊ธฐ์— ๋ ˆ์ดํ„ด์‹œ(๋”œ๋ ˆ์ด)๊ฐ€ ์•ฝ๊ฐ„ ์ƒ๊ธธ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋ฉด ๋ ˆ๋””์Šค๋Š” In-Memory ๊ธฐ๋ฐ˜์ด๋ผ ๋งค์šฐ ๋ฐ”๋ฅด๊ฒŒ ๋ฉ”์„ธ์ง€๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ˜„์žฌ ์ ‘์† ์ค‘์ธ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์งง๊ณ  ๊ฐ„๋‹จํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ๋น ๋ฅด๊ฒŒ ๋ณด๋‚ด๊ณ  ์‹ถ์„ ๋•Œ, ๊ทธ๋ฆฌ๊ณ  ์ „์†ก๋œ ๋ฉ”์‹œ์ง€๋ฅผ ๋”ฐ๋กœ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์ˆ˜์‹ ํ™•์ธ์ด ํ•„์š” ์—†์„ ๋•Œ, ๋งˆ์ง€๋ง‰์œผ๋กœ 100% ์ „์†ก ๋ณด์žฅ์€ ํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ๋•Œ ์ด์šฉํ•˜๋ฉด ๊ดœ์ฐฎ๋‹ค.


Pub / Sub ๋ช…๋ น์–ด

redis-pub-sub

  • Redis ์„œ๋ฒ„๋ฅผ ๋งค๊ฐœ๋กœ, Redis ํด๋ผ์ด์–ธํŠธ๊ฐ„ ํ†ต์‹ ์„ ๋„์™€์คŒ
  • Redis ํด๋ผ์ด์–ธํŠธ๋Š” Redis ์„œ๋ฒ„๋‚ด "์ฑ„๋„"์„ ์ƒ์„ฑํ•จ
  • ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  ์‹ถ์€ ํด๋ผ์ด์–ธํŠธ๋Š” ์‚ฌ์ „์— ํ•ด๋‹น ์ฑ„๋„์„ subscribe ํ•จ
  • ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ํด๋ผ์ด์–ธํŠธ๋Š” ํ•ด๋‹น ์ฑ„๋„์— ๋ฉ”์‹œ์ง€๋ฅผ publishํ•  ์ˆ˜ ์žˆ์Œ
  • ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ publishํ•˜๋ฉด, subscribe ์ค‘์ธ ํด๋ผ์ด์–ธํŠธ๋งŒ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ 
Commands Syntax Description
subscribe channel [channel ...] ์ฑ„๋„์„ ๊ตฌ๋…ํ•˜์—ฌ, ๋ฉ”์„ธ์ง€๋ฅผ ์ˆ˜์‹  ๋ฐ›๋Š”๋‹ค. (๋™์‹œ์— ์—ฌ๋Ÿฌ๊ฐœ ๊ตฌ๋… ๊ฐ€๋Šฅ)
publish channel message ๋ฉ”์‹œ์ง€๋ฅผ ์ง€์ •ํ•œ ์ฑ„๋„๋กœ ์†ก์‹ 
pubsub subcommand [argument [argument ...]] ์„œ๋ฒ„์— ๋“ฑ๋ก๋œ ์ฑ„๋„์ด๋‚˜ ํŒจํ„ด์„ ์กฐํšŒ
psubscribe pattern [pattern ...] ์ฑ„๋„ ์ด๋ฆ„์„ ํŒจํ„ด์œผ๋กœ ๋“ฑ๋ก
unsubscribe [channel [channel ...]] subscribe๋กœ ๋“ฑ๋กํ•œ ์ฑ„๋„ ๊ตฌ๋… ํ•ด์ œ
punsubscribe [pattern [pattern ...]] psubscribe๋กœ ๋“ฑ๋กํ•œ ํŒจํ„ด ์ฑ„๋„ ๊ตฌ๋… ํ•ด์ œ

redis-cli๋ฅผ ์‚ฌ์šฉํ•ด message๋ฅผ publishํ•˜๊ณ  subscribe ์‹ค์Šต์„ ์ง„ํ–‰ํ•ด๋ณด์ž. ์‹ค์Šต์„ ์œ„ํ•ด 2๊ฐœ์˜ redis client๊ฐ€ ํ•„์š”ํ•˜๋‹ค. (๊ทธ๋ƒฅ redis-cli.exe 2๊ฐœ ์‹คํ–‰ํ•˜๋ฉด ๋œ๋‹ค)

 

subscribe ๋ช…๋ น์–ด

ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ช…์‹œํ•œ ์ฑ„๋„์„ ๊ตฌ๋…ํ•œ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ฑ„๋„์„ ๋™์‹œ์— ๊ตฌ๋…ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๊ฒฐ๊ณผ๊ฐ’์œผ๋กœ ๊ตฌ๋…ํ•œ ์ฑ„๋„๋ช…๊ณผ integer๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

redis์—์„œ๋Š” channel์„ ์ƒ์„ฑํ•˜๋Š” ๋ช…๋ น์–ด๋Š” ์กด์žฌํ•˜์ง€ ์•Š๊ณ  subscribe๋กœ ์ฑ„๋„์„ ์ƒ์„ฑํ•˜๊ณ  ๊ตฌ๋…ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด๋ฉด ๋œ๋‹ค.
> subscribe <์ฑ„๋„๋ช…>

> subscribe <์ฑ„๋„๋ช…1> <์ฑ„๋„๋ช…2> ... # ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ฑ„๋„์„ ๋“ฑ๋กํ•˜๋ฉด, ๊ฐ๊ฐ์˜ ์ฑ„๋„๋กœ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ฐœํ–‰๋˜๋ฉด ๋ชจ๋‘ ์ˆ˜์‹ ํ•œ๋‹ค.

redis-pub-sub

 

publish ๋ช…๋ น์–ด

์ด์ œ ch1์„ ๊ตฌ๋…ํ•˜๊ณ  ์žˆ๋Š” subscriber๊ฐ€ ์ƒ๊ฒผ์œผ๋ฏ€๋กœ, publisher client์—์„œ publish ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐœํ–‰ํ•˜๋ฉด subscriber client์—์„œ๋Š” ํ•ด๋‹น ๋ฉ”์„ธ์ง€๋ฅผ ์ „๋‹ฌ๋ฐ›๊ฒŒ ๋œ๋‹ค.

> publish <์ฑ„๋„> <๋‚ด์šฉ>
(integer) 2 # ์ฑ„๋„์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐœํ–‰ํ–ˆ๊ณ , 2๊ฐœ์˜ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌ๋˜์—ˆ์Œ

redis-pub-sub

 

pubsub ๋ช…๋ น์–ด

adminstrator๊ฐ€ ํšจ์œจ์ ์œผ๋กœ subscriber๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ช…๋ น์–ด ์ด๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ธ ๊ฐ€์ง€ subcommand๊ฐ€ ์žˆ๋‹ค. 

  • channels : ํ™œ์„ฑํ™” ๋œ ์ฑ„๋„
  • numsub : ํŠน์ • ์ฑ„๋„์„ ๊ตฌ๋…ํ•˜๊ณ  ์žˆ๋Š” subscriber์˜ ๊ฐฏ์ˆ˜๋ฅผ ํ™•์ธ ( pattern subscription์œผ๋กœ ๊ตฌ๋…ํ•˜๊ณ  ์žˆ๋Š” subscriber๋Š” count์— ํฌํ•จ๋˜์ง€ ์•Š์Œ)
  • numpat : pattern subscription์˜ subscriber ๊ฐฏ์ˆ˜ ํ™•์ธ (ํŠน์ • ์ฑ„๋„์˜ subscriber๊ฐ€ ์•„๋‹Œ, ์ „์ฒด subscriber์˜ ๊ฐฏ์ˆ˜๋ฅผ return)
# ํ™œ์„ฑํ™”๋œ ์ฑ„๋„์ด ์—†์„ ๋•Œ
> pubsub channels
(empty array)

# ์•„๋ž˜์˜ SUBSCRIBE ๋ช…๋ น์–ด๋กœ ์ฑ„๋„์„ ํ•œ ๊ฐœ ํ™œ์„ฑํ™” ์‹œ์ผฐ์„ ๋•Œ
> pubsub channels
1) "c1"

# ์ฑ„๋„์„ ๊ตฌ๋…์ค‘์ธ ํด๋ผ์ด์–ธํŠธ ์ˆ˜ ํ™•์ธ
> pubsub numsub ch1
1) "ch1"
2) (integer) 1

# ํŒจํ„ดํ˜•์œผ๋กœ ๋“ฑ๋ก๋œ ํด๋ผ์ด์–ธํŠธ ์ˆ˜ ํ™•์ธ
> pubsub numpat
(integer) 0

 

psubscribe ๋ช…๋ น์–ด

์ˆ˜์‹ ํ•  ์ฑ„๋„ ์ด๋ฆ„์˜ ํŒจํ„ด์„ ๋“ฑ๋กํ•œ๋‹ค. ํŒจํ„ด์€ ์•„๋ž˜์™€ ๊ฐ™์€ glob-style์„ ์ง€์›ํ•œ๋‹ค.

  • '?'๋Š” ํ•œ ๊ธ€์ž๋ฅผ ๋Œ€์น˜ํ•œ๋‹ค.
    • h?llo๋Š” hello, hallo, hxllo ๊ฐ™์€ ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
  • '*'์€ ๊ณต๋ฐฑ์ด๋‚˜ ์—ฌ๋Ÿฌ ๊ธ€์ž๋ฅผ ๋Œ€์น˜ํ•œ๋‹ค.  
    • h*llo๋Š” hllo, heeeello ๊ฐ™์€ ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
  • h[ae]llo๋Š” 'a' ๋‚˜ 'e'๋งŒ ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.  
    • ๊ทธ๋ž˜์„œ hello, hallo๋Š” ๋˜๊ณ , hillo๋Š” ์•ˆ๋œ๋‹ค.
# ํŒจํ„ด์„ ๋“ฑ๋กํ•˜์—ฌ ์ˆ˜์‹ ์‹œ์ž‘
> psubscribe c*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "c*"
3) (integer) 1

# ํŒจํ„ด ์ฑ„๋„์„ ๋“ฑ๋ก๋œ ์ฑ„๋„์—๋Š” ํฌํ•จ๋˜์ง€ ์•Š์Œ
127.0.0.1:6379> pubsub channels
1) "c1"

# ํŒจํ„ด ์กฐํšŒ : 1๊ฐœ ํ™•์ธ
127.0.0.1:6379> pubsub numpat
(integer) 1

# ๋“ฑ๋กํ•˜์ง€ ์•Š์•˜๋˜ ์ฑ„๋„ ch2๋กœ ๋ฉ”์‹œ์ง€ ๋ณด๋ƒ„
> publish ch2 "test 2"
(integer) 1

# ํŒจํ„ด์œผ๋กœ ๊ตฌ๋… ์‹ ์ฒญํ•œ ์ฑ„๋„์— ๋ฉ”์‹œ์ง€๊ฐ€ ์ถ”๊ฐ€๋จ
> psubscribe c*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "c*"
3) (integer) 1
1) "pmessage"
2) "c*"
3) "c2"
4) "test 2"

 

unsubscribe / punsubscribe ๋ช…๋ น์–ด

๊ธฐ๋ณธ์ ์œผ๋กœ redis-cli์—์„œ๋Š” ctrl+c๋กœ ๊ตฌ๋…์„ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ณ„๋„ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ถ™์—ˆ๋‹ค๋ฉด unsubscribe ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์ˆ˜์‹ ์„ ์ค‘๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.  ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ punsubscribe ๋ช…๋ น์–ด๋กœ ์ผ์น˜ํ•˜๋Š” ํŒจํ„ด์˜ ์ฑ„๋„ ์ˆ˜์‹ ์„ ์ค‘๋‹จํ•œ๋‹ค. ์ฑ„๋„๋ช…์„ ์ž…๋ ฅํ•˜์ง€ ์•Š์œผ๋ฉด ํ•ด๋‹น ํด๋ผ์ด์–ธํŠธ์— ๋“ฑ๋ก๋œ ๋ชจ๋“  ์ฑ„๋„์„ ์‚ญ์ œํ•œ๋‹ค.

> unsubscribe ch1*
1) "unsubscribe"
2) "ch*"
3) (integer) 1

> punsubscribe ch1*
1) "punsubscribe"
2) "ch*"
3) (integer) 1

# ์ฐธ๊ณ ์ž๋ฃŒ

https://pompitzz.github.io/blog/Redis/LocalCacheSyncWithRedisPubSub.html

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

https://javaengine.tistory.com/entry/Redis-%E2%80%93-spring-data-redis-%EB%B0%9C%ED%96%89%EA%B5%AC%EB%8F%85pubsub-%EB%AA%A8%EB%8D%B8%EC%9D%98-%EA%B5%AC%ED%98%84