
배경레디스 분산 락을 활용한 멀티 서버 환경 푸시 알림 중복 문제 해결 (1 / 2)위 이전 글에서 이어지는 글로 코드적으로 알림 중복 전송 처리를 고도화하기 위한 글이다.동적 TTL 설정이전에 레디스의 락 만료 시간이 고정되어 있다는 문제점이 있어서 이를 동적 TTL 설정하는 방식으로 해결한다고 했었다. 이때 외부라이브러리인 Redisson이 아닌, 직접 구현하는 방식으로 해결한고 했다. 따라서 이번에는 실제로 어떻게 구현했는지에 대해서 적어보려고 한다. 왜 락 만료 시간이 고정된게 문제인지에 대해선 이전 글을 참고하자. 동적 TTL을 직접 설정할 때도 크게 2가지 방식으로 설정할 수 있었다. 1. 데몬 쓰레드 기반2. 코루틴 기반 각각의 방식에 대해서 자세히 살펴보자.데몬 쓰레드 기반 TTL 연장 (..

배경현재 구조현 인프라 구조는 위와 같이 멀티 서버로 구성되어 있다. 그리고 각 서버에서는 매분 배치가 돌면서 서버에 푸시 알림을 전송한다.사건의 발단알림을 전송할 때 레디스에 저장되어 있는 알림 후보들을 조회하고 조건에 충족되면 FCM 서버에 Push 요청을 보내는 흐름이다. 문제는 두 서버에서 모두 배치가 돌기 때문에 같은 알림 건에 대해 두 서버가 동시에 Push 알림 요청을 보내게 되는 것이다. 해결 방안1. 단일 서버에서 배치를 돌린다.두 서버에서 배치를 돌리기에 중복 전달이 발생하기 때문에 가장 먼저 생각난 방법은 한 서버에서만 배치를 돌리는 것이다.한 서버에서만 푸시 알림을 전송하면 중복 전송이 발생하지 않을 것이라는 1차원적 생각이였다. 하지만 바로 적절하지 않은 방법이라고 생각했다...

코루틴의 등장 배경코루틴(Coroutine)은 비동기 프로그래밍을 쉽게 할 수 있게 도와주는 개념으로, 특히 Kotlin에서 매우 강력하게 활용되는 기능 중 하나이다. 쓰레드를 블로킹하지 않으면서도 동기식 코드처럼 깔끔하게 비동기 로직을 작성할 수 있도록 해준다.비동기 작업을 동기식 코드처럼 읽기 쉽게 작성하기 위해 등장한 것이다. 이전에는 콜백 지옥(callback hell), Future 등으로 복잡했던 비동기 흐름을 코루틴의 등장으로 간단히 표현 가능해졌다. 코루틴이란?코루틴은 **중단(suspend)**과 **재개(resume)**가 가능한 비동기 실행 단위이다. 쓰레드가 아니라, 쓰레드 위에서 작동하는 논리적 작업 단위이다. 중단과 재개의 개념이 익숙하지 않을 것이다. 코루틴은 진입하고 빠..

배경사용자가 인증을 완료하면 서버는 Access 토큰과 Refresh 토큰을 발급한다. 이후 사용자가 로그아웃하면, 해당 토큰을 Blacklist에 등록하게 된다. 이후 사용자가 토큰을 포함해 서버에 요청을 보낼 경우, 서버는 해당 토큰이 유효한지 검증하고 동시에 Blacklist에 등록된 토큰인지도 확인하게 된다. 이러한 흐름에서 토큰의 Blacklist를 Redis와 같은 in-memory DB에서 관리해도 괜찮을지에 대한 의문이 들었고, 이에 대한 고민과 실험 내용을 정리해보았다. 본문Redis는 휘발성이다?Redis is the world’s fastest in-memory database.. (Redis 공식 문서) Redis 공식 문서에서도 알 수 있듯이 Redis는 메모리에 데이터를 ..
- Total
- Today
- Yesterday
- 스프링 api 테스트
- 우테코
- 알고리즘
- 환경변수 관리
- gcp 인바운드
- 스왑 메모리 장단점
- Assertions
- 우아한테크코스 6기
- 우테코 6기
- 6기
- 코루틴
- 우아한테크코스 자소서
- contextwith
- sh 문법 오류
- redis
- 토큰
- 자바
- 우테코 준비
- 우아한테크코스 후기
- setnx
- 스왑 메모리 설정
- 우테코 프리코스
- 레디스
- 파이썬
- 게임개발
- redis 메모리 사용량
- JWT
- 우아한테크코스
- 토큰 블랙리스트
- 레디스 분산락
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |