본문 바로가기

프로젝트

앱으로 보내는 멀티 스레드 단체 알림 진행도 처리하기

단체 알림 진행도 응답

관리자 페이지에서 앱으로 단체 알림의 진행도를 볼 수 있으면 좋겠다는 요구사항이 생겼다. 실시간으로 정확하게 알려줄 필요는 없다고는 했다. 그래서 관리자 페이지에서 사용할 진행도 API를 만들어 명세서를 전달하기로 했다.

 

✔ 비동기 멀티 스레드 환경

단체 알림은 한 번에 약 100만 건 이상을 보낼 수 있도록 설계가 되었다. 비동기 멀티 스레드 환경으로 구성했으며, 보내는 알림의 전체 수를 나누어 각 스레드에 할당을 했다.  

 

✔ 고려 사항

비동기로 처리가 되다 보니, 각 스레드의 값을 하나로 합칠 수 있는 공유 자원이 필요했다. 그리고 하나의 단체 메시지만 있는 것이 아니었기 때문에 각 단체 메시지마다 구별을 해서 진행도를 처리해야 했다. 마지막으로 단체 알림 서버가 증원이 될 수 있기 때문에 여러 서버가 공유할 수 있어야 했다.

 

✔ Redis Command 사용

고려 사항을 만족하고 현재 사용을 하고 있는 기술 중에 가장 적합한 것은 레디스 캐시였다. 레디스를 사용하여 처리를 했으며, 각 스레드가 접근을 해 진행도를 상승시켜야 하기 때문에 동시성 문제와 값 상승을 시킬 수 있는 Incr를 사용하기로 했다.

 

incr key

 

 

추가적으로 처리량을 1씩 추가할 때마다 레디스에 접근하면 부하가 발생할 수 있기 때문에 1000 단위로 끊어서 처리하기로 했다. 레디스에 제공해 주는 incrby를 사용하기로 했다.

 

incrby key 1000

 

✔ 참고

 

INCRBY Redis

incrby INCRBY 지정한 숫자(정수) 만큼 증가 지정한 숫자 만큼 증가시킨다. 키가 데이터베이스에 없을 경우에 0을 기준으로 주어진 숫자를 더하거나 빼서 리턴한다. 음수 입력 가능 음수도 입력 가능

redisgate.kr