Foundry
알림 시스템 설계
심화
핵심

폭주와 우선순위

급한 줄은 늘 비어 있어야 한다

피크 초당 1만 이 몰릴 때 1분 안에 도착해야 하는 알림이 함께 있습니다. 두 요구를 같은 줄에서 만족시킬 수 없습니다.

한 줄이면 뒤에 선 것이 늦는다

한 줄에 섞으면 급한 알림이 대량 발송 뒤에 서고 줄을 나누면 먼저 나간다 한 줄에 섞으면 급한 알림 마케팅 100만 건이 앞에 있다. 그 뒤에 서면 몇 분이 걸린다 줄을 나누면 급한 줄. 양이 적다 대량 발송 줄 일꾼을 줄마다 배정하고 급한 줄에 먼저 준다 급한 줄은 양이 적어서 늘 비어 있다. 그것이 1분을 지킨다

마케팅 100만 건이 큐에 들어가고 그 뒤에 비밀번호 재설정 알림이 붙으면, 앞의 100만 건을 처리한 뒤에야 나갑니다. 초당 1만이라도 100초가 걸립니다.

그래서 줄을 나눕니다. 급한 줄과 대량 발송 줄을 따로 두고 일꾼을 배정합니다.

급한 줄은 양이 적어서 늘 비어 있다
그 비어 있음이 1분을 지켜 준다

몇 개로 나누나

무엇이 들어가나
급한 것인증 번호, 비밀번호 재설정, 결제와 보안 알림
보통댓글과 언급, 배송 상태
대량마케팅, 공지, 재참여 유도

셋이 흔한 선택입니다. 더 나누면 관리가 늘고, 둘로 줄이면 보통 알림이 대량 발송에 밀립니다.

보내는 서비스가 종류를 정합니다. 그런데 모두가 자기 알림을 급한 것으로 표시하려 하므로, 급한 줄에 넣을 수 있는 종류를 목록으로 관리해야 합니다. 아니면 급한 줄도 곧 막힙니다.

대량 발송을 일부러 늦춘다

대량 발송은 지연이 허용됩니다. 그래서 일부러 천천히 보냅니다.

이유내용
제공자 제한한꺼번에 밀면 거절당한다
우리 여력급한 알림에 자원을 남긴다
상대 서비스알림을 받고 몰려오는 접속을 펴 준다

세 번째가 특히 중요합니다. 100만 명에게 동시에 알리면 그 앱과 서버가 동시 접속을 받습니다. 알림 시스템이 상대 서비스를 무너뜨리는 셈입니다.

취소할 수 있어야 한다

대량 발송은 시작한 뒤 잘못된 것을 알게 되는 일이 흔합니다. 내용이 틀렸거나 대상이 잘못됐을 때입니다.

큐에 다 넣고 시작하면 취소할 방법이 없다
발송 작업을 하나의 단위로 두고 중단 가능하게 만든다

천천히 보내는 것이 취소 가능성을 만듭니다. 한꺼번에 밀어 넣으면 이미 나간 것을 되돌릴 수 없습니다. 두 이유가 같은 결론을 가리킵니다.

급한 줄이 막히면 무엇을 하나

급한 줄도 막힐 수 있습니다. 제공자 장애나 갑작스러운 인증 요청 폭증 때입니다.

이때는 대량 발송을 멈추고 자원을 급한 줄로 옮깁니다. 대량 발송은 지연이 허용되므로 멈춰도 됩니다. 우선순위가 있다는 것은 급할 때 무엇을 버릴지 정해 두었다는 뜻입니다.

버릴 것을 정해 두지 않은 우선순위는 이름만 있는 것입니다.

면접에서 이렇게 나옵니다

Q.피크 초당 1만 폭주 중에 1분 요구를 어떻게 지키나요

줄을 나누고 일꾼을 따로 배정합니다.

마케팅 100만 건 뒤에 비밀번호 재설정 알림이 붙으면 초당 1만이라도 100초가 걸립니다.

무엇이 들어가나
급한 것인증 번호, 비밀번호 재설정, 결제와 보안
보통댓글과 언급, 배송 상태
대량마케팅, 공지, 재참여 유도

급한 줄은 양이 적어서 늘 비어 있고, 그 비어 있음이 1분을 지켜 줍니다.

흔한 실수: 큐 하나에 우선순위 값을 두고 정렬하는 것. 정렬은 되지만 이미 일꾼이 처리 중인 것은 앞지를 수 없고, 큐가 길면 정렬 비용도 커집니다. 줄을 물리적으로 나누는 편이 단순하고 확실합니다.

Q.모든 서비스가 자기 알림을 급한 것으로 표시하면 어떻게 하나요

급한 줄에 넣을 수 있는 종류를 목록으로 관리합니다.

보내는 서비스가 종류를 정하는 것이 자연스럽지만, 모두가 자기 알림을 급하다고 하면 급한 줄도 곧 막힙니다.

급한 줄에 넣을 수 있는 알림 종류를 미리 등록한다
등록되지 않은 종류는 보통 줄로 간다

그리고 급한 줄의 양을 지표로 봅니다. 급한 줄이 커지고 있으면 분류가 무너지고 있다는 신호입니다.

흔한 실수: 우선순위를 요청자가 자유롭게 정하게 두는 것. 우선순위는 희소한 자원을 나누는 규칙이라 모두가 최고를 고르면 규칙이 사라집니다. 누가 정하는지가 우선순위 설계의 핵심입니다.

Q.대량 발송을 일부러 늦추는 이유가 무엇인가요

세 가지 이유가 같은 결론을 가리킵니다.

이유내용
제공자 제한한꺼번에 밀면 거절당한다
우리 여력급한 알림에 자원을 남긴다
상대 서비스알림을 받고 몰려오는 접속을 펴 준다

세 번째가 특히 중요합니다. 100만 명에게 동시에 알리면 그 앱과 서버가 동시 접속을 받습니다. 알림 시스템이 상대 서비스를 무너뜨리는 셈입니다.

흔한 실수: 발송 속도를 최대로 두는 것. 빠른 발송이 목표처럼 보이지만 알림의 목적은 사용자가 오게 하는 것이고, 와서 서비스가 죽어 있으면 알림이 손해가 됩니다.

Q.대량 발송을 시작한 뒤 취소할 수 있나요

천천히 보내면 가능합니다. 한꺼번에 밀어 넣으면 불가능합니다.

대량 발송은 시작한 뒤 잘못을 알게 되는 일이 흔합니다. 내용이 틀렸거나 대상이 잘못됐을 때입니다.

큐에 다 넣고 시작하면 취소할 방법이 없다
발송 작업을 하나의 단위로 두고 중단 가능하게 만든다

천천히 보내는 것이 취소 가능성을 만듭니다. 앞의 세 이유와 같은 결론입니다.

흔한 실수: 취소를 큐 비우기로 구현하는 것. 큐에는 여러 발송 작업의 항목이 섞여 있으므로 다른 작업까지 지웁니다. 작업 단위를 표시해 두고 그 표시로 걸러내야 합니다.

먼저 스스로 답해보고 아래 답변과 견줘보세요. 막히는 부분은 문제로 확인할 수 있어요.

읽었으면 문제로 확인해보세요

알림 시스템 설계 문제를 풀면 틀린 문제가 자동으로 노트에 쌓입니다. 가입 없이 5문제를 먼저 풀어볼 수도 있어요.