Μετάβαση στο κύριο περιεχόμενο

Πώς να σχεδιάσει Roblox ημερήσιες ανταμοιβές χωρίς διπλές επιχορηγήσεις

Διάγραμμα των συστημάτων Roblox LiveOps και των προστατευόμενων ορίων χρόνου λειτουργίας τους.

Ένας πρακτικός σχεδιασμός server-authoritative για Roblox καθημερινές ανταμοιβές που αντιστέκονται σε επαναλαμβανόμενα αιτήματα, παράλληλους διακομιστές, αποτυχίες datastore, και μερικών επιχορηγήσεων.

Αντιμετώπιση μιας απαίτησης ως συναλλαγή, όχι ως πάτημα κουμπιού

Μια διεπαφή ημερήσιας απόδοσης φαίνεται απλή: εμφάνιση ενός ημερολογίου, επισήμανση σήμερα, και αφήστε τον παίκτη να ισχυριστεί. Το δύσκολο μέρος είναι τα πάντα πίσω από αυτό το κουμπί. Ένας πελάτης μπορεί να στείλει το ίδιο αίτημα επανειλημμένα. Δύο servers μπορούν να παρατηρήσουν την ίδια αποθηκευμένη κατάσταση. Μια αίτηση datastore μπορεί να αποτύχει μετά από ένα μέρος της λογικής ανταμοιβής έχει τρέξει. Ένας παίκτης μπορεί να αποσυνδεθεί μεταξύ επιμονής και παρουσίασης. Αν η υλοποίηση αντιμετωπίζει κάθε αίτημα ως άδεια χορήγησης, το διπλό νόμισμα και τα αντικείμενα είναι ένα αναμενόμενο αποτέλεσμα και όχι μια περίπτωση άκρης.

Το ασφαλέστερο μοντέλο είναι μια συναλλαγή που ανήκει στον server. Ο πελάτης ζητά να διεκδικήσει, αλλά ποτέ δεν αποφασίζει αν οφείλεται μια ανταμοιβή, τι περιέχει η ανταμοιβή, ή αν η επιχορήγηση πέτυχε. Ο διακομιστής αντλεί την τρέχουσα περίοδο ανταμοιβής, φορτώνει την έγκυρη κατάσταση προφίλ, επικυρώνει την ρυθμισμένη ανταμοιβή, επιχειρεί μια μετάβαση ατομικής κατάστασης, και μόνο τότε επιστρέφει ένα αποτέλεσμα που ο πελάτης μπορεί να εμφανίσει.

Αυτός ο διαχωρισμός είναι ο κεντρικός κανόνας: η διεπαφή χρήστη επικοινωνεί πρόθεση· ο διακομιστής κατέχει την επιλεξιμότητα και τη μετάλλαξη.

Ορισμός της μικρότερης έγκυρης κατάστασης

Οι ημερήσιες ανταμοιβές δεν χρειάζονται ιστορικό κάθε αλληλεπίδρασης διασύνδεσης. Χρειάζονται αρκετά ανθεκτική κατάσταση για να απαντήσουν σε τρεις ερωτήσεις: ποια περίοδος ανταμοιβής δεσμεύτηκε τελευταία, ποια θέση σερί ακολουθεί από αυτή την κατάσταση, και αν το τρέχον αίτημα μπορεί να προωθήσει το κράτος προς τα εμπρός.

Ένα πρακτικό προφίλ συνήθως χρειάζεται ένα σταθερό κλειδί περιόδου, ένα κλειδί τελευταίας επιτυχίας, και μια τιμή σερί. Το κλειδί περιόδου θα πρέπει να προέρχεται από το χρόνο διακομιστή και μια τεκμηριωμένη πολιτική επαναφοράς. Είτε το προϊόν επαναρυθμίζεται στα μεσάνυχτα UTC, σε ένα ρυθμισμένο περιφερειακό όριο, ή μετά από μια διάρκεια κύλισης είναι μια απόφαση προϊόντος, αλλά η απόφαση πρέπει να είναι ντετερμινιστική στον εξυπηρετητή. Τα ρολόγια πελάτη δεν πρέπει ποτέ να καθορίζουν την επιλεξιμότητα.

Διατήρηση ρυθμίσεων χωριστά από την κατάσταση του παίκτη. Το ρυθμισμένο ημερολόγιο μπορεί να ορίσει αναγνωριστικά ανταμοιβής, ποσότητες, ονόματα νομισμάτων, συμπεριφορά σερί και ενεργές ημερομηνίες. Η κατάσταση του παίκτη θα πρέπει να αναφέρεται σε μια επικυρωμένη έκδοση ρύθμισης ή σταθερό αναγνωριστικό ανταμοιβής αντί να αντιγράφει αυθαίρετα ωφέλιμο φορτίο πελάτη στην αποθήκευση.

Επικύρωση του τηλεχειριστηρίου πριν από την επαφή με την αποθήκευση

Roblox καθοδήγηση ασφάλειας αντιμετωπίζει κάθε τιμή που διασχίζει το όριο πελάτη-server ως μη έμπιστο. Για μια καθημερινή αξίωση, το αίτημα θα πρέπει να είναι σκόπιμα βαρετό. Σε πολλά σχέδια ο διακομιστής δεν χρειάζεται ποσό ανταμοιβής, αριθμό σερί, ή δείκτης ημέρας από τον πελάτη καθόλου? μπορεί να αντλήσει αυτές τις τιμές η ίδια.

Πριν από την έναρξη της εργασίας datastore, ο διακομιστής θα πρέπει να εφαρμόσει μια μικρή αλυσίδα απόρριψης:

  • επιβεβαιώνει την αίτηση που έχει υποβληθεί στον προβλεπόμενο εξυπηρετητή RemoteEvent ή RemoteFunction·
  • να απορρίπτει μη αναμενόμενους τύπους, πρόσθετα αναγνωριστικά στοιχεία ή παραμορφωμένα ωφέλιμο φορτίο·
  • τις προσπάθειες υποβολής αιτήσεων ορίου επιτοκίου ανά παίκτη στον εξυπηρετητή·
  • επαληθεύει το προφίλ του παίκτη και τις σχετικές ρυθμίσεις χαρακτηριστικών είναι διαθέσιμες·
  • να αρνηθεί τις αιτήσεις ενώ μια αξίωση για τον εν λόγω παίκτη είναι ήδη υπό επεξεργασία σε τοπικό επίπεδο.

Ο περιορισμός των τιμών δεν είναι η εγγύηση διπλής επιχορήγησης. Προστατεύει την ικανότητα των server και μειώνει την κατάχρηση. Η διαρκής εγγύηση πρέπει να επιβιώσει ακόμα δύο servers, επανασυνδέσεις, και επανεκκινεί διαδικασία.

Επιλεξιμότητα και δέσμευση μιας ατομικής ενημέρωσης

Δύο servers μπορούν να διαβάσουν την ίδια αζήτητη κατάσταση, και οι δύο να αποφασίσουν ότι ο παίκτης είναι επιλέξιμος, και οι δύο να γράψουν μια επιχορήγηση. Roblox documents `UpdateAsync()` ως η ασφαλέστερη πολυ-server λειτουργία επειδή διαβάζει την τρέχουσα αξία και επαναλαμβάνει την κλήση κατά τη σύγκρουση ταυτόχρονη ενημερώσεις.

Βάλτε την απόφαση επιλεξιμότητας μέσα σε αυτή την ατομική ενημέρωση. Η επανάκληση λαμβάνει την τελευταία αποθηκευμένη αξία, ελέγχει αν η τρέχουσα περίοδος έχει ήδη δεσμευθεί, και επιστρέφει είτε μια νέα κατάσταση ή «ουδέν» για να ακυρώσει. Η επανάκληση δεν πρέπει να υποχωρήσει, έτσι δεν πρέπει να καλέσει εξωτερικές υπηρεσίες, να περιμένει για περιπτώσεις, ή να εκτελέσει η ίδια την ορατή επιχορήγηση ανταμοιβής.

Το δεσμευμένο κράτος θα πρέπει να περιλαμβάνει ένα σταθερό δείκτη επιχορήγησης: την περίοδο ανταμοιβής και το σταθερό αναγνωριστικό ανταμοιβής ή το κλειδί συναλλαγής που κέρδισε την ενημέρωση.

Αυτό το μοτίβο μετατρέπει τα επαναλαμβανόμενα αιτήματα σε επαναλαμβανόμενες αναγνώσεις του ίδιου αποτελέσματος. Η πρώτη έγκυρη μετάβαση κερδίζει.

Κλείσιμο του χάσματος μεταξύ επιμονής και παράδοσης ανταμοιβής

Αν το νόμισμα προστεθεί πριν ο δείκτης απαίτησης είναι ανθεκτικός, μια αποτυχία datastore μπορεί να αφήσει την αξία που χορηγείται χωρίς εγγραφή. Αν ο δείκτης αποθηκεύεται πρώτα και ο διακομιστής καταρρεύσει πριν από την παράδοση, ο παίκτης μπορεί να έχει μια δεσμευμένη αξίωση χωρίς το στοιχείο.

Η ισχυρή απάντηση είναι ένα idempotent ρεκόρ επιχορήγησης. Δεσμεύστε ένα αναγνωριστικό συναλλαγής και μια κατάσταση παράδοσης, στη συνέχεια να κάνει την παράδοση ανταμοιβής ασφαλή για να επαναλάβει ενάντια σε αυτό το αναγνωριστικό. Νόμισμα, απογραφή, σήμα, ή υπηρεσίες δικαιώματος θα πρέπει να αναγνωρίσει ότι μια συγκεκριμένη συναλλαγή έχει ήδη εφαρμοστεί.

Δεν χρειάζεται κάθε εμπειρία ένα περίπλοκο βιβλίο, αλλά κάθε εμπειρία χρειάζεται μια σαφή απάντηση στην ερώτηση μερικής αποτυχίας. “Το αίτημα πιθανότατα τελειώνει” δεν είναι μια εγγύηση.

Διατήρηση της εντολής λειτουργίας κατά τη διάρκεια των επαναλήψεων

Οι κλήσεις Datastore μπορεί να αποτύχουν, και η LiveOps Goblin Το runtime foundation χρησιμοποιεί ένα ασφαλές περιτύλιγμα datastore με επαναπροσπάθεια και εφεδρική συμπεριφορά. Η επανέναρξη δεν είναι το ίδιο με την αποστολή της ίδιας λειτουργίας και πάλι από διάφορες ανεξάρτητες εργασίες. Roblox προειδοποιεί ότι οι αφελείς αποστειρώσεις μπορούν να αναδιατάξει σοβαρές επιχειρήσεις.

Χρησιμοποιήστε μία σειριασμένη διαδρομή απαίτησης ανά παίκτη, διατηρήστε τη σειρά των αλλαγών προφίλ, και κρατήστε το αναγνωριστικό συναλλαγής σταθερό σε όλες τις επαναλήψεις. Ξαναδοκιμάστε μόνο την αποτυχημένη λειτουργία με δεσμευμένη αντιστάθμιση. Μην επαναπροσδιορίστε μια νέα περίοδο ανταμοιβής ή το κλειδί συναλλαγών σε κάθε προσπάθεια. Αν ο παίκτης φύγει, η διαρκής ανάκτηση θα πρέπει να είναι σε θέση να συνεχίσει από την αποθηκευμένη κατάσταση και όχι από μια σημαία εντός μνήμης.

Τα διαγνωστικά θα πρέπει να διακρίνουν τις απορριπτόμενες αιτήσεις, τα όρια τιμών, τις προειδοποιήσεις datastore, τα αποτελέσματα που έχουν ήδη ζητηθεί, τις δεσμευμένες αξιώσεις και την ανάκτηση παράδοσης.

Διατήρηση ασφαλούς ρύθμισης πριν φτάσει στο παιχνίδι

Η διπλή προστασία αποδυναμώνεται όταν το ίδιο το εξαχθέν ημερολόγιο ανταμοιβής είναι διφορούμενο. LiveOps Goblin επικυρώνει αδύνατες ποσότητες, λείπει κλειδιά datastore, διφορούμενα ονόματα νομισμάτων, διπλούς κωδικούς, και έληξε προγράμματα πριν από την παραγωγή μιας έκδοσης Roblox διαμόρφωση.

Ένας ορισμός ανταμοιβής θα πρέπει να χρησιμοποιεί σταθερά αναγνωριστικά, οριοθετημένες ποσότητες, γνωστούς στόχους νομίσματος ή απογραφής, σαφείς κανόνες χρονοδιαγράμματος, και μια έκδοση που μπορεί να ανιχνευθεί στα διαγνωστικά. Κενά ημερολόγια πρέπει να παραμείνουν άδεια μέχρι ένας δημιουργός να προσθέσει πραγματικές ανταμοιβές. Οι τιμές επίδειξης στη διαμόρφωση παραγωγής είναι πιο επικίνδυνες από μια έντιμη κενή κατάσταση, επειδή μπορούν να γίνουν πραγματικές μεταλλάξεις οικονομίας.

Όταν ένα ημερολόγιο αλλάζει, αποφασίστε τι συμβαίνει στους παίκτες μέσης ταχύτητας. Σταθερά αναγνωριστικά ανταμοιβής και διαμορφώσεις έκδοσης καθιστούν ότι η πολιτική ελέγχεται.

Δοκιμάστε τις αποτυχίες, όχι μόνο το χαρούμενο μονοπάτι

Ένας χρήσιμος πίνακας δοκιμών ημερήσιας απόδοσης θα πρέπει να περιλαμβάνει περισσότερα από “να διεκδικεί μία φορά και να λαμβάνει κέρματα”.

  • δύο ταχείες αιτήσεις από τον ίδιο πελάτη·
  • αιτήματα από δύο περιβάλλοντα διακομιστή έναντι του ίδιου αποθηκευμένου προφίλ·
  • απαίτηση για περίοδο που έχει ήδη δεσμευθεί·
  • κακοδιαμορφωμένο απομακρυσμένο ωφέλιμο φορτίο και συμπεριφορά ορίου τιμών·
  • σύγκρουση datastore, παροδική αποτυχία, και εξαντλημένες διαδρομές επανέναρξη?
  • αποσύνδεση μετά τη δέσμευση, αλλά πριν από την επιβεβαίωση του πελάτη·
  • η παράδοση επαναπροσδιορίζεται χρησιμοποιώντας το ίδιο αναγνωριστικό συναλλαγής·
  • αλλαγή της έκδοσης ημερολογίου κατά τη διάρκεια ενεργού σερί·
  • μια διάταξη ανταμοιβής που λείπει ή δεν είναι έγκυρη·
  • Αναλυτικά απενεργοποιημένα με διαγνωστικά που λειτουργούν ακόμα.

Το αναμενόμενο αποτέλεσμα δεν είναι απλώς «δεν συντριβή.» Κάθε δοκιμή θα πρέπει να επιβεβαιώσει την τελική ανθεκτική κατάσταση, τον αριθμό των επιχορηγήσεων που εφαρμόζονται, το ορατό από τον πελάτη αποτέλεσμα, και το διαγνωστικό γεγονός.

Συνοπτικός κατάλογος ελέγχου υλοποίησης

Ο τελικός σχεδιασμός μπορεί να επανεξεταστεί με δέκα ερωτήσεις. Είναι η επιλεξιμότητα που προέρχεται από τον εξυπηρετητή; Είναι η επαναφορά του χρόνου deterministic; Στέλνει ο πελάτης μόνο πρόθεση; Είναι οι απομακρυσμένες αιτήσεις επικυρωμένες και οι τιμές του διακομιστή περιορισμένες; Είναι ο ισχυρισμός μετάβαση ατομική; Μήπως η αποθηκευμένη κατάσταση περιλαμβάνει ένα σταθερό δείκτη συναλλαγών; Μπορεί η παράδοση ανταμοιβής να επαναληφθεί χωρίς αλληλεπικάλυψη; Μήπως οι οπισθοδρομίες διατηρούν την τάξη; Είναι οι ρυθμίσεις που εκδίδονται και επικυρώνονται; Μήπως οι δοκιμές concurrency και μερικής αποτυχίας αποδεικνύουν ακριβώς μια σταθερή επιχορήγηση;

Όταν και οι δέκα απαντήσεις είναι συγκεκριμένες, μια καθημερινή ανταμοιβή παύει να είναι ένας εύθραυστος χειριστής κουμπιών και γίνεται μια μικρή, κατανοητή συναλλαγή LiveOps.

Σχετικό σύστημαΕξερευνήστε το LiveOps Goblin