-
Notifications
You must be signed in to change notification settings - Fork 4
RedLock으로 동시성 제어
RedLock이란 분산 환경에서 redis를 사용하여 Lock을 제공하는 분산 락 알고리즘입니다.
주로 여러 서버를 운영하는 환경에서 분산 환경에서 공유 자원에 대한 동시성을 제어하기 위해 사용합니다.
물론 저희 프로젝트는 분산 환경이라고 보기 어렵지만 동시성 문제를 해결하기 위해 RedLock을 적용했습니다.
저희 프로젝트에서는 웹 소켓을 통해 변경 사항을 받아서 이를 redis에 임시로 저장한 뒤 스케줄러를 통해 주기적으로 postgres에 반영하고 있습니다.
그리고 변경 사항을 반영할 때 redis의 값을 꺼내서 postgres에 반영한 뒤 메모리 절약을 위해 redis의 값을 삭제하고 있습니다.
이 과정 동안 redis에 대한 변경 사항을 막기 위해 RedLock 알고리즘을 통해 lock을 적용했습니다.
앞에서 말씀드렸던 것처럼 변경 사항 갱신 흐름은 다음과 같습니다.
- redis에 저장된 변경 사항 조회
- 변경 사항 postgres에 반영
- 메모리 절약을 위해 redis 변경 사항 삭제
그런데 2번과 3번 연산을 수행 도중 변경 사항이 발생할 경우 아래 그림처럼 변경 사항이 postgres에 반영되지 않을 수 있습니다.
즉 1, 2, 3번 연산을 수행하는 동안 redis에 대한 접근을 막아야 합니다.
이를 위해 lock을 적용했습니다.
변경 사항을 갱신하는 3개의 연산을 수행하기 전에 lock을 획득하고 수행이 끝난 뒤 lock을 해제합니다.
그리고 lock을 획득해야만 redis에 값을 갱신하는 작업을 수행할 수 있도록 합니다.
저희 OctoDocs 팀은 이렇게 RedLock을 적용하여 동시성 문제를 해결했습니다.
⚓️ 사용자 피드백과 버그 기록
👷🏻 기술적 도전
📖 위키와 학습정리
✏️ 에디터
Novel이란?
Novel 스타일링 문제
에디터 저장 및 고려 사항들
📠 실시간 협업, 통신
Yorkie와 Novel editor 연동
YJS, Websocket, React-Flow
YJS, Socket.io
WebSocket과 Socket.io에 대해 간단히 알아보기
YJS 가이드 근데 이제 Socket.io를 곁들인
🏗️ 인프라와 CI/CD
NCloud CI CD 구축
BE 개발 스택과 기술적 고민
private key로 원격 서버 접근
nCloud 서버, VPC 만들고 설정
monorepo로 변경
⌛ 캐시, 최적화
rabbit mq 사용법
🔑 인증, 인가, 보안
passport로 oAuth 로그인 회원가입 구현
FE 로그인 기능 구현
JWT로 인증 인가 구현
JWT 쿠키로 사용하기
refresh token 보완하기
🧸 팀원 소개
⛺️ 그라운드 룰
🍞 커밋 컨벤션
🧈 이슈, PR 컨벤션
🥞 브랜치 전략
🌤️ 데일리 스크럼
📑 회의록
1️⃣ 1주차
킥오프(10/25)
2일차(10/29)
3일차(10/30)
4일차(10/31)
2️⃣ 2주차
8일차(11/04)
9일차(11/05)
11일차(11/07)
13일차(11/09)
3️⃣ 3주차
3주차 주간계획(11/11)
16일차(11/12)
18일차(11/14)
4️⃣ 4주차
4주차 주간계획(11/18)
23일차(11/19)
24일차(11/20)
25일차(11/21)
5️⃣ 5주차
5주차 주간계획(11/25)
29일차(11/25)
32일차(11/28)
34일차(11/30)
6️⃣ 6주차
6주차 주간계획(12/2)
37일차(12/3)