SSE + Redis pub/sub

기쑴에 SSE둜만 κ΅¬ν˜„ν•œ μ•Œλ¦Ό κΈ°λŠ₯은 단일 μ„œλ²„μ—μ„œ λ¬Έμ œκ°€ μ—†μ§€λ§Œ λΆ„μ‚° μ„œλ²„μ—μ„œ ν•œ κ°€μ§€ λ¬Έμ œκ°€ λ°œμƒν•œλ‹€.

μ‚¬μš©μžκ°€ "μ„œλ²„1"μ—μ„œ ꡬ독을 ν•˜λ©΄ SSE μ—°κ²° 정보λ₯Ό "μ„œλ²„1"의 μΈμŠ€ν„΄μŠ€ λ©”λͺ¨λ¦¬μ— μ €μž₯ν•œλ‹€.

λ”°λΌμ„œ μ„œλ²„2μ—μ„œ 이벀트λ₯Ό λ°œν–‰ν•΄λ„ μ„œλ²„2μ—λŠ” μ—°κ²° 정보가 μ—†κΈ° λ•Œλ¬Έμ— 제 κΈ°λŠ₯을 ν•˜μ§€ λͺ»ν•œλ‹€.

pub/subκ³Ό λ³€κ²½λœ μ•Œλ¦Ό κΈ°λŠ₯ λ™μž‘ 방식

redis pup/sub μ‹œμŠ€ν…œμ€ 채널에 ꡬ독 신청을 ν•œ λͺ¨λ“  subμ—κ²Œ λ©”μ‹œμ§€λ₯Ό μ „λ‹¬ν•œλ‹€.

pub/sub λ‚΄λΆ€ ꡬ쑰

μ—¬κΈ°μ„œλ„ κ°„λ‹¨ν•œκ²Œ μ„€λͺ…ν–ˆμ§€λ§Œ λ‹€μ‹œ μ„€λͺ…ν•˜μžλ©΄,

publisherλŠ” λ©”μ‹œμ§€λ₯Ό redis μ„œλ²„λ‘œ λ°œν–‰ν•˜κ³  ν•΄λ‹Ή topic에 κ΅¬λ…μž(sbscriber)κ°€ μ‘΄μž¬ν•˜λ©΄ λ°œν–‰μžκ°€ λ©”μ‹œμ§€λ₯Ό λ°œν–‰ν•  경우 κ΅¬λ…μžμ—κ²Œ λ©”μ‹œμ§€κ°€ μ „μ†‘λœλ‹€.

즉, sender(publisher)듀은 receiver(subscriber)μ—κ²Œ 직접 μ „λ‹¬ν•˜λŠ” 것이 μ•„λ‹ˆλΌ ν•΄λ‹Ή 채널에 λ©”μ‹œμ§€λ₯Ό μ „λ‹¬ν•˜λ©΄ κ·Έ λ©”μ‹œμ§€λ₯Ό κ΅¬λ…ν•˜κ³  μžˆλŠ” κ΅¬λ…μžκ°€ 이λ₯Ό μˆ˜μ‹ ν•˜λŠ” 것이닀.

λ”°λΌμ„œ pub/sub으둜 κ΅¬ν˜„λœ μ•Œλ¦Ό flowλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

  1. ν΄λΌμ΄μ–ΈνŠΈκ°€ SSE μ—°κ²° μš”μ²­μ„ ν•˜λ©΄ μ„œλ²„λŠ” user_id둜 emitter 객체와 channel을 μƒμ„±ν•˜κ³  κ΅¬λ…ν•œλ‹€.

  2. μ•Œλ¦Όμ΄ μžˆλŠ” κΈ°λŠ₯(리뷰에 λŒ“κΈ€ 달기 λ“±)이 μš”μ²­μœΌλ‘œ λ“€μ–΄μ˜€λ©΄ μš”μ²­ 정보(dto)λ₯Ό 기반으둜 channel을 μƒμ„±ν•˜κ³  전솑할 λ©”μ‹œμ§€μ™€ channel을 publish ν•œλ‹€.

  3. κ°œλ°œμžκ°€ κ΅¬ν˜„ν•œ publish()κ°€ λ™μž‘ν•˜λ©΄ κ΅¬ν˜„ν•œ onMessage()λ₯Ό ν˜ΈμΆœν•˜λ©΄μ„œ κ΅¬λ…ν•œ subscriberμ—κ²Œ λ©”μ‹œμ§€λ₯Ό μ „μ†‘ν•œλ‹€. 그러면 clientμ—κ²Œ μ•Œλ¦Όμ΄ μ˜¨λ‹€.

κ΅¬ν˜„ μ½”λ“œ

κΈ°μ‘΄ μ½”λ“œλŠ” μˆ˜μ •ν•˜μ§€ μ•Šκ³  v2λ₯Ό μƒμ„±ν–ˆλ‹€.

[λ³€κ²½ μ½”λ“œ]

μ΄λ²€νŠΈκ°€ λ°œν–‰λ˜λ©΄ κ΅¬ν˜„ν•œ publish() λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜κ²Œ λœλ‹€.

κ²°κ³Ό 확인

두 개의 μ„œλ²„ μΈμŠ€ν„΄μŠ€λ₯Ό 올리고 μ•Œλ¦Ό κΈ°λŠ₯이 적용된 리뷰에 λŒ“κΈ€μ„ μž‘μ„±ν•˜λŠ” κΈ°λŠ₯을 μˆ˜ν–‰ν–ˆλ‹€.

[SSE]

리뷰와 μ•Œλ¦Ό λ°μ΄ν„°λŠ” 잘 μƒμ„±λ˜μ–΄ DB에 반영 λ˜μ—ˆμ§€λ§Œ, Clientμ—κ²Œ μ•Œλ¦Όμ΄ λ„μ°©ν•˜μ§€ μ•ŠλŠ”λ‹€.

[SSE + redis pub/sub]

pub/sub을 μ μš©ν•œκ²ƒμ€ 리뷰와 μ•Œλ¦Ό 데이터가 μƒμ„±λ˜μ–΄ DB에 반영되고 Clientμ—κ²Œλ„ μ•Œλ¦Όμ΄ 잘 λ„μ°©ν–ˆλ‹€.

Summary

ν•˜λ‚˜μ˜ μ„œλ²„μ—μ„œλŠ” pub/sub 없이도 잘 λ™μž‘ν•˜μ§€λ§Œ μ„œλ²„μ˜ μΈμŠ€ν„΄μŠ€κ°€ λŠ˜μ–΄λ‚˜κ³  λ³„λ„μ˜ λ‘œλ“œλ°ΈλŸ°μ‹± μ—†μ΄λŠ” μ‚¬μš©μžμ—κ²Œ μ•Œλ¦Όμ΄ λ„μ°©ν•˜λŠ” 것을 보μž₯ν•  수 μ—†μ—ˆλ‹€. ν•˜μ§€λ§Œ redisκ°€ μ œκ³΅ν•˜λŠ” pub/sub κΈ°λŠ₯을 ν™œμš©ν•΄μ„œ μ—¬λŸ¬ μ„œλ²„λ₯Ό μš΄μ˜ν•˜λŠ” μ„œλΉ„μŠ€μ—μ„œ μ•Œλ¦Όμ΄ λ„μ°©ν•˜λŠ” 것을 확인할 수 μžˆμ—ˆλ‹€. pub/sub을 μ œκ³΅ν•˜λŠ” λ‹€λ₯Έ 미듀웨어듀도 μ‘΄μž¬ν•˜μ§€λ§Œ 이미 λ¦¬ν”„λ ˆμ‹œ 토큰을 μ €μž₯ν•˜λŠ” redis μ„œλ²„μ™€ 캐싱을 λ‹΄λ‹Ήν•˜λŠ” redis μ„œλ²„κ°€ 각각 1κ°œμ”© μ‘΄μž¬ν–ˆκΈ° λ•Œλ¬Έμ— redis둜 ν™œμš©ν•΄λ΄€λ‹€.

Last updated