About Redis Pub Sub - YJGwon/connectruck GitHub Wiki

๊ธฐ๋ณธ์ ์ธ ๋™์ž‘ ํ๋ฆ„

channel์„ ํ†ตํ•ด ๋ฉ”์„ธ์ง€ ์†ก/์ˆ˜์‹ , redis ๊ณ ์œ  TCP ํ”„๋กœํ† ์ฝœ์ธ RESP๋กœ ํ†ต์‹ 

๊ฐ client๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ channel์„ subscribe

publishํ•  ๋•Œ๋Š” channel ์ง€์ •ํ•˜์—ฌ publish

  • ๊ตฌ๋…, ๋ฐœํ–‰ ์‹œ channel ์กด์žฌ ์—ฌ๋ถ€ ๋˜๋Š” channel์˜ ๊ตฌ๋…์ž ์ •๋ณด ์•Œ ํ•„์š” ์—†์Œ

๊ตฌ๋…

> SUBSCRIBE first second
subscribe
first
1
subscribe
second
2

์‘๋‹ต : subscribe + ์ฑ„๋„ ์ด๋ฆ„ + ํ˜„์žฌ ๊ตฌ๋…์ค‘์ธ ์ฑ„๋„ ์ˆ˜

๋ฐœํ–‰

> PUBLISH second Hello

์ˆ˜์‹ 

message
second
Hello

client์˜ ๊ฒฝ์šฐ ํ•˜๋‚˜ ์ด์ƒ์˜ channel์„ ๊ตฌ๋…ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ๊ตฌ๋…์— ๊ด€๋ จ๋œ ๋ช…๋ น(SUBSCRIBE, UNSUBSCRIBE ๋“ฑ)๋งŒ ํ•  ์ˆ˜ ์žˆ์Œ (โ€subscribed stateโ€)

  • ๊ตฌ๋… ์ค‘์ธ ๋ชจ๋“  ์ฑ„๋„์— ๋Œ€ํ•ด ๊ตฌ๋…์„ ํ•ด์ง€ํ•˜๋ฉด subscribe state ํ•ด์ œ

๋‚ด๋ถ€ ๊ตฌ์กฐ

Untitled

์„œ๋ฒ„์—์„œ๋Š” dictionary ํ˜•ํƒœ๋กœ ๊ตฌ๋… ์ •๋ณด ์ €์žฅ

  • key - channel ์ด๋ฆ„, value - client ์ •๋ณด list

client์—์„œ๋Š” ์ž์‹ ์ด ๊ตฌ๋…ํ•œ channel ์ด๋ฆ„ ์ €์žฅ

  • unsubscribe ๋ช…๋ น ๋ฐ subscribed state ๊ด€๋ฆฌํ•˜๋Š” ์šฉ๋„

publishํ•  ๋•Œ โ†’ ํ•ด๋‹น key์— ๋“ฑ๋ก๋œ client list ์ˆœํšŒํ•˜๋ฉฐ ๋ฉ”์„ธ์ง€ ์ „์†ก (O(N), N = ๊ตฌ๋…์ค‘์ธ client ์ˆ˜)

vs Kafka

kafka redis pub/sub
์ด๋ฒคํŠธ ์ €์žฅ O (at least once ๋ณด์žฅ) X (๊ตฌ๋…ํ•˜๋Š” client๊ฐ€ ํ™œ์„ฑ ์ƒํƒœ ์•„๋‹ˆ๋ฉด ๊ทธ๋Œ€๋กœ ์ฆ๋ฐœ)
์ˆ˜์‹  ํšŸ์ˆ˜ consumer group๋‚ด์—์„œ 1๋ฒˆ๋งŒ ํ•ด๋‹น channel์˜ ๋ชจ๋“  subscriber๊ฐ€ ์ˆ˜์‹ 
๋ฉ”์„ธ์ง€ ์ „๋‹ฌ ๋ฐฉ์‹ pull ๋ฐฉ์‹ (consumer์ชฝ์—์„œ ์ผ์ • ์ฃผ๊ธฐ๋กœ polling ์š”์ฒญ) push ๋ฐฉ์‹(publishํ•˜๋Š” ์ฆ‰์‹œ ๋ชจ๋“  subscriber์—๊ฒŒ ์ „๋‹ฌ)

์ฃผ์˜ํ•  ์ 

pattern subscribe

redis pub/sub์€ PSUBSCRIBE๋ผ๋Š” ๋ช…๋ น์–ด๋ฅผ ์ง€์› - channel ์ด๋ฆ„ ํŠน์ •ํ•˜์ง€ ์•Š๊ณ  ํŒจํ„ด์— ํ•ด๋‹นํ•˜๋Š” channel์— ๋ฐœํ–‰๋˜๋Š” ๋ฉ”์„ธ์ง€ ๊ตฌ๋…

์ด ๋•Œ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋ณด๋ฉด pattern - client ์Œ์„ linked list๋กœ ์ €์žฅํ•ด๋‘๊ณ  publishํ•  ๋•Œ ๋ชจ๋“  node๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ํŒจํ„ด์— ๋งค์นญ๋˜๋ฉด ๋ฉ”์„ธ์ง€ ๋ฐœ์†ก

  • pattern์ด ๊ฐ™์•„๋„ ์„œ๋กœ ๋‹ค๋ฅธ node๋กœ ์ €์žฅ๋จ!
  • ๊ฒฐ๊ณผ์ ์œผ๋กœ๋Š” ํ˜„์žฌ ํŒจํ„ด ๊ตฌ๋… ์ค‘์ธ ๋ชจ๋“  client ๊ฐœ์ˆ˜๋งŒํผ ํŒจํ„ด ๋งค์นญ์„ ํ•˜๋Š” ๊ฒƒ

๋”ฐ๋ผ์„œ pattern ๊ตฌ๋…์„ ์‚ฌ์šฉํ•˜๋ฉด publish์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(N + M) - N = channel ์ด๋ฆ„์— ๋Œ€ํ•ด ๊ตฌ๋…ํ•˜๋Š” client ์ˆ˜, M = ํ˜„์žฌ ๊ตฌ๋…์ค‘์ธ ๋ชจ๋“  pattern subscriber ์ˆ˜

ํด๋Ÿฌ์Šคํ„ฐ๋ง ํ™˜๊ฒฝ์—์„œ์˜ ์‚ฌ์šฉ

Redis๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ๋ง ๋˜์–ด์žˆ๋Š” ๊ฒฝ์šฐ, ๊ทธ๋ƒฅ publishํ•˜๊ฒŒ ๋˜๋ฉด ๋ชจ๋“  node์— ์ด ๋ฉ”์„ธ์ง€๊ฐ€ ์ „๋‹ฌ๋˜๊ณ  ๊ฐ ๋…ธ๋“œ์—์„œ ์ž์‹ ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” client ์ •๋ณด ํƒ์ƒ‰ํ•˜์—ฌ ๋ฉ”์„ธ์ง€ ๋ฐœ์†ก

  • โ†’ ๋ถˆํ•„์š”ํ•œ ํ†ต์‹ ์ด ๋งŽ์Œ

์ด๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด version 7๋ถ€ํ„ฐ sharded pub/sub ์ œ๊ณต

  • ๊ธฐ์กด redis sharding์‹œ ์“ฐ์ด๋Š” hash ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ channel์„ ํ•ด์‹œํ•˜์—ฌ shardingํ•˜๊ณ , publishํ•  ๋•Œ ํ•ด๋‹น node์— ๋ฉ”์„ธ์ง€ ์ „๋‹ฌ
  • SPUBLISH, SSUBSCRIBE ๋“ฑ ๊ธฐ์กด ๋ช…๋ น์–ด์— S ๋ถ™์ด๋ฉด sharded channel์ด ๋จ

references