๐๏ธ REDIS์ PUB/SUB ๊ธฐ๋ฅ (์ฑํ / ๊ตฌ๋ ์๋ฆผ)
Redis Publish / Subscribe
Publish / Subscribe ๋ ํน์ ํ ์ฃผ์ (topic)์ ๋ํ์ฌ ํด๋น topic์ ๊ตฌ๋ ํ ๋ชจ๋์๊ฒ ๋ฉ์์ง๋ฅผ ๋ฐํํ๋ ํต์ ๋ฐฉ๋ฒ์ผ๋ก ์ฑ๋์ ๊ตฌ๋ ํ ์์ ์(ํด๋ผ์ด์ธํธ) ๋ชจ๋์๊ฒ ๋ฉ์ธ์ง๋ฅผ ์ ์ก ํ๋๊ฒ์ ์๋ฏธํ๋ค. ํ๋์ Client๊ฐ ๋ฉ์ธ์ง๋ฅผ Publishํ๋ฉด, ์ด Topic์ ์ฐ๊ฒฐ๋์ด ์๋ ๋ค์์ ํด๋ผ์ด์ธํธ๊ฐ ๋ฉ์ธ์ง๋ฅผ ๋ฐ์ ์ ์๋ ๊ตฌ์กฐ์ด๋ค.
์ฝ๊ฒ ์๊ฐํ๋ฉด, Youtube ์ฑ๋ ๊ตฌ๋ ๊ณผ ๋น์ทํ๋ค. ๊ตฌ๋ ๊ณผ ์ข์์(Subscribe )๋ฅผ ๋๋ฅด๋ฉด, ๋์ค์ ํฌ๋ฆฌ์์ดํฐ๊ฐ ์๋ก์ด ๊ธ์ ๋ฐํ(Publish)ํ๋ฉด ๊ตฌ๋ ์ ํํ ๋ง ์๋ฆผ(notification)์ด ์ค๊ฒ ๋๋ ์๋ฆฌ๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
Publish / Subscribe ๊ตฌ์กฐ์์ ์ฌ์ฉ๋๋ Queue๋ฅผ ์ผ๋ฐ์ ์ผ๋ก Topic์ด๋ผ๊ณ ํ๋ค.
๊ทธ๋์ ๋ ๋์ค์ pub/sub ๊ธฐ๋ฅ์ ์ ์ฃผ๋ก ์ฑํ ๊ธฐ๋ฅ์ด๋, ํธ์ ์๋ฆผ๋ฑ์ ์ฌ์ฉ๋๋ค. ์ด๋ฅผํ ๋ฉด ๋ ์จ์ ๋ณด๋ฅผ ๊ตฌ๋ ํ ์ฌ๋์๊ฒ ์ฃผ๊ธฐ์ ์ผ๋ก ๋ ์จ์ ๋ณด๋ฅผ ๋ณด๋ด๊ฑฐ๋, ํน์ ํ ์์ ์ ๋ฐ๋ณต ์ํํ๋ ์์ ์์๊ฒ ๋น๋๊ธฐ์ ์ผ๋ก ์์ ์ ๋ณด๋ด ์ฒ๋ฆฌํ๋๋ก ํ๊ฑฐ๋, ๋๋ ํ์ฌ ์ฑ์ ๋ก๊ทธ์ธํ ์ ์ ์๊ฒ ํธ์๋ฅผ ๋ฐ์กํ๋ ํ๋๋ค์ด ๋ชจ๋ pub/sub์ ์๋ฆฌ๋ก ๋ง๋ค์ด ์ง๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
๋ค๋ง ์ ์ํ ์ ์ด ์๋๋ฐ, ์ด๋ฌํ redis์ pub/sub ์์คํ ์ ๋งค์ฐ ๋จ์ํ ๊ตฌ์กฐ๋ก ๋์ด์๋ค๋ ๊ฒ์ด๋ค. Pub/Sub ์์คํ ์์๋ ์ฑ๋์ ๊ตฌ๋ ์ ์ฒญ์ ํ ๋ชจ๋ subscriber์๊ฒ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ๋ค. ๊ทธ๋ฐ๋ฐ ๋ฉ์์ง๋ฅผ "๋์ง๋" ์์คํ ์ด๊ธฐ ๋๋ฌธ์, ๋ฉ์์ง๋ฅผ ๋ฐ๋ก ๋ณด๊ดํ์ง๋ ์๋๋ค. ์ฆ, ์์ ์(ํด๋ผ์ด์ธํธ)๊ฐ ๋ฉ์ธ์ง๋ฅผ ๋ฐ๋ ๊ฒ์ ๋ณด์ฅํ์ง ์์, subscribe ๋์์ด ํ๋๋ ์๋ ์ํฉ์์ ๋ฉ์์ง๋ฅผ publishํด๋ ์ญ์ ์ฌ๋ผ์ง๋ค. ๊ทธ๋์ ์ผ๋ฐ ๋ฉ์์งํ์ฒ๋ผ ์์ ํ์ธ์ ํ์ง ์๋๋ค.(์ ์ก ๋ณด์ฅ์ ํ์ง ์์)
๊ฐ๋จํ๊ฒ ์ ๋ฆฌํ๋ฉด ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ ์ชฝ๋ ๋ณด๋ด๊ณ ๋, ๋ฐ๋ ์ชฝ๋ ๋ฐ๊ณ ๋์ด ๋๊ฒ ์ฌํํ๊ฒ ๋์ด ์๋ค.
๊ทผ๋ฐ ์ด๋ ๊ฒ ๋จ์ํ ๊ธฐ๋ฅ๋ง ์ ๊ณตํ๋ ์ธ๋ชจ๊ฐ ์์ง ์๋๋๊ณ ์๊ฐํ ์ ์๋ค. ๊ทธ๋ฌ๋ ์น์์ผ์ ์ด์ฉํ ๊ฒฝ์ฐ ์ถ๊ฐ์ ์ธ ๋คํธ์ํฌ ํต์ ์ด ํ์ํ๊ธฐ์ ๋ ์ดํด์(๋๋ ์ด)๊ฐ ์ฝ๊ฐ ์๊ธธ์ ์๋ค. ๋ฐ๋ฉด ๋ ๋์ค๋ In-Memory ๊ธฐ๋ฐ์ด๋ผ ๋งค์ฐ ๋ฐ๋ฅด๊ฒ ๋ฉ์ธ์ง๋ฅผ ๋ฐ์ ์ ์๋ค. ๋ฐ๋ผ์ ํ์ฌ ์ ์ ์ค์ธ ํด๋ผ์ด์ธํธ์๊ฒ ์งง๊ณ ๊ฐ๋จํ ๋ฉ์์ง๋ฅผ ๋น ๋ฅด๊ฒ ๋ณด๋ด๊ณ ์ถ์ ๋, ๊ทธ๋ฆฌ๊ณ ์ ์ก๋ ๋ฉ์์ง๋ฅผ ๋ฐ๋ก ์ ์ฅํ๊ฑฐ๋ ์์ ํ์ธ์ด ํ์ ์์ ๋, ๋ง์ง๋ง์ผ๋ก 100% ์ ์ก ๋ณด์ฅ์ ํ์ง ์์๋ ๋๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ๋ ์ด์ฉํ๋ฉด ๊ด์ฐฎ๋ค.
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> ... # ์ฌ๋ฌ ๊ฐ์ ์ฑ๋์ ๋ฑ๋กํ๋ฉด, ๊ฐ๊ฐ์ ์ฑ๋๋ก ๋ฉ์์ง๊ฐ ๋ฐํ๋๋ฉด ๋ชจ๋ ์์ ํ๋ค.
publish ๋ช ๋ น์ด
์ด์ ch1์ ๊ตฌ๋ ํ๊ณ ์๋ subscriber๊ฐ ์๊ฒผ์ผ๋ฏ๋ก, publisher client์์ publish ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด ๋ฉ์์ง๋ฅผ ๋ฐํํ๋ฉด subscriber client์์๋ ํด๋น ๋ฉ์ธ์ง๋ฅผ ์ ๋ฌ๋ฐ๊ฒ ๋๋ค.
> publish <์ฑ๋> <๋ด์ฉ>
(integer) 2 # ์ฑ๋์ ๋ฉ์์ง๋ฅผ ๋ฐํํ๊ณ , 2๊ฐ์ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌ๋์์
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