Подати заявку як операцію, не натиснути кнопку
Щоденний інтерфейс виглядає просто: показати календар, виділити сьогодні, і дати гравця претензію. Складна частина - це все за цією кнопкою. Клієнт може надсилати той самий запит багаторазово. Дві сервери можуть спостерігати той самий збережений стан. Запит на зберігання даних може не вийти після частини логіки винагороди. Гравець може від'єднатися між наполегливістю і презентацією. Якщо здійснення лікує кожен запит, як дозвіл на надання, дублікати валюти і предмети є очікуваним результатом, а не випадок.
Модель Safer - це операційна операція з сервером. Клієнт просить претензувати, але він ніколи не вирішує, чи є винагорода за рахунок того, що вказана винагорода або чи вдається грант. Сервер подає поточний період винагороди, завантажує авторитетний профільний стан, перевіряє настрочену винагороду, спробує один атомічний державний перехід, а лише потім повертає результат клієнт може відображатися.
Цей розділ є центральним правилом: інтерфейс користувача спілкується непристойним; сервер володіє доступністю і мутацією.
Визначте найменший авторитетний стан
Щоденні нагороди не потребують історії кожного інтерфейсу взаємодії. Вони потребують достатньо міцного стану, щоб відповісти на три питання: який період винагороди був останній, що позиція стейку випливає з цієї держави, і чи може поточний запит перенести стан вперед.
Практичний профіль, як правило, потребує стабільного ключа періоду, останнього покоління ключа, і значення streak. Ключ від часу сервера і документованої політики скидання. Незалежно від того, чи продукт скидає на UTC ніч, на налаштованому регіональному кордоні, або після закінчення прокатки є прийняття рішення про продукт, але рішення повинно бути детермінованою на сервері. Клієнтські годинники ніколи не повинні визначати відповідальності.
Зберігати конфігурацію окремих від стану гравця. Настрочений календар може визначити ідентифікатори винагороди, кількість, імена валют, поведінкова поведінка та активні дати. Стан гравця повинен посилатися на дійсну версію конфігурації або стабільний ідентифікатор винагороди, а не копіювати довільні витрати клієнтів в сховище.
Дійсно доторкнутися до зберігання
Roblox керівництво безпеки лікує кожну передачу вартості, що переходить на межі клієнта, як ненадійне. Для щоденної претензії, запит повинен бути навмисно нудним. У багатьох конструкціях сервер не потребує суми винагороди, кількості Streak або індексу дня від клієнта на всіх; він може занурювати ці значення самостійно.
Перед початком роботи магазину, сервер повинен застосовувати невеликий ланцюг відторгнення:
- підтвердити запит, який прибув на призначеному сервері RemoteEvent або RemoteFunction;
- відхилити несподівані види, додаткові ідентифікатори, або неправильні навантаження;
- ставка-лімітні спроби за гравця на сервері;
- перевірка профілю гравця та відповідної конфігурації функції;
- відмовляється від запитів, коли заява про те, що гравець вже обробляється локально.
Обмеження швидкості не є гарантією дублікатів. Вона захищає продуктивність сервера і зменшує зловживання. Гарантія повинна бути як і раніше вижити два сервера, рети, від'єднання і процес перезавантаження.
Зробіть доступність та зобов’язання одного анатомічного оновлення
`GetAsync()` слідувати пізніше `SetAsync()’ залишає за собою вікно забігу. Два сервера можуть прочитати той самий непроголошений стан, як вирішити гравця, і як написати грант. Roblox документи `UpdateAsync()` як безпечна багатосерверна операція, оскільки він читає поточне значення і підтверджує зворотний зв’язок при одночасному оновленні конфлікту.
Поставити рішення про конфіденційність всередині цього атомного оновлення. Зворотній зв'язок отримує останнє збережене значення, перевіряє, чи вже був здійснений поточний період, і повертає або новий стан або `nil` для скасування. Зворотній зв'язок не повинен входити, тому не варто викликати зовнішні послуги, чекаючи екземплярів, або виконувати видиму винагороду самостійно.
У відкритому стані обов’язково повинен бути надійний маркер гранту: період винагороди та стабільний ідентифікатор винагороди або ключ транзакцій, який отримав оновлення. Якщо зворотний дзвінок виявить, що маркер вже існує, правильний результат – «прочитаний заявлений», – не інший грант.
Цей шаблон перетворює повторювані запити на повторне читання того ж результату. Перший дійсний перехід перемагає. Пізніше спроби дотримуватись відповідного маркера і стають но-опами.
Закрийте проміжок між стійкістю та доставкою винагороди
Атомний профільний стан запобігає переходу двох претензій, але дизайн все ще потребує чіткого замовлення доставки. Якщо валюта додана перед маркером позову є міцною, відмова від зберігання даних може залишити значення, надане без запису. Якщо маркер зберігався спочатку і сервер збоїться до доставки, гравець може мати зобов'язану претензію без пункту.
Надійна відповідь - це idempotent грантовий запис. Прийміть ідентифікатор транзакції та стан доставки, потім зробіть доставку винагороди безпечно повторювати від цього ідентифікатора. Валюта, інвентаризація, значок або додаткові послуги повинні визнати, що конкретна операція вже була застосована. Шлях відновлення може перевіряти відповідні записи та зберігати їх без створення другого винагороди.
Не кожен досвід потребує комплексного під керівництвом, але кожен досвід потребує чіткої відповіді на питання часткової відповіді. «Запит, ймовірно, закінчується» не є гарантією.
Порядок консервації під час речення
Відповідні дзвінки можуть бути недійсними, а Фонд LiveOps Goblin використовує безпечну обгортку для зберігання даних з птицею та поведінкою. Порада не така ж, як і відправка такої ж операції знову з декількох незалежних завдань. Roblox попереджає, що наїдені рети можуть перезамовити державні операції.
Використовуйте один послідовний шлях позову для гравця, зберігайте порядок зміни профілю, і зберігайте ідентифікатор транзакцій стабільним через речення. Зберігати тільки невдалу операцію з обмеженим зворотним відключенням. Не варто перекласти новий період винагороди або ключ транзакції на кожну спробу. Якщо листки гравця, міцне відновлення повинно бути здатне продовжувати від збереженого стану, а не від незрівняного прапора.
Діагностика повинні відхилити запити, обмеження швидкості, попередження про зберігання даних, вже проголошені результати, відповідні вимоги та відновлення доставки. Ці події є оперативними доказами, вони не повинні піддаватися секретам або тканинним діям, коли не налаштовується постачальника аналітики.
Зберігати конфігурацію сейфа перед тим, як він досягає гри
Неускладнений захист ослаблюється, коли сам експортований календар винагород є неоднозначним. LiveOps Goblin діє неможливе число, відсутні ключі зберігання даних, неоднозначні імена валют, дублікати коди та розкладні графіки перед створенням версії конфігурації Roblox.
Визначення винагороди повинна використовувати стабільні ідентифікатори, обмежені кількості, відомі валюти або інвентарні цілі, чіткі правила розкладу та версія, яка може бути простежена в діагностиці. Порожні календарі повинні залишатися порожніми, поки творець додає реальні нагороди. Демо значення в конфігурації виробництва є більш небезпечними, ніж чесний порожній стан, оскільки вони можуть стати реальними економічними мутаціями.
При зміні календарів, вирішіть, що відбувається для гравців середнього віку. Стабільні ідентифікатори винагороди та реверсійна конфігурація роблять цю політику перевіреною. Посадові припущення роблять його простими для «день трьох» для позначення різних винагород до і після оновлення.
Тестувати збої, не тільки щасливий шлях
Корисна щоденна тестова матриця повинна включати в себе більше «проголошених один раз і отримувати монети». При мінімальному навчанні:
- два швидких запитів від того ж клієнта;
- запити від двох контекстів сервера до тих же збережених профілів;
- позов за період, який вже був здійснений;
- зміщені віддалені навантаження і швидкість-лімітова поведінка;
- конфлікти, перехідна недостатність і виснажені птітні шляхи;
- відключення після зобов’язань, але перед підтвердженням клієнта;
- птиця доставки за допомогою того ж ідентифікатора транзакції;
- зміна календарної версії під час активного стейку;
- відсутність або недійсної конфігурації винагороди;
- аналітика відключена з діагностикою все ще функціонують.
Очікуваний результат не просто “без аварії”. Кожен тест повинен стверджувати остаточний міцний стан, кількість наданих грантів, результат клієнта-видимого результату, а також діагностичний захід.
Контроль за виконанням консьєржа
Остаточний дизайн можна переглянути з десяти питань. Є можливість отримати на сервері? Чи можна скидати час детермінування? Чи надсилає клієнт тільки Intent? Чи є віддалені запити, перевірені та серверно-обмеженими? Чи є анатомія переходу претензії? Чи містить в собі стабільний маркер транзакцій? Чи може винагородити доставку повторюватися без дублювання? Чи є рети збереження замовлення? Чи доступні настройки та перевірені? Чи повинні конвативні та часткові тести довести точно один міцний грант?
Коли всі десять відповідей є бетоном, щоденна винагорода перестає бути крихким гудзиком і стає невеликою, зрозумілою угодою LiveOps.








