網誌

按實際用量為資料庫計費

每個需要儲存資料的 Mythex 應用程式,都會有自己的 Postgres 資料庫,而已發佈應用程式的資料庫用量,會從與建立功能相同的額度餘額中扣除。直至 9 月下旬為止,我們都是根據應用程式伺服器的運行時間來估算這項用量。結果發現這個估算的錯誤足以產生影響,因此我們將它取代:現在每個資料庫都根據其供應商實際量度到的運算量計費,以一個已完成的小時為單位,而且每個小時只可能被收費一次。

資料庫如何運作

每個資料庫都運行在會縮減至零的無伺服器 Postgres 上:閒置幾分鐘後會進入休眠,並在下一次查詢時喚醒。喚醒期間,它可以隨負載上下調整運算資源。這正是「每個應用程式一個資料庫」得以負擔得起的原因:大多數應用程式大部分時間都很安靜,而休眠中的資料庫幾乎沒有成本。

這也意味著資料庫的成本取決於兩件我們從外部看不見的事:它醒著的時間有多長,以及醒著的時候規模有多大。

原本的估算哪裡出錯

我們最初的計量表有一個假設:已發佈應用程式的伺服器每運行一個小時,就按最小的運算規模收取一小時的資料庫費用。

這在三方面都有錯誤:

  1. 規模有誤。 資料庫實際上是以比估算所假設的更大的預設規模運行。
  2. 資料庫會自動調整規模。 在負載下,它們會擴大,而估算從未考慮到這一點。
  3. 資料庫並非跟隨應用程式伺服器運作。 只要任何東西查詢它,資料庫就會保持清醒,無論是應用程式、排程工作,還是輪詢它的腳本,而不論應用程式伺服器是否在運行。

最終的結果是:估算向用戶收取的費用,大約只有資料庫實際成本的一半。這對我們來說是不可持續的,而且也令應用程式中顯示的用量數字,與人們理解的意思不符。

以量度取代猜測

我們的資料庫供應商會回報每個專案每小時的運算單位秒數,即它實際使用了多少運算資源,包括規模在內。因此,計量表現在的運作方式如下:

  1. 對於每個帶有資料庫的已發佈應用程式,取得自應用程式上線以來,每一個已完成小時的實測用量。
  2. 按供應商的價格將該用量換算為成本,套用方案的費率,然後從應用程式擁有者的額度中扣除。
  3. 每次最多回溯一天,因此在我們的 API 重新啟動期間遺漏的小時,之後仍會被計費。

儲存則另外按大小計費,因為它不取決於活動量。

絕不重複收取同一小時的費用

一個在多部伺服器上運行、而且可能崩潰並重試的計費計量器,必須小心避免重複收費。每個資料庫的每一小時,都會在收費之前,先在其自身的資料庫列中被認領,並對(資料庫、小時)這一組合設有唯一性限制。如果兩部伺服器,或者一次重試,嘗試為同一小時計費,就只有一次認領會成功。

對於罕見的故障情況,我們也作出了刻意的選擇:如果程序在認領某小時之後、收費之前崩潰,該小時會保持已認領且未計費的狀態。在罕見的崩潰中損失一小部分收入,好過向任何人重複收費。

而且在實測計費開始運作時,它是從下一個完整的小時開始。之前的小時已經按舊的估算收費,如果再根據實測數據計費,那段時間就會被收費兩次。

如果你在 Mythex 上建立應用程式,這代表什麼

  • 你的資料庫帳單現在反映的是你的資料庫實際做了什麼。 很少使用的應用程式成本很低;不斷查詢其資料庫的應用程式,會令資料庫保持清醒,費用也會更高。
  • 最大的影響因素是你的應用程式如何使用資料庫。 每隔幾秒輪詢資料庫,會令它全天候保持清醒。改為按需要由 AI 擷取資料,或將資料快取起來,就可以讓資料庫進入休眠。我們的資料庫是什麼指南涵蓋了基本知識。
  • Pro 方案的託管、資料庫和儲存費率,是 Free 方案費率的一半。詳情請參閱額度文件。

我們從中學到的

  • 按用量計費的成本估算會偏離實際。 當上游供應商能告訴你實際用了多少時,就應該以此計費。
  • 在你收費的最小單位上令計費具備冪等性。 對我們而言,就是每一個資料庫小時。
  • 當你必須失敗時,失敗時要有利於客戶。

Mythex · Pricing · 用 AI 建造任何嘢 · 網站及應用程式範本 · Mythex 比較 · AI 應用程式開發詞彙表 · 免費 AI 應用程式開發工具 · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština Dansk Deutsch Ελληνικά Español Español (España) Eesti فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia Íslenska Italiano 日本語 ქართული Қазақ тілі ಕನ್ನಡ 한국어 Lietuvių Latviešu Македонски മലയാളം Монгол मराठी Bahasa Melayu မြန်မာ Norsk bokmål Nederlands ਪੰਜਾਬੀ Polski Português (Brasil) Português (Portugal) Română Русский Slovenčina Slovenščina Soomaali Shqip Srpski Svenska Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 简体中文 繁體中文(台灣)