๐Ÿ—‚ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค/Redis

[Redis] ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ! (7) - Pub/Sub

๋ฏธ์ธ์ฃผ 2023. 1. 25. 18:49

Pub/Sub - ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค

Pub/Sub์€ Publish/Subscribe์˜ ์ค„์ž„๋ง์ž…๋‹ˆ๋‹ค.

 

๋‹จ์–ด ์ž์ฒด์— ๊ตฌ๋…/๊ฒŒ์‹œ๋ผ๋Š” ๋œป์ด ์žˆ๋“ฏ์ด Redis์—์„œ Pub/Sub ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ฑ„๋„์„ ํ†ตํ•ด ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›์Œ์œผ๋กœ์จ ์„œ๋กœ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ตฌ์กฐ

ํด๋ผ์ด์–ธํŠธ๋Š” ํ•˜๋‚˜์˜ Topic์„ "Sub"ํ•˜๊ณ ,

ํ•ด๋‹น ํ† ํ”ฝ์„ "Sub"ํ•œ ๋‹ค๋ฅธ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๋Š” ํ•ด๋‹น Topic์—์„œ "Pub"๋˜๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค.

 

MSDN blog

Topic์ด๋ผ๋Š” ๋งค๊ฐœ์ฒด๋ฅผ ํ†ตํ•ด์„œ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•˜๋ฏ€๋กœ

์ˆ˜์‹ ์ž์™€ ๋ฐœ์‹ ์ž๊ฐ€ ์„œ๋กœ๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๋”๋ผ๋„ ๋ฉ”์‹œ์ง€๋ฅผ ์†ก์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

ํŠน์ง•

๋ฉ”์‹œ์ง€๋Š” Redis์— ์ €์žฅ๋˜์ง€ ์•Š๊ณ  ์ฑ„๋„์„ ๊ตฌ๋…ํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ์— ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ „์†ก๋œ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌ๋˜๋ฉด ์ด๋ฅผ ๋ฐ”๋กœ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

 

์˜ˆ์‹œ

์ด๋ฅผ ํ†ตํ•ด Redis ์ง€์› ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‹ค์‹œ๊ฐ„ ๋ฉ”์‹œ์ง• ๋ฐ ์•Œ๋ฆผ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ฑ„ํŒ… ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ pub/sub๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•œ ์‚ฌ์šฉ์ž์—์„œ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์—๊ฒŒ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋Š” ๊ฐ ๋Œ€ํ™”์— ๋Œ€ํ•œ ์ฑ„๋„์ด ์žˆ๊ณ 
  2. ๋Œ€ํ™”์— ์ฐธ์—ฌํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ๋Š” ํ•ด๋‹น ์ฑ„๋„์„ ๊ตฌ๋…ํ•ฉ๋‹ˆ๋‹ค.
  3. ์‚ฌ์šฉ์ž๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ํ•ด๋‹น ์ฑ„๋„์— ๋ฉ”์‹œ์ง€๋ฅผ ๊ฒŒ์‹œํ•˜๊ณ 
  4. ํ•ด๋‹น ์ฑ„๋„์„ ๊ตฌ๋…ํ•˜๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๋Š” ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ‘Ž ๋”ฐ๋ผ์„œ ๋ฉ”์‹œ์ง€๋ฅผ ์ €์žฅํ•˜์—ฌ ๊ด€๋ฆฌํ•ด์•ผ ๋˜๋Š” ๊ฒฝ์šฐ, Redis์˜ Pub/Sub์€ ์ ํ•ฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ‘ ์˜ˆ๋ฅผ ๋“ค์–ด PUSH ๋ฉ”์‹œ์ง€์ฒ˜๋Ÿผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋กœ๊ทธ์ธ๋œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๊ฒฝ์šฐ, ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

๋ช…๋ น์–ด

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

 

subscribe ๋ช…๋ น์–ด

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

๊ฒฐ๊ณผ๊ฐ’ : ๊ตฌ๋…ํ•œ ์ฑ„๋„๋ช…, integer๊ฐ’ ๋ฐ˜ํ™˜

> subscribe <์ฑ„๋„๋ช…>

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

โœ”๏ธ redis์—์„œ channel์„ ์ƒ์„ฑํ•˜๋Š” ๋ช…๋ น์–ด๋Š” ์—†๊ณ , subscribe๋กœ ์ฑ„๋„์„ ์ƒ์„ฑํ•˜๊ณ  ๊ตฌ๋…ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

publish ๋ช…๋ น์–ด

์ด์ œ ch1์„ ๊ตฌ๋…ํ•˜๋Š” subscriber๊ฐ€ ์ƒ๊ฒผ์œผ๋ฏ€๋กœ,

publisher client์—์„œ publish ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐœํ–‰ํ•˜๋ฉด

subscriber client์—์„œ ํ•ด๋‹น ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

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

publisher
subscriber

 

pubsub ๋ช…๋ น์–ด

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

  • 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์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

  • '?' : ํ•œ ๊ธ€์ž ๋Œ€์น˜
  • '*' : ๊ณต๋ฐฑ์ด๋‚˜ ์—ฌ๋Ÿฌ ๊ธ€์ž ๋Œ€์น˜
# ํŒจํ„ด์„ ๋“ฑ๋กํ•˜์—ฌ ์ˆ˜์‹ ์‹œ์ž‘
> 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://inpa.tistory.com/entry/REDIS-%F0%9F%93%9A-PUBSUB-%EA%B8%B0%EB%8A%A5-%EC%86%8C%EA%B0%9C-%EC%B1%84%ED%8C%85-%EA%B5%AC%EB%8F%85-%EC%95%8C%EB%A6%BC

https://velog.io/@tilsong/Redis%EC%9D%98-%EC%A3%BC%EC%9A%94-%EA%B8%B0%EB%8A%A5-2-PubSub