μž‘λ…„ 7μ›”μ―€, 고객사에 λ‚˜κ°€ 있던 μ œν’ˆμ˜ λͺ¨λ‹ˆν„°λ§μ„ λ‹΄λ‹Ήν•˜λŠ” μ„œλ²„μ—μ„œ OOM(Out Of Memory) μ—λŸ¬κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

μ •ν™•ν•œ 원인을 단정 지을 μˆ˜λŠ” μ—†μ—ˆμ§€λ§Œ, β€œν˜Ήμ‹œ ν”„λ‘ νŠΈμ—”λ“œμ—μ„œ 쀄일 수 μžˆλŠ” λ¦¬μ†ŒμŠ€κ°€ μžˆμ§€ μ•Šμ„κΉŒ?” λΌλŠ” 생각이 λ“€μ—ˆμŠ΅λ‹ˆλ‹€.

λ°±μ—”λ“œμ—μ„œ λ°œμƒν•œ λ¬Έμ œμ˜€μ§€λ§Œ, ν΄λΌμ΄μ–ΈνŠΈμ—μ„œλ„ λΆ„λͺ… 영ν–₯을 쀄 수 μžˆλŠ” μ˜μ—­μ΄ μžˆμ„ 것이라 νŒλ‹¨ν–ˆμŠ΅λ‹ˆλ‹€.


문제

νŒ€ λ‚΄λΆ€μ—μ„œλŠ” 보톡 ν•˜λ‚˜μ˜ 개발 μ„œλ²„λ₯Ό 두고 μž‘μ—…μ„ ν•©λ‹ˆλ‹€.

  • λŒ€μ‹œλ³΄λ“œ νƒ­ μ—¬λŸ¬ 개
  • κΈ°λŠ₯ ν…ŒμŠ€νŠΈμš© νƒ­
  • 둜그 ν™•μΈμš© νƒ­
  • 운영 ν™”λ©΄ ν™•μΈμš© νƒ­

특히 νŠΉμ • ν”„λ‘œμ„ΈμŠ€λ₯Ό μˆ˜ν–‰ν•œ λ’€, λŒ€μ‹œλ³΄λ“œλ₯Ό 보며 ν˜„ν™© 체크λ₯Ό ν•˜λŠ” 일이 λΉˆλ²ˆν–ˆμŠ΅λ‹ˆλ‹€.
κ·Έ κ²°κ³Ό νŒ€μ› ν•œ λͺ…λ‹Ή μ—¬λŸ¬ 개의 λŒ€μ‹œλ³΄λ“œ 탭을 λ„μ›Œλ‘λŠ” 상황이 μžμ—°μŠ€λŸ½κ²Œ λ°˜λ³΅λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

λ¬Έμ œλŠ” μ—¬κΈ°μ„œ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

각 탭이 λͺ¨λ‘ 독립적인 WebSocket 연결을 μƒμ„±ν•˜κ³  μžˆμ—ˆλ˜ κ²ƒμž…λ‹ˆλ‹€.

νƒ­ 수 Γ— νŒ€μ› 수 = WebSocket 컀λ„₯μ…˜ 폭증

λͺ¨λ‹ˆν„°λ§ μ„œλ²„ νŠΉμ„±μƒ 연결은 였래 μœ μ§€λ˜κ³ , μ‹€μ‹œκ°„ λ°μ΄ν„°λŠ” μ§€μ†μ μœΌλ‘œ μŠ€νŠΈλ¦¬λ°λ©λ‹ˆλ‹€.
μ΄λŠ” κ²°κ΅­ μ„œλ²„ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰ μ¦κ°€λ‘œ μ΄μ–΄μ§ˆ μˆ˜λ°–μ— μ—†μ—ˆμŠ΅λ‹ˆλ‹€.


❌ 처음 λ– μ˜¬λ¦° ν•΄κ²°μ±…

κ°€μž₯ λ‹¨μˆœν•˜κ²ŒλŠ” μ΄λ ‡κ²Œ μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€.

탭이 λΉ„ν™œμ„±ν™”λ˜λ©΄ WebSocket을 끊고, ν™œμ„±ν™”λ˜λ©΄ λ‹€μ‹œ μ—°κ²°ν•˜λ©΄ λ˜μ§€ μ•Šμ„κΉŒ?

μ‹€μ œλ‘œ κ΅¬ν˜„ν•΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

ν•˜μ§€λ§Œ λ‹€μŒκ³Ό 같은 λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

  • νƒ­ λΉ„ν™œμ„±ν™” β†’ WebSocket disconnect
  • λ‹€μ‹œ ν™œμ„±ν™” β†’ reconnect
  • 데이터 μˆ˜μ‹  μ „κΉŒμ§€ UIλŠ” Error 차트 μƒνƒœ
  • 데이터 μˆ˜μ‹  ν›„ 정상 UI 볡ꡬ

즉, μ‚¬μš©μžκ°€ 탭을 μ „ν™˜ν•  λ•Œλ§ˆλ‹€ UIκ°€ κΉ¨μ‘Œλ‹€κ°€ λ³΅κ΅¬λ˜λŠ” κ²½ν—˜μ„ ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

μ΄λŠ” λͺ…λ°±νžˆ μ‚¬μš©μž κ²½ν—˜(UX)을 ν•΄μΉ˜λŠ” λ°©μ‹μ΄μ—ˆμŠ΅λ‹ˆλ‹€.
특히 μ‹€μ‹œκ°„ λͺ¨λ‹ˆν„°λ§ λŒ€μ‹œλ³΄λ“œμ—μ„œλŠ” λ”μš± 치λͺ…μ μ΄μ—ˆμŠ΅λ‹ˆλ‹€.


πŸ’‘ μ „ν™˜μ  – Toss Slash 2024

그러던 쀑 Toss Slash 2024μ—μ„œ
SharedWorkerλ₯Ό ν™œμš©ν•΄ 닀쀑 νƒ­μ˜ WebSocket 연결을 ν•˜λ‚˜λ‘œ μ€‘μ•™ν™”ν•œ 사둀λ₯Ό μ ‘ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

κ·Έλ•Œ 처음으둜 이런 생각이 λ“€μ—ˆμŠ΅λ‹ˆλ‹€.

μ„Έμƒμ—λŠ” λ‚΄κ°€ λͺ¨λ₯΄λŠ” 것이 λ„ˆλ¬΄ λ§Žκ΅¬λ‚˜ ..


λΈŒλΌμš°μ € Worker 쀑 ν•˜λ‚˜μΈ SharedWorkerλŠ” μ—¬λŸ¬ νƒ­μ—μ„œ ν•˜λ‚˜μ˜ Worker μΈμŠ€ν„΄μŠ€λ₯Ό κ³΅μœ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

즉 λ‹€μŒκ³Ό 같은 ꡬ쑰가 κ°€λŠ₯ν•©λ‹ˆλ‹€.

νƒ­ (100개)
↓
SharedWorker
↓
WebSocket μ—°κ²° (1개)

탭이 λͺ‡ κ°œμ΄λ“ , WebSocket 연결은 단 ν•˜λ‚˜λ§Œ μœ μ§€λ©λ‹ˆλ‹€.


πŸš€ 적용 결심

이 ꡬ쑰라면 λ‹€μŒκ³Ό 같은 μž₯점이 μžˆμŠ΅λ‹ˆλ‹€.

  • 탭이 λͺ‡ λ°±κ°œμ—¬λ„ WebSocket은 1개
  • μ„œλ²„ 컀λ„₯μ…˜ 수 κ°μ†Œ
  • UX μ €ν•˜ μ—†μŒ
  • μ‹€μ‹œκ°„ 데이터 μœ μ§€ κ°€λŠ₯

이거닀 λΌλŠ” 생각이 λ“€μ—ˆκ³ , SharedWorkerλ₯Ό 적극적으둜 μ μš©ν•΄λ³΄κΈ°λ‘œ κ²°μ •ν–ˆμŠ΅λ‹ˆλ‹€.


μž‘μ„±μ€‘μ΄μ—μš” ( 02/12 )