실제 사용량에 따라 데이터베이스 요금을 청구합니다
데이터를 저장해야 하는 Mythex 앱에는 각각 자체 Postgres 데이터베이스가 생기며, 게시된 앱의 데이터베이스 사용량은 빌드할 때와 같은 크레딧 잔액에서 차감됩니다. 9월 말까지 우리는 그 사용량을 앱의 서버가 실행된 시간으로부터 추정했습니다. 그런데 그 추정은 중요한 면에서 틀렸고, 그래서 교체했습니다. 이제 각 데이터베이스는 제공업체가 실제로 측정한 컴퓨팅 사용량에 따라 완료된 한 시간 단위로 청구되며, 각 시간은 한 번만 청구될 수 있습니다.
데이터베이스의 작동 방식
각 데이터베이스는 **0으로 자동 축소(scale to zero)**되는 서버리스 Postgres에서 실행됩니다. 몇 분 동안 유휴 상태이면 잠들고, 다음 쿼리가 오면 깨어납니다. 깨어 있는 동안에는 부하에 따라 컴퓨팅을 늘리고 줄일 수 있습니다. 이 덕분에 "앱마다 데이터베이스 하나"가 감당할 만한 비용이 됩니다. 대부분의 앱은 대부분의 시간에 조용하고, 잠든 데이터베이스는 거의 비용이 들지 않습니다.
즉 데이터베이스의 비용은 외부에서 볼 수 없는 두 가지에 달려 있습니다. 얼마나 오래 깨어 있었는지, 그리고 깨어 있는 동안 얼마나 컸는지입니다.
추정이 틀렸던 부분
원래 미터는 가정 하나를 했습니다. 게시된 앱의 서버가 실행되는 매 시간마다 데이터베이스를 가장 작은 컴퓨팅 크기로 청구한다는 것입니다.
그 가정은 세 가지 면에서 틀렸습니다.
- 크기가 틀렸습니다. 실제 데이터베이스는 추정이 가정한 것보다 큰 기본 크기로 실행되고 있었습니다.
- 데이터베이스는 자동으로 확장됩니다. 부하가 걸리면 커지는데, 추정은 그것을 전혀 보지 못했습니다.
- 데이터베이스는 앱 서버를 따라가지 않습니다. 데이터베이스는 무엇이든 쿼리하는 동안 깨어 있습니다. 앱, 예약 작업, 데이터베이스를 계속 조회하는 스크립트 등이 앱 서버가 실행 중인지와 상관없이 쿼리하면 깨어 있습니다.
결과적으로 추정은 사용자에게 실제 데이터베이스 비용의 약 절반만 청구하고 있었습니다. 이는 우리에게 지속 가능하지 않았고, 앱에 표시되는 사용량 숫자도 사람들이 생각하는 의미를 갖지 못하게 했습니다.
추측 대신 측정
데이터베이스 제공업체는 각 프로젝트의 **시간당 컴퓨팅 단위 초(compute-unit-seconds)**를 보고합니다. 즉 크기까지 포함해서 실제로 얼마나 많은 컴퓨팅을 썼는지 알려 줍니다. 그래서 이제 미터는 다음과 같이 작동합니다.
- 데이터베이스가 있는 게시된 앱마다, 앱이 출시된 이후 완료된 모든 시간의 측정 사용량을 가져옵니다.
- 그 사용량을 제공업체 가격에 따라 비용으로 바꾸고, 요금제의 요율을 적용한 뒤 앱 소유자의 크레딧에서 차감합니다.
- 매번 최대 하루 전까지 되돌아봅니다. 그래서 API가 재시작되는 동안 놓친 시간도 나중에 청구됩니다.
스토리지는 활동과 상관없이 크기에 따라 따로 청구됩니다.
한 시간을 두 번 청구하지 않기
여러 서버에서 실행되고 충돌했다가 재시도할 수 있는 청구 미터는 이중 청구를 조심해야 합니다. 데이터베이스의 각 시간은 청구하기 전에 자체 데이터베이스 행에서 **점유(claim)**되며, (데이터베이스, 시간) 쌍에 유일성 제약이 걸려 있습니다. 두 서버나 재시도가 같은 시간을 청구하려고 하면 하나의 점유만 성공합니다.
드문 실패 사례에 대해서도 의도적으로 선택했습니다. 시간을 점유한 뒤 청구하기 전에 프로세스가 충돌하면, 그 시간은 점유된 채 청구되지 않은 상태로 남습니다. 드문 충돌로 약간의 매출을 놓치는 편이, 누군가에게 두 번 청구하는 것보다 낫습니다.
측정 기반 청구를 켰을 때는 다음 완전한 시간부터 시작했습니다. 그 이전 시간들은 이미 예전 추정 방식으로 청구되었고, 측정 데이터로 다시 청구했다면 그 구간을 두 번 청구하게 되었을 것입니다.
Mythex에서 빌드한다면 이게 의미하는 것
- 데이터베이스 청구서는 이제 데이터베이스가 한 일을 반영합니다. 거의 사용되지 않는 앱은 비용이 아주 적고, 데이터베이스를 계속 쿼리하는 앱은 데이터베이스를 깨워 두어 비용이 더 듭니다.
- 가장 큰 조절 요소는 앱이 데이터베이스를 어떻게 사용하느냐입니다. 데이터베이스를 몇 초마다 폴링하면 하루 종일 깨어 있게 됩니다. 필요할 때만 AI가 데이터를 가져오게 하거나 데이터를 캐시하면 데이터베이스가 잠들 수 있습니다. 기본 개념이 궁금하다면 데이터베이스란 무엇인가 가이드를 참고하세요.
- Pro 요금제는 호스팅, 데이터베이스, 스토리지에 대해 무료 요금의 절반을 냅니다. 자세한 내용은 크레딧 문서에 있습니다.
얻은 교훈
- 사용량 기반 비용의 추정은 점점 어긋납니다. 상위 제공업체가 실제 사용량을 알려 줄 수 있다면, 그 값으로 청구하세요.
- 청구하는 가장 작은 단위에서 청구를 멱등적으로 만드세요. 우리에게 그 단위는 데이터베이스 한 시간입니다.
- 실패해야 한다면, 고객에게 유리한 쪽으로 실패하세요.