Ārpus ātruma ierobežojumiem: piekļuves mērogošana Codex un Sora
Džona Koens, tehniskā personāla loceklis
Pagājušajā gada laikā mēs strauji ieviesām Codex un Sora, un to lietojums ātri vien pārsniedza mūsu sākotnējās prognozes. Esam novērojuši konsekventu tendenci: lietotāji iesaistās, atklāj reālu ieguvumu un tad saskaras ar ātruma ierobežojumiem.
Ātruma ierobežojumi var palīdzēt izlīdzināt pieprasījumu un nodrošināt taisnīgu piekļuvi, tomēr, ja lietotāji gūst lietderīgu pieredzi, strauja apturēšana var būt kaitinoša. Mēs vēlējāmies nodrošināt lietotājiem iespēju turpināt darbu, vienlaikus saglabājot sistēmas veiktspēju un lietotāju uzticību mūsu pieejai.
Lai to atrisinātu, mēs izveidojām reāllaika piekļuves dzinēju, kas uzskaita lietojumu. Viens no šī dzinēja slāņiem ir iespēja iegādāties kredītus. Kad lietotāji pārsniedz savus ātruma ierobežojumus, kredīti viņiem ļauj turpināt izmantot mūsu produktus, samazinot savu kredītu atlikumu.
Aiz tā slēpjas sarežģīta sistēma, kas apvieno limitus, reāllaika lietojuma izsekošanu un kredītu atlikumus vienotā piekļuves modelī. Šajā ierakstā tiek skaidrots, kāpēc Codex un Sora mērogošanai bija nepieciešama piekļuves kontroles pārskatīšana, kā pierādāmi pareiza reāllaika sistēma apvieno ātruma ierobežojumus un kredītus katram pieprasījumam, un kā šis pamats nodrošina papildu piekļuvi abiem produktiem.
Plašākā mērogā tradicionālie piekļuves modeļi mēdz likt izdarīt izvēli:
- Ātruma ierobežojumi sākumā var būt noderīgi, bet, kad tie izsīkst, lietotājiem rodas slikta pieredze: “atgriezies vēlāk”
- Uz lietojumu balstīta norēķināšanās ir elastīga, taču lietotājiem jāmaksā jau no pirmās tekstvienības – tas nav ideāls risinājums, lai veicinātu agrīnu izpēti
Codex un Sora gadījumā neviens no modeļiem atsevišķi nebija pietiekams. Ja mēs vienkārši palielinātu ātruma ierobežojumus, mēs zaudētu svarīgus pieprasījumu izlīdzināšanas un taisnīguma kontroles mehānismus un mums pietrūktu kapacitātes, lai visus apkalpotu. Ja mēs pilnībā paļautos uz asinhronu lietošanas apmaksu, mums rastos aizkavēšanās, pārtēriņi vai saskaņošanas problēmas – tieši tādas problēmas, ko lietotāji pamana, kad viņi ir visvairāk iesaistīti.
Tā vietā mums bija nepieciešama vienota hibrīdsistēma, kas apvieno reāllaika ierobežojumus ar maksāšanu pēc lietošanas principa:
Šai sistēmai vajadzēja:
- Piemēro ātruma ierobežojumus, līdz tie tiek sasniegti
- Viegli pārej uz kredītiem tā paša pieprasījuma ietvaros
- pieņemt lēmumu reāllaikā;
- būt ārkārtīgi precīzai un auditējamai, izsekojot kredītu patēriņu.
Viena no galvenajām konceptuālajām izmaiņām, ko veicām, bija piekļuves modelēšana kā lēmumu kaskāde. Tā vietā, lai jautātu “Vai tas ir atļauts?”, mēs jautājam “Cik daudz ir atļauts un no kurienes?” Uzskaitot lietojumu, sistēma iziet cauri turpmāk minētajai secībai.
Šis modelis atspoguļo to, kā lietotāji faktiski izmanto produktu. Ātruma ierobežojumi, bezmaksas līmeņi, kredīti, akcijas un uzņēmuma tiesības ir tikai slāņi vienā un tajā pašā lēmumu pakotnē. No lietotāja skatpunkta viņi nemaina sistēmas un vienkārši turpina lietot Codex un Sora. Tāpēc kredīti šķiet neredzami: tie ir tikai vēl viens elements kaskādē.
Mēs izvērtējām trešo pušu norēķinu un mērīšanas platformas kredītu patēriņu pārvaldīšanai. Tās bija ļoti piemērotas rēķinu izrakstīšanai un atskaišu sagatavošanai, taču neatbilda divām būtiskām prasībām:
Kad lietotājs sasniedz limitu un viņam ir pieejami kredīti, sistēmai tas ir jāzina nekavējoties. Labākais mēģinājums vai novēlota uzskaite izpaužas kā negaidīti bloķējumi, nekonsekventi atlikumi un nepareizi maksājumi. Interaktīviem produktiem, piemēram, Codex un Sora, šīs kļūmes kļūst redzamas un ir traucējošas.
Mums bija jānodrošina arī katra rezultāta pārredzamība:
- Kāpēc pieprasījums tika atļauts vai bloķēts
- Cik daudz lietojuma tas patērēja
- Kādi ierobežojumi vai atlikumi tika piemēroti
Šī funkcija bija cieši jāintegrē mūsu lēmumu pieņemšanas procesā, nevis jārisina nodalīti, izmantojot atsevišķu lietošanas norēķinu platformu, kas redz tikai daļu no notiekošā. Lai lietotāji varētu piekļūt mūsu produktiem, nezaudējot uzticību, mums bija nepieciešama pilnīga kontrole pār precizitāti, laika plānošanu un novērojamību. Tas mūs pamudināja izvēlēties iekšēju risinājumu.
Lai to nodrošinātu, mēs izveidojām izkliedētu lietojuma un atlikumu sistēmu, kas ir īpaši paredzēta sinhronizētu piekļuves lēmumu pieņemšanai.
Augstākajā līmenī sistēma:
- izseko katra lietotāja un katras funkcijas lietojumu;
- uztur ātruma ierobežojumu logus;
- uztur reāllaika kredītu atlikumus;
- idempotenti apstrādā debetus, izmantojot straumēšanas asinhrono procesoru.
Katrs pieprasījums iziet vienotu novērtēšanas procesu, kurā reāllaikā tiek pieņemts lēmums par atļauto izmantošanas apjomu, sinhroni patērējot no ātruma ierobežojumiem un, ja nepieciešams, pārbaudot kredītu pietiekamību; pēc tam tiek atgriezts viens galīgais rezultāts, vienlaikus asinhroni norēķinoties par kredītu debetiem. Tas nodrošina vienotu darbību visos produktos un novērš loģikas dublēšanos starp komandām.
Viens no šīs sistēmas galvenajiem izstrādes principiem ir tas, ka mums ir jāspēj pierādīt, ka mūsu izrakstītie rēķini ir pareizi. Tas atspoguļo mūsu kredītu atbalsta saknes, kas aizsākās, strādājot ar uzņēmumu klientiem. Iepriekš redzamajā sistēmas diagrammā ir trīs atsevišķas datu kopas, kas visas ir savstarpēji saistītas.
- Produkta lietošanas notikumi: ko lietotājs patiesībā darīja
- Monetizācijas notikumi: par ko mēs iekasējam maksu no lietotāja par lietošanu
- Atlikuma atjauninājumi: cik lielā apmērā mēs mainījām lietotāja kredīta atlikumu un kāpēc
Šīs datu kopas nav nejaušs blakusprodukts; tās faktiski virza sistēmu, un katra datu kopa aktivizē nākamo. Atdalot notikušo, jebkādus saistītos maksājumus un to, ko esam debetējuši, mēs varam neatkarīgi pārbaudīt, atkārtot un saskaņot katru slāni. Šis ir apzināts kompromiss, kurā mēs prioritizējam pierādāmu pareizību, pat ja tas nozīmē, ka kredīta atlikuma atjauninājumi var nedaudz aizkavēties. Kā mēs to paveicām.
- Produkta lietošanas notikumi tiek publicēti par visām lietotāju aktivitātēm neatkarīgi no tā, vai tās ietekmē kredītu patēriņu vai nē. Tas nodrošina lietotāju darbību audita pierakstu un ļauj mums izskaidrot, kāpēc mēs esam vai neesam iekasējuši kredītus.
- Katram notikumam ir stabila idempotences atslēga, tāpēc atkārtoti mēģinājumi, atkārtotas atskaņošanas vai darbinieku veikta restartēšana nekad nevar divkārši debetēt atlikumu, tādējādi novēršot divkāršu iekasēšanu. Tas arī ļauj mums veikt partijas saskaņošanu, lai pārbaudītu mūsu darbu bezsaistē.
- Mēs veicam asinhronus (bet joprojām gandrīz reāllaika) atlikuma atjauninājumus sinhrono atjauninājumu vietā, lai izveidotu audita pierakstu. Mēs pieļaujam nelielu aizkavi lietotāja bilances atjaunināšanā, lai varētu pierādīt, ka sistēma darbojas pareizi, un pārliecināt mūsu lietotājus, ka mēs viņiem neizrakstām kļūdainus rēķinus. Ja īslaicīga aizkave izraisa lietotāja kredīta atlikuma pārsniegšanu, mēs to automātiski atmaksājam; mēs izvēlamies pierādāmu pareizību un lietotāju uzticēšanos, nevis stingru noteikumu ievērošanu.
- Mēs samazinām Kredīta atlikumu un ievietojam Atlikuma atjauninājuma ierakstu vienā atomārā datubāzes darījumā. Atlikumu atjauninājumi tiek serializēti katram kontam, tāpēc vienlaicīgi pieprasījumi nekad nevar sacensties par to pašu kredītu izlietošanu. Ieraksts Atlikuma atjauninājums ietver gan debeta summu, gan atsauci uz monetizācijas notikumu, kas izraisīja atjauninājumu; iekļaujot to vienā datubāzes darījumā, tiek nodrošināts, ka mums ir audita pieraksts par katru kredīta atlikuma korekciju.
Visa šī stingrība kalpo vienam mērķim: padarīt piekļuvi vienkāršu un drošu. Kad cilvēki veido vai programmē, viņiem nevajadzētu domāt par to, vai pieprasījums tiks izpildīts, vai viņiem netiks piemērota pārmaksa un vai viņu atlikums ir precīzs. Padarot lietošanu, rēķinu izrakstīšanu un atlikumus pierādāmi pareizus, mēs piedāvājam lietotājiem sistēmu, kas netraucē viņu pieredzi. Tas ļauj mums aizstāt strauju apturēšanu ar nepārtrauktu piekļuvi, padarot kredītus izmantojamus reālā darba laikā, nevis tikai rēķinā.
Mūsu pieejas pamatprincips ir lietotāju dinamiskas pieredzes aizsardzība. Katrs arhitektūras lēmums atspoguļo lietotājam redzamu rezultātu: reāllaika atlikumi novērš nevajadzīgus pārtraukumus, atomārais patēriņš novērš dubultu iekasēšanu, un vienota piekļuves loģika nodrošina paredzamu darbību. Rezultātā cilvēki var strādāt ilgāk, veikt padziļinātu izpēti un virzīt projektus tālāk, nesaskaroties ar strauju apturēšanu vai priekšlaicīgām plāna izmaiņām.
Kad lietotāji ir iesaistīti, sistēmai vajadzētu palīdzēt viņiem turpināt, nevis traucēt. Ierobežojumi un kredīti aizvirzās otrajā plānā.
Lai veidotu šo pieredzi, bija nepieciešams pārdomāt piekļuvi, lietošanu un norēķinus kā vienotu sistēmu un izveidot infrastruktūru, kurā precizitāte tiek uzskatīta par pirmšķirīgu produkta funkciju. Laika gaitā šis pamats var tikt attiecināts uz vairāk produktiem; Codex un Sora ir tikai sākums.


