Skip to content
isdnetworks
Go back

크기가 아니라 개수에 비례한 비용

외부 서비스에 내는 요금이 한 달 사이에 여섯 배가 됐는데 자료가 그만큼 늘어난 것은 아니어서 무엇이 요금을 정하는지부터 확인해야 했다.

Table of contents

Open Table of contents

증상 — 여섯 배가 된 요금

요금은 한 달에 $5 이던 것이 $30 이 돼 있었다. 그 서비스의 집계 화면이 우리 쪽에서는 저장소 미연결로 열리지 않아 사용량을 직접 볼 수 없었고, 대신 우리 쪽 요청 로그에 응답의 사용량 정보가 찍혀 있어서 그것을 grep 하고 wc -l 로 셌다.

하루치를 세어 보니 이렇게 나왔다.

처리한 단위    10개
호출 A         43회
호출 B         13회
호출 C         65회
호출 D        133회
────────────────────
합계          254회

10개를 처리하는 데 254회다. 다만 그것이 요금과 어떻게 이어지는지는 아직 확정되지 않았다.

단위당 고정된 호출 수

처리 하나가 나갈 때 API 호출이 몇 번 일어나는지를 grep 으로 확인했더니 그 수가 고정이었다.

추출 1단계    1~2회
추출 2단계    1~2회
중복 제거 1   다수
중복 제거 2   다수
────────────────────
합계       약 12회

자료가 크든 작든 관계없이 언제나 약 12회가 나가고 있었다.

그러면 비용 공식이 이렇게 선다.

비용 ∝ 단위 수 × 12

크기가 아니라 개수다. 큰 자료 하나와 작은 자료 하나가 같은 비용을 내는 구조였다.

비례 관계를 먼저 확정한다

이 관계를 확정하기 전에는 자료를 작게 만드는 방향으로 조치를 생각하고 있었다. 그런데 개수에 비례하는 것이라면 그 조치로는 아무 효과가 없다.

개수에 비례하므로 여러 건을 묶어서 한 단위로 보내는 것이 해법이 된다. 묶음 크기별로 산출해 보니 이렇게 갈렸다.

1개씩      $30/월
5개 묶음   $1~5/월
10개 묶음  무료 한도 안

비례 관계가 무엇인지에 따라 조치가 정반대로 갈리므로 그것을 먼저 확정해야 했다.

무료 한도와 단위 수

무료 한도가 API 호출 수로 정해져 있어서 그것을 단위당 호출 수로 나눠 봤다.

하루 40회 ÷ 단위당 12회 ≈ 3개

하루 세 단위면 한도가 차고 그 뒤로는 유료로 넘어간다.

요금이 뛴 시점을 보니 저장 단위를 잘게 쪼개도록 고친 시점과 맞았다.

[전]  묶어서 저장 → 단위 수 적음 → 대부분 무료 한도 안
[후]  잘게 저장   → 단위 수 많음 → 대부분 유료

여섯 배가 그것으로 설명됐다.

재시도가 태운 몫

여기에 하나가 더 있었는데 실패한 호출을 다시 보내는 처리가 상한 초과에도 재시도를 하고 있었다. 로그에 실패한 단위 하나가 여섯 번 재시도되고 결국 실패한 기록이 있었고 그 한 건이 하루 한도만큼을 태웠다. 상한을 넘어서 실패한 것은 다시 보내 봐야 같은 응답이 돌아온다.

그러니 그 재시도가 남은 한도를 더 빨리 태우고 있었던 것이다. 재시도 대상인지 아닌지를 API 응답 종류로 갈라야 했고 그 자리를 고치는 것이 묶는 것과 함께 조치가 됐다.

정리


Share this post on:

Previous Post
프로젝트별 배포 대상 표
Next Post
경유 지점 뒤의 전수 추적