Pub/Sub - ๋ฉ์์ง ๋ธ๋ก์ปค
Pub/Sub์ Publish/Subscribe์ ์ค์๋ง์ ๋๋ค.
๋จ์ด ์์ฒด์ ๊ตฌ๋ /๊ฒ์๋ผ๋ ๋ป์ด ์๋ฏ์ด Redis์์ Pub/Sub ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด
ํด๋ผ์ด์ธํธ๊ฐ ์ฑ๋์ ํตํด ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ์์ผ๋ก์จ ์๋ก ํต์ ํ ์ ์์ต๋๋ค.
๊ตฌ์กฐ
ํด๋ผ์ด์ธํธ๋ ํ๋์ Topic์ "Sub"ํ๊ณ ,
ํด๋น ํ ํฝ์ "Sub"ํ ๋ค๋ฅธ ๋ชจ๋ ํด๋ผ์ด์ธํธ๋ ํด๋น Topic์์ "Pub"๋๋ ๋ฉ์์ง๋ฅผ ์์ ํฉ๋๋ค.
Topic์ด๋ผ๋ ๋งค๊ฐ์ฒด๋ฅผ ํตํด์ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ๋ฏ๋ก
์์ ์์ ๋ฐ์ ์๊ฐ ์๋ก๋ฅผ ์์ง ๋ชปํ๋๋ผ๋ ๋ฉ์์ง๋ฅผ ์ก์์ ํ ์ ์์ต๋๋ค.
ํน์ง
๋ฉ์์ง๋ Redis์ ์ ์ฅ๋์ง ์๊ณ ์ฑ๋์ ๊ตฌ๋ ํ๋ ํด๋ผ์ด์ธํธ์ ์ค์๊ฐ์ผ๋ก ์ ์ก๋๋ค๋ ์ ์ ์ ์ํด์ผ ํฉ๋๋ค.
ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌ๋๋ฉด ์ด๋ฅผ ๋ฐ๋ก ์ญ์ ํฉ๋๋ค.
์์
์ด๋ฅผ ํตํด Redis ์ง์ ์ ํ๋ฆฌ์ผ์ด์
์์ ์ค์๊ฐ ๋ฉ์์ง ๋ฐ ์๋ฆผ์ ๊ตฌํํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ์ฑํ
์ ํ๋ฆฌ์ผ์ด์
์ pub/sub๋ฅผ ์ฌ์ฉํ์ฌ ํ ์ฌ์ฉ์์์ ๋ค๋ฅธ ์ฌ์ฉ์์๊ฒ ์ค์๊ฐ์ผ๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋ผ ์ ์์ต๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์๋ ๊ฐ ๋ํ์ ๋ํ ์ฑ๋์ด ์๊ณ
- ๋ํ์ ์ฐธ์ฌํ๋ ํด๋ผ์ด์ธํธ๋ ํด๋น ์ฑ๋์ ๊ตฌ๋ ํฉ๋๋ค.
- ์ฌ์ฉ์๊ฐ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ํด๋น ์ฑ๋์ ๋ฉ์์ง๋ฅผ ๊ฒ์ํ๊ณ
- ํด๋น ์ฑ๋์ ๊ตฌ๋ ํ๋ ๋ค๋ฅธ ๋ชจ๋ ํด๋ผ์ด์ธํธ๋ ์ค์๊ฐ์ผ๋ก ๋ฉ์์ง๋ฅผ ์์ ํฉ๋๋ค.
๐ ๋ฐ๋ผ์ ๋ฉ์์ง๋ฅผ ์ ์ฅํ์ฌ ๊ด๋ฆฌํด์ผ ๋๋ ๊ฒฝ์ฐ, 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๊ฐ์ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌ๋์์
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://velog.io/@tilsong/Redis%EC%9D%98-%EC%A3%BC%EC%9A%94-%EA%B8%B0%EB%8A%A5-2-PubSub