pub/sub ๋‚ด๋ถ€ ๊ตฌ์กฐ

redis pub/sub

Redis pub/sub๋Š” ๋‹ค๋ฅธ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค์™€ ๋‹ฌ๋ฆฌ, ๋ฉ”์‹œ์ง€ ์ง€์†์„ฑ์ด ์—†๋‹ค.

์ฆ‰, ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•˜๊ณ  ๋ฐ”๋กœ ์‚ญ์ œ๋˜๋Š”๋ฐ, Redis ๋‚ด๋ถ€์— ์ €์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค.

์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ ์ ํ•ฉํ•˜์ง€๋งŒ ๋ฉ”์‹œ์ง€๊ฐ€ ์ €์žฅ๋˜์ง€ ์•Š๋Š”๊ฒƒ์— ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

  • ์ง€์†์„ฑ์ด ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๋ฉ”์‹œ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ์— ์ ํ•ฉํ•˜๋‹ค.

  • 100% ์ „์†ก ๋ณด์žฅ์ด ๋˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ๊ณณ์— ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹๋‹ค.

์ด๋ฒคํŠธ๋ฅผ ๋ฐœํ–‰ํ•˜๋Š” publisher๋Š” ํŠน์ • Channel(Topic)์— ์ด๋ฒคํŠธ๋ฅผ ์ „์†กํ•œ๋‹ค.

์ด๋ฅผ ๊ตฌ๋…ํ•˜๋Š” subscriber๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ, ํ•ด๋‹น ํ† ํ”ฝ์— ๊ตฌ๋…ํ•œ ๊ตฌ๋…์ž๋Š” ํผ๋ธ”๋ฆฌ์…”์— ์ƒ๊ด€์—†์ด ๋ชจ๋“  ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค.

pub/sub ๋‚ด๋ถ€ ๊ตฌ์กฐ

Redis pu/sub์€ Server channel/pattern ๊ตฌ์กฐ์ฒด์™€ Client channel/pattern ๊ตฌ์กฐ์ฒด๊ฐ€ ์žˆ๋‹ค.

  • channel : dict(hash table)

  • pattern : LinkedList

์ฑ„๋„๊ณผ ํŒจํ„ด์€ ์œ„์™€ ๊ฐ™์€ ์ž๋ฃŒ๊ตฌ์กฐ์— ์ €์žฅ๋œ๋‹ค๊ณ  ํ•œ๋‹ค.

Server channel/pattern

dict ๊ตฌ์กฐ์ฒด๋ฅผ ๊ฐ€๋ฅดํ‚ค๋Š” pubsub_channels ํ•„๋“œ

  • dict ๊ตฌ์กฐ์ฒด๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ dictEntry๋ฅผ ๊ฐ€์ง„๋‹ค.

  • ๊ฐ ์—”ํŠธ๋ฆฌ๋Š” { Key(robj channel) : Value(list) } ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ณ , list๋Š” LinkedList์ด๋‹ค.

  • list๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ listNode๋ฅผ ๊ฐ€์ง€๋ฉด์„œ ๊ฐ ๋…ธ๋“œ๋Š” client๋ฅผ ๊ฐ€๋ฅดํ‚จ๋‹ค.

publish๊ฐ€ ๋™์ž‘ํ•˜๊ณ  message๋ฅผ ์ „์†กํ•˜๋ฉด, dict์—์„œ ์ „๋‹ฌ๋ฐ›์€ channel(dictEntry์˜ key)์„ ์ฐพ๋Š”๋‹ค.

๊ทธ๋ฆฌ๊ณ  dictEntry์˜ value์ธ LinkedList๋ฅผ ๋Œ๋ฉด์„œ ๊ตฌ๋…ํ•œ client์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ธ๋‹ค.

list๋ฅผ ๊ฐ€๋ฅดํ‚ค๋Š” pubsub_pattern ํ•„๋“œ

  • list์— ์†ํ•ด์žˆ๋Š” Node๋“ค์€ ๊ฐ๊ฐ์˜ pubsubPattern ๊ตฌ์กฐ์ฒด๋ฅผ ๊ฐ€๋ฅดํ‚จ๋‹ค.

  • pubsubPattern ๊ตฌ์กฐ์ฒด๋Š” ํด๋ผ์ด์–ธํŠธ ํŒจํ„ด์„ ๊ฐ€์ง€๊ณ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ publish์˜ ๋™์ž‘์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. publish channel_name message

  2. pubsub_chaennels์—์„œ ๊ฐ channel์„ ๊ตฌ๋…ํ•œ client์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•˜๊ณ 

  3. pubsub_patterns ํŒจํ„ด์•ˆ์—์„œ ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜๋Š” client์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ธ๋‹ค.

Client channel/pattern

pubsub_channels ํ•„๋“œ

  • ํด๋ผ์ด์–ธํŠธ๋Š” ๊ตฌ๋…ํ•œ ์ฑ„๋„์„ ์ €์žฅํ•˜๋Š” dict ๊ตฌ์กฐ์ฒด๋ฅผ ๊ฐ€๋ฅดํ‚จ๋‹ค.

  • ์„œ๋ฒ„์™€ ๋‹ค๋ฅด๊ฒŒ dictEntry์—๋Š” ๋ฉ”์‹œ์ง€์ธ Value๋Š” ์—†๊ณ  ์ฑ„๋„์ธ Key๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ํด๋ผ์ด์–ธํŠธ๋Š” ์ฑ„๋„์˜ ์กด์žฌ๋งŒ ์ถ”์ ํ•˜๊ณ  ์‹ค์ œ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

Subscribe ๋ช…๋ น์ด ์ˆ˜ํ–‰๋˜๋ฉด ํด๋ผ์ด์–ธํŠธ ๊ตฌ์กฐ์ฒด์™€ ์„œ๋ฒ„ ๊ตฌ์กฐ์ฒด ๋™์‹œ์— ํ•ด๋‹น ์ฑ„๋„์ด ์ €์žฅ๋˜๊ณ  ํด๋ผ์ด์–ธํŠธ๋Š” ํ•ด๋‹น ์ฑ„๋„์˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

Publish ๋ช…๋ น์ด ์ˆ˜ํ–‰๋˜๋ฉด, ์„œ๋ฒ„๋Š” ํ•ด๋‹น ์ฑ„๋„์„ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ฐพ์•„์„œ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•œ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์„œ๋ฒ„ ๊ตฌ์กฐ์ฒด๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค.

pubsub_patterns ํ•„๋“œ

  • ํด๋ผ์ด์–ธํŠธ๊ฐœ pattern์„ ์ €์žฅํ•˜๋Š” ๊ตฌ์กฐ์ฒด๋‹ค.

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ตฌ๋…ํ•œ ํŒจํ„ด์„ ์ €์žฅํ•˜๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

  • ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ ๋…ธ๋“œ๋Š” ์ง์ ‘ robj pattern ๊ตฌ์กฐ์ฒด์— ์—ฐ๊ฒฐํ•œ๋‹ค. ๊ตฌ์กฐ์ฒด๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ํŒจํ„ด์„ ํฌํ•จํ•˜๋Š”๋ฐ, ํด๋ผ์ด์–ธํŠธ๋Š” Redis์— ์—ฐ๊ฒฐ๋œ ์‚ฌ์šฉ์ž ๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‹ค.

Last updated