알림 시스템의 특이한 점은 마지막 단계가 우리 것이 아니라는 것입니다. 푸시는 운영체제 제공자를, 문자는 통신사 쪽을, 메일은 메일 발송 서비스를 거칩니다.
통제가 끝나는 지점
우리가 할 수 있는 것은 제공자에게 넘기는 것까지입니다. 그 뒤는 볼 수 없고 바꿀 수 없습니다.
| 우리 통제 안 | 통제 밖 |
|---|---|
| 무엇을 언제 보낼지 | 실제로 도착하는지 |
| 재시도 정책 | 제공자의 속도 제한 |
| 채널 선택 | 제공자 장애 |
이 경계를 인정하는 것이 설계의 출발점입니다. 도착을 보장하려 하지 말고, 넘기는 것까지를 확실하게 만들고 그 뒤는 관찰합니다.
채널마다 다른 것을 한 겹으로 감싼다
제공자마다 요청 형식과 인증 방식과 오류 코드가 다릅니다. 그것이 우리 코드 전체에 퍼지면 제공자를 바꿀 때 모든 곳을 고쳐야 합니다.
우리 코드는 "이 사람에게 이 알림을 보낸다" 만 말한다
겹 하나가 제공자 차이를 흡수한다
제공자를 바꿀 때 우리 코드가 바뀌지 않아야 합니다. 문자 제공자는 실제로 바뀝니다. 가격과 도달률 때문에 옮기는 일이 흔합니다.
제공자가 우리를 제한한다
제공자에게도 속도 제한이 있습니다. 피크 초당 1만 을 그대로 밀면 거절당합니다.
| 대응 | 내용 |
|---|---|
| 제공자별 발송 속도에 상한을 둔다 | 거절을 미리 피한다 |
| 거절을 받으면 속도를 줄인다 | 상대의 신호에 반응한다 |
| 큐에 쌓아 두고 나눠 보낸다 | 폭주를 흡수한다 |
처리율 제한 설계에서 우리가 만든 장치를 이번에는 우리가 지키는 쪽입니다. 상대가 알려 주는 재시도 시각을 따르고, 지키지 않으면 차단됩니다.
한 채널의 장애가 다른 채널을 막지 않게
문자 제공자가 느려지면 그 발송이 쌓입니다. 같은 일꾼과 같은 큐를 쓰면 푸시 알림도 함께 멈춥니다.
그래서 채널마다 큐와 일꾼을 나눕니다. 크롤러에서 호스트별로 큐를 나눈 것과 같은 구조이고, 이유도 같습니다. 한 곳의 느림이 다른 곳으로 번지지 않게 하는 것입니다.
제공자의 응답을 어떻게 읽나
제공자가 200을 주면 "받았다" 입니다. "도착했다" 가 아닙니다. 이 구분을 흐리면 도달률 지표가 실제와 크게 달라집니다.
| 응답 | 뜻 |
|---|---|
| 수락 | 제공자가 우리 요청을 받았다 |
| 거절 | 형식 오류나 속도 제한. 우리가 고칠 수 있다 |
| 나중에 오는 보고 | 실제 도착 여부. 채널마다 신뢰도가 다르다 |
세 가지를 구분해 기록해야 무엇이 잘못됐는지 알 수 있습니다. 도달 추적은 뒤에서 따로 다룹니다.