Fakturace databází podle toho, co skutečně používají
Každá aplikace Mythexu, která potřebuje ukládat data, dostane vlastní Postgres databázi, a využití databáze publikované aplikace se odečítá ze stejného kreditního zůstatku jako stavění. Až do konce září jsme toto využití odhadovali podle toho, jak dlouho běžel server aplikace. Odhad se ukázal být chybný způsobem, na kterém záleželo, a nahradili jsme ho: každá databáze se nyní účtuje podle výpočetního výkonu, který její poskytovatel skutečně změřil, po jedné dokončené hodině, a každou hodinu lze účtovat jen jednou.
Jak databáze fungují
Každá databáze běží na serverless Postgresu, který se škáluje na nulu: po několika minutách nečinnosti usne a probudí se při dalším dotazu. Když je vzhůru, může výpočetní výkon podle zátěže zvyšovat a snižovat. Díky tomu je „databáze pro každou aplikaci“ dostupná – většina aplikací je většinu času klidná a uspaná databáze stojí téměř nic.
Znamená to také, že náklady na databázi závisí na dvou věcech, které zvenku nevidíme: jak dlouho byla vzhůru a jak velká byla, když byla vzhůru.
Co odhad mýlil
Naše původní měřič dělal jeden předpoklad: za každou hodinu, kdy běžel server publikované aplikace, účtovat databázi v nejmenší velikosti výpočetního výkonu.
Bylo to špatně třemi způsoby:
- Velikost byla špatně. Databáze ve skutečnosti běžely ve větší výchozí velikosti, než odhad předpokládal.
- Databáze se automaticky škálují. Pod zátěží rostou a odhad to nikdy nezachytil.
- Databáze nesledují server aplikace. Databáze zůstává vzhůru, kdykoli se na ni cokoli dotazuje – aplikace, naplánovaná úloha, skript, který ji dotazuje ve smyčce – bez ohledu na to, zda server aplikace běžel.
Čistý efekt: odhad účtoval uživatelům zhruba polovinu toho, co databáze skutečně stály. To není udržitelné a navíc čísla o využití v aplikaci neznamenala to, co si lidé mysleli.
Měření místo odhadování
Náš poskytovatel databází hlásí pro každý projekt výpočetní jednotkosekundy za hodinu – kolik výpočetního výkonu skutečně spotřeboval, včetně velikosti. Měřič teď funguje takto:
- U každé publikované aplikace s databází načteme změřené využití za každou dokončenou hodinu od spuštění aplikace.
- Převedeme to využití na náklady podle ceny poskytovatele, uplatníme sazbu tarifu a účtujeme to z kreditů vlastníka aplikace.
- Při každém běhu se díváme zpět až o den, takže hodiny, které se zmeškaly během restartu našeho API, se vyúčtují později.
Úložiště se účtuje zvlášť podle velikosti, protože nezávisí na aktivitě.
Nikdy neúčtovat hodinu dvakrát
Měřič fakturace, který běží na více než jednom serveru a může spadnout a zkusit to znovu, musí být opatrný, aby neúčtoval dvakrát. Každá hodina každé databáze se před účtováním nárokuje v řádku vlastní databáze s jedinečným omezením na dvojici (databáze, hodina). Pokud se dva servery nebo opakování pokusí účtovat tutéž hodinu, uspěje jen jeden nárok.
Zvolili jsme také vědomé rozhodnutí pro vzácný případ selhání: pokud proces spadne mezi nárokováním hodiny a jejím účtováním, hodina zůstane nárokovaná a neúčtovaná. Ztráta malého kousku příjmu při vzácném pádu je lepší než dvojí účtování někoho.
A když se změřená fakturace zapnula, začala od příští celé hodiny. Hodiny před tím už byly účtovány starým odhadem; účtovat je znovu podle změřených dat by znamenalo účtovat ten úsek dvakrát.
Co to znamená, když stavíte na Mythexu
- Vaše účet za databázi nyní odráží, co vaše databáze dělala. Zřídka používaná aplikace stojí velmi málo; aplikace, která se na databázi neustále dotazuje, ji udrží vzhůru a bude stát víc.
- Největší páka je, jak vaše aplikace databázi používá. Dotazování databáze každých pár sekund ji udrží vzhůru nonstop. Když AI získává data na vyžádání nebo je cachuje, databáze může spát. Náš průvodce, co je databáze pokrývá základy.
- Tarify Pro platí za hosting, databáze a úložiště poloviční sazbu oproti Free. Podrobnosti jsou v dokumentaci ke kreditům.
Co si z toho bereme
- Odhady nákladů závislých na využití driftují. Když upstream poskytovatel dokáže říct, co bylo použito, účtujte podle toho.
- Udělejte fakturaci idempotentní na nejmenší jednotce, kterou účtujete. U nás je to jedna hodina databáze.
- Když musíte selhat, selhávejte ve prospěch zákazníka.