단체 알림 진행도 응답
관리자 페이지에서 앱으로 단체 알림의 진행도를 볼 수 있으면 좋겠다는 요구사항이 생겼다. 실시간으로 정확하게 알려줄 필요는 없다고는 했다. 그래서 관리자 페이지에서 사용할 진행도 API를 만들어 명세서를 전달하기로 했다.
✔ 비동기 멀티 스레드 환경
단체 알림은 한 번에 약 100만 건 이상을 보낼 수 있도록 설계가 되었다. 비동기 멀티 스레드 환경으로 구성했으며, 보내는 알림의 전체 수를 나누어 각 스레드에 할당을 했다.
✔ 고려 사항
비동기로 처리가 되다 보니, 각 스레드의 값을 하나로 합칠 수 있는 공유 자원이 필요했다. 그리고 하나의 단체 메시지만 있는 것이 아니었기 때문에 각 단체 메시지마다 구별을 해서 진행도를 처리해야 했다. 마지막으로 단체 알림 서버가 증원이 될 수 있기 때문에 여러 서버가 공유할 수 있어야 했다.
✔ Redis Command 사용
고려 사항을 만족하고 현재 사용을 하고 있는 기술 중에 가장 적합한 것은 레디스 캐시였다. 레디스를 사용하여 처리를 했으며, 각 스레드가 접근을 해 진행도를 상승시켜야 하기 때문에 동시성 문제와 값 상승을 시킬 수 있는 Incr를 사용하기로 했다.
incr key
추가적으로 처리량을 1씩 추가할 때마다 레디스에 접근하면 부하가 발생할 수 있기 때문에 1000 단위로 끊어서 처리하기로 했다. 레디스에 제공해 주는 incrby를 사용하기로 했다.
incrby key 1000
✔ 참고
INCRBY Redis
incrby INCRBY 지정한 숫자(정수) 만큼 증가 지정한 숫자 만큼 증가시킨다. 키가 데이터베이스에 없을 경우에 0을 기준으로 주어진 숫자를 더하거나 빼서 리턴한다. 음수 입력 가능 음수도 입력 가능
redisgate.kr
'프로젝트' 카테고리의 다른 글
AWS SQS 메시지 소비할 때 Visibility Timeout 문제 (0) | 2024.08.04 |
---|---|
Header 데이터 처리에 발생하는 예외에 람다 사용하기 (0) | 2024.07.21 |
사용하면서 느낀 Kotlin의 Null Safety (0) | 2024.07.01 |
Java Spring에서 Kotlin' Data Class의 Json Parsing 문제 (1) | 2024.06.09 |
Java에서 Mybatis Custom TypeHandler 생성해서 사용하기 (0) | 2024.06.02 |