Zacházejte s pohledávkou jako s transakcí, ne s stisknutím tlačítka
Rozhraní daily- odměna vypadá jednoduše: ukázat kalendář, zvýraznit dnes, a nechat hráč tvrdí. Obtížná část je vše za tímto tlačítkem. Klient může posílat stejný požadavek opakovaně. Dva servery mohou sledovat stejný uložený stav. Požadavek datastore může selhat po části logiky odměny běží. Hráč může odpojit mezi vytrvalostí a prezentací. Pokud implementace zachází s každou žádost jako s povolením k udělení, duplikovat měnu a položky jsou očekávaným výsledkem spíše než hrana případu.
Bezpečnější model je server- vlastněná transakce. Klient žádá, aby nárok, ale nikdy se rozhodne, zda odměna je splatná, co odměna obsahuje, nebo zda grant uspěl. Server odvozuje aktuální dobu odměny, načte autoritativní profil stavu, validuje nastavenou odměnu, zkusí jeden atomový stav přechod, a teprve pak vrátí výsledek, který klient může zobrazit.
Toto oddělení je hlavním pravidlem: uživatelské rozhraní komunikuje s úmyslem; server vlastní způsobilost a mutaci.
Definovat nejmenší autoritativní stav
Denní odměny nepotřebují historii každé interakce rozhraní. Potřebují dostatek trvalého stavu k zodpovězení tří otázek: která doba odměny byla naposledy oddána, jaká pozice pruhu vyplývá z tohoto stavu, a zda současná žádost může posunout stát vpřed.
Praktický profil obvykle potřebuje stabilní klíč období, poslední-úspěšné-nárok klíč, a pruh hodnota. Klíč období by měl pocházet z času serveru a zdokumentované reset politiky. Ať už produkt resetuje o půlnoci UTC, na konfigurované regionální hranice, nebo po dobu válcování je rozhodnutí výrobku, ale rozhodnutí musí být určující na serveru. Klient hodiny by nikdy určit způsobilost.
Udržujte konfiguraci odděleně od stavu hráče. Nakonfigurovaný kalendář může definovat identifikátory odměn, množství, jména měn, chování pruhu a aktivní data. Stav hráče by se měl odkazovat na ověřenou konfigurační verzi nebo stabilní identifikátor odměny spíše než kopírování libovolného klientova platebního zatížení do úložiště.
Ověřit ovladač před dotykem úložiště
Roblox bezpečnostní pokyny zachází s každou hodnotou překračující hranice client- server jako s nedůvěryhodným. Pro denní tvrzení, požadavek by měl být záměrně nudné. V mnoha návrzích server nepotřebuje odměnu částku, pruh číslo, nebo denní index od klienta vůbec; to může odvodit tyto hodnoty sám.
Před zahájením práce datastore by server měl použít malý řetězec odmítnutí:
- potvrdit, že žádost byla doručena na zamýšleném serveru RemoteEvent nebo RemoteFunction;
- odmítnout neočekávané typy, další identifikátory nebo poškozené užitečné zatížení;
- ratelimitní pokusy o uplatnění nároku na jednoho hráče na serveru;
- ověřuje profil hráče a je k dispozici příslušná konfigurace funkcí;
- zamítnout žádosti, zatímco nárok na tohoto hráče je již zpracováván lokálně.
Omezení rychlosti není záruka duplicate- grant. Chrání kapacitu serveru a snižuje zneužití. Trvalá záruka musí stále přežít dva servery, retry, reconnect, a proces restartuje.
Způsobilost a závazek jedna atomová aktualizace
A 'GetAsync ()' následuje později 'SetAsync ()' opustí okno závodu. Dva servery mohou číst stejný nehlášený stav, oba rozhodnou, že hráč je způsobilý, a oba napsat grant. Roblox dokumenty 'UpdateAsync ()' jako bezpečnější multiserver operace, protože čte aktuální hodnotu a retestuje volání při souběžných aktualizacích konfliktu.
Vložte rozhodnutí o způsobilosti do této atomové aktualizace. Zpětný hovor obdrží nejnovější uloženou hodnotu, zkontroluje, zda aktuální období již bylo přislíbeno, a vrátí se buď nový stav nebo "nula" ke zrušení. Zpětný hovor nesmí vyplynout, takže by neměl volat externí služby, čekat na případy, nebo provádět viditelné odměny grant sám.
Přislíbený stát by měl obsahovat trvalou značku grantu: dobu odměny a stabilní identifikátor odměny nebo transakční klíč, který získal aktualizaci. Pokud zpětné volání zjistí, že marker již existuje, správný výsledek je "již uplatňován", ne další grant.
Tento vzor převádí opakované požadavky na opakované čtení stejného výsledku. První platný přechod vyhrává. Později se pokusí sledovat přiřazený marker a stát se nulou.
Uzavřete mezeru mezi vytrvalostí a dodáním odměny
Stav atomového profilu zabraňuje dvěma přechodům nároku, ale design stále potřebuje jasný příkaz k dodání. Pokud je měna přidána před trvanlivostí markeru, může selhání datového systému ponechat hodnotu bez záznamu. Pokud je marker uložen jako první a server zkratuje před dodáním, hráč může mít přislíbenou pohledávku bez položky.
Robustní odpověď je idempotentní grant záznam. Odeslat identifikátor transakce a stav dodání, pak provést doručení odměny bezpečné opakovat proti tomuto identifikátoru. Měna, inventář, odznak, nebo nárok služby by měly uznat, že konkrétní transakce již byla použita. Ozdravná cesta může kontrolovat committed- but- undelied záznamy a znovu je vyzkoušet, aniž by vytvořily druhou odměnu.
Ne každá zkušenost potřebuje komplexní účetní knihu, ale každá zkušenost potřebuje explicitní odpověď na otázku částečného selhání. "Požadavek pravděpodobně končí" není zárukou.
Zachovat příkaz k operaci během opakování
Datastore hovory mohou selhat, a LiveOps Goblin runtime nadace používá bezpečný obal datastore s retry a backoff chování. Zkoušení není totéž jako odesílání stejné operace znovu z několika nezávislých úkolů. Roblox varuje, že naive retries může přeobjednat stateful operace.
Použít jednu serializovanou cestu nárokování na hráče, zachovat pořadí změn profilu, a udržet identifikátor transakce stabilní napříč retry. Zopakujte pouze neúspěšnou operaci s ohraničenou backoff. Neodměňujte novou dobu odměny nebo transakční klíč na každý pokus. Pokud hráč odejde, trvanlivé zotavení by mělo být možné pokračovat z uloženého stavu, spíše než z in- paměť vlajky.
Diagnostika by měla rozlišovat zamítnuté žádosti, limity sazeb, varování před datastorem, již uváděné výsledky, přislíbené nároky a obnova dodávek. Tyto události jsou operativním důkazem; neměly by odhalovat tajemství nebo vytvářet činnost, pokud není konfigurován žádný poskytovatel analytik.
Udržet konfiguraci bezpečnou, než se dostane do hry
Duplicitní ochrana je oslabena, je-li vyvážený kalendář odměn sám o sobě nejednoznačný. LiveOps Goblin ověřuje nemožná množství, chybějící klávesy pro datastore, nejednoznačná jména měn, duplicitní kódy a vypršela harmonogramy před vytvořením verze Roblox konfigurace.
Definice odměny by měla používat stabilní identifikátory, ohraničená množství, známé měnové nebo inventární cíle, výslovná pravidla harmonogramu a verzi, kterou lze vysledovat v diagnostice. Prázdné kalendáře by měly zůstat prázdné, dokud tvůrce nepřidá skutečné odměny. Demo hodnoty v konfiguraci výroby jsou nebezpečnější než poctivý prázdný stav, protože se mohou stát mutací reálné ekonomiky.
Když se změní kalendář, rozhodněte se, co se stane s hráči mid- pruh. Stabilní identifikátory odměn a konfigurace verze, aby tato politika ověřitelná. Pozice-pouze předpoklady usnadňují "den tři" odkazovat na různé odměny před a po aktualizaci.
Otestujte selhání, nejen šťastnou cestu
Užitečné Daily- odměna test matrice by měla zahrnovat více než "nárokovat jednou a přijímat mince". Minimálně, cvičení:
- dvě rychlé žádosti téhož klienta;
- žádosti ze dvou serverových kontextů proti stejnému uloženému profilu;
- nárok na již slíbené období;
- poruchy vzdáleného užitečného zatížení a chování s limitem rate- limit;
- konflikty s datastorem, přechodné selhání a vyčerpané retestovací cesty;
- odpojit po závazku, ale před potvrzením klienta;
- obnovení dodávky za použití stejného identifikátoru transakce;
- změna kalendářního znění během aktivní série;
- chybějící nebo neplatná konfigurace odměny;
- analytika je vyřazena s diagnostikou stále funkční.
Očekávaný výsledek není jen "žádný pád". Každý test by měl prokázat konečný trvalý stav, počet použitých grantů, klient- viditelný výsledek a diagnostickou událost.
Stručný kontrolní seznam provádění
Konečný návrh může být přezkoumán s deseti otázkami. Je způsobilost odvozena na serveru? Je reset čas deterministický? Odesílá klient pouze záměr? Jsou vzdálené žádosti validovány a serverrate- limited? Je nárok přechod atomic? Má uložený stav obsahuje stabilní transakční marker? Je možné doručení odměny opakovat bez duplikace? Do retries zachovat pořadí? Jsou konfigurace verze a validovány? Do concurrency a partial-failure testy prokázat přesně jeden trvalý grant?
Když je všech deset odpovědí konkrétní, denní odměna přestane být křehkým ovladačem tlačítek a stane se malou, pochopitelnou transakcí LiveOps.








