データベースの課金は、実際の使用量で決まる
データを保存する必要があるMythexのアプリはすべて、それぞれ専用のPostgresデータベースを持ちます。公開済みアプリのデータベースの使用量は、ビルドに使うのと同じクレジット残高から差し引かれます。9月下旬まで、この使用量はアプリのサーバーが稼働していた時間から推定していました。その推定は重要な点で不正確だったため、置き換えました。現在は、各データベースをプロバイダーが実際に計測したコンピュートに基づいて、完了した1時間ごとに課金します。また、各時間は一度しか課金されないようになっています。
データベースの仕組み
それぞれのデータベースは、スケールトゥゼロに対応したサーバーレスのPostgresで動きます。数分間アイドル状態が続くとスリープし、次のクエリで目を覚まします。起きている間は、負荷に応じてコンピュートを増減できます。これにより「アプリごとにデータベースを1つ」という構成が現実的な費用になるのです。ほとんどのアプリは大半の時間は静かであり、スリープ中のデータベースはほぼ費用がかかりません。
つまり、データベースの費用は、外側からは見えない2つのことに左右されます。起きていた時間の長さと、起きている間のサイズです。
見積もりが外れていた点
当初の計測では、ある仮定を置いていました。公開アプリのサーバーが稼働している1時間ごとに、データベースは最も小さいコンピュートサイズとして課金する、というものです。
この仮定は3つの点で誤っていました。
- サイズが違っていました。 実際のデータベースは、見積もりが想定していたより大きいデフォルトサイズで動いていました。
- データベースは自動スケールします。 負荷がかかると拡大しますが、見積もりではそれが一切反映されていませんでした。
- データベースはアプリのサーバーに連動しません。 データベースは、アプリのサーバーが稼働しているかどうかに関係なく、何かがクエリを発行している限り起きたままです。アプリ本体、スケジュールされたジョブ、データベースをポーリングするスクリプトなどがこれにあたります。
結果として、見積もりでは、実際のデータベースの費用の約半分しかユーザーに請求されていませんでした。これは当社にとって持続可能ではなく、アプリ内の使用量の数字が、ユーザーが考えている意味と一致していないことも意味していました。
推定ではなく計測へ
データベースのプロバイダーは、プロジェクトごとの1時間あたりのコンピュートユニット秒数を報告しています。これは、サイズを含めて実際に使われたコンピュートの量です。そのため、計測は次のように行うようになりました。
- データベースを持つ公開アプリごとに、公開された時点から完了した各時間の計測値を取得します。
- その使用量を、プロバイダーの価格で費用に換算し、プランの料金を適用して、アプリのオーナーのクレジットから差し引きます。
- 各回、最大1日分さかのぼって確認します。そのため、APIが再起動中だった時間の分も、後から請求されます。
ストレージは、アクティビティに依存しないため、サイズに応じて別途課金されます。
1時間を二重に請求しない
複数のサーバーで動き、クラッシュして再試行もありえる課金の仕組みでは、二重請求がないよう慎重に設計する必要があります。データベースの各時間は、請求する前に、専用のデータベース行で確保されます。その行には、(データベース、時間)の組み合わせに対する一意性制約があります。2つのサーバー、あるいは再試行が同じ時間を請求しようとした場合でも、確保できるのは1つだけです。
まれな失敗のケースについては、意図的な判断をしています。確保してから課金するまでの間にプロセスがクラッシュした場合、その時間は確保されたまま、請求されない状態で残ります。まれなクラッシュで収益のわずかな部分を失うほうが、誰かに二重に請求するよりずっとましだと考えています。
さらに、計測による課金を有効にしたときは、次の完全な1時間から開始しました。それより前の時間は、古い推定方式ですでに課金されていたためです。その期間を計測データで改めて請求すると、同じ区間が二重に請求されてしまいます。
Mythexで開発する場合の意味
- データベースの請求額は、データベースが実際に行った作業を反映するようになりました。 あまり使われないアプリの費用はごくわずかです。一方、データベースに絶えずクエリを発行するアプリは、データベースを起きたままにするため、費用が高くなります。
- 最も効果が大きいのは、アプリがデータベースをどう使うかです。 データベースを数秒ごとにポーリングすると、一日中起きたままになります。必要なときにだけAIにデータを取得させたり、データをキャッシュしたりすれば、データベースはスリープできます。データベースとは何かについては、データベースとは何かのガイドで基本を説明しています。
- Proプランでは、ホスティング、データベース、ストレージの料金が無料プランの半額です。詳細はクレジットのドキュメントをご覧ください。
得られた教訓
- 従量課金のコストに関する見積もりは、ずれていきます。 上流のプロバイダーが使用量を正確に示せるなら、その数字に基づいて課金しましょう。
- 課金する最小単位で、冪等性を確保しましょう。 当社の場合、それはデータベースの1時間です。
- 失敗するなら、顧客に有利な方向で失敗させましょう。