FastComments.com Blog

Sun Mar 29 2026
...

FastComments είναι Έτοιμο για το Διάστημα!

! Αυτό το Άρθρο Περιέχει Τεχνική Ορολογία

Τι Νέο

Κάθε point-of-presence του FastComments τώρα πραγματοποιεί εγγραφές τοπικά και τις αναπαράγει ασύγχρονα σε όλους τους άλλους κόμβους. Αυτό θα προσφέρει αυξημένη ανθεκτικότητα σε σχέση με το προηγούμενο σύστημα, καθώς και πιο γρήγορα εργαλεία διαχείρισης για χρήστες σε ορισμένες περιοχές, με κάποιες συμβιβασμούς.

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

Μερική Ιστορία, Γιατί η Αλλαγή

Όταν το FastComments αρχικά λανσαρίστηκε είχαμε μια πολύ τυπική αρχιτεκτονική. Είχαμε μια proxy layer, μια εφαρμογή, μια βάση δεδομένων, κάποιες αναπαραγωγές και, αργότερα, αναπαραγωγές σε περιοχές και παρόχους cloud για επιπλέον αναβάθμιση.

Τελικά μεταφέραμε τις αναπαραγωγές της βάσης δεδομένων σε όλες τις ζώνες όπου βρίσκονται οι περισσότεροι χρήστες μας και επίσης αναπτύξαμε την εφαρμογή εκεί, και δημιουργήσαμε το δικό μας σύστημα DNS και proxy (περιγράφεται σε επόμενο άρθρο) για να δρομολογούμε αιτήματα στον πλησιέστερο κόμβο εφαρμογής. Αυτό καθιστά τις αναγνώσεις γρήγορες, αλλά τις εγγραφές πιο αργές, καθώς τώρα αντί να περιμένεις για μία HTTP αναδρομή πίσω στο backend, περιμένεις για μία HTTP αναδρομή σε έναν πλησιέστερο κόμβο, και αυτός ο κόμβος μπορεί να κάνει πολλές εγγραφές στη βάση δεδομένων πίσω στον κύριο. Όχι καλό!

Έτσι, για να το αντιμετωπίσουμε, αναδομήσαμε πολλές περιοχές της εφαρμογής για να δέχονται ένα readPreference στα ορίσματα των συναρτήσεων, ώστε οι καλούντες να μπορούν να αποφασίζουν πόσο παλιές είναι αποδεκτές οι αναγνώσεις τους, και από πάνω κάναμε περισσότερες εγγραφές (όπως η καταγραφή στατιστικών διαχειριστών σε ενέργειες διαχειριστών) να είναι fire-and-forget. Όχι ιδανικό, αλλά επιτάχυνε σημαντικά τα πράγματα.

Ένα πρόβλημα που αντιμετωπίσαμε με την παγκόσμια λειτουργία του Mongo είναι οι διαχωρισμοί δικτύου. Εάν αρκετοί κόμβοι αποκοπούν, οι αναγνώσεις σταματούν καθώς κάθε κόμβος γίνεται αβέβαιος αν είναι αποδεκτό να εξυπηρετήσει αναγνώσεις. Υπάρχουν κάποιες μέθοδοι γύρω από αυτό, αλλά οι ακραίες περιπτώσεις γίνονται μπερδεμένες. Αυτό δεν είναι θεωρητικό ζήτημα - συνέβη αρκετές φορές προκαλώντας σελίδες 3 π.μ. που μας κούρασαν, ακόμη και προσπαθώντας να ρυθμίσουμε το Mongo ώστε να είναι εντάξει με την αβεβαιότητα εκλογής replicaset μέχρι ένα λεπτό. Δυστυχώς, τα δίκτυα από το Σάο Πάολο προς το Φάλκενστάιν, για παράδειγμα, δεν ήταν πολύ καλά σε μερικούς από τους παρόχους φιλοξενίας μας. Η ρύθμιση του ελέγχου συμφόρησης και τέτοια βοήθησε αλλά δεν έλυσε το πρόβλημα.

Η ιδανική λύση, υποθέτοντας ότι είστε εντάξει με ορισμένους συμβιβασμούς, είναι η δυνατότητα να αποδέχεστε τις εγγραφές τοπικά σε αυτόν τον κόμβο (ο οποίος έχει αξιοπρεπή υλικό, RAID κλπ., που είναι απίθανο να καταρρεύσει) και να λέτε στον χρήστη ότι τα δεδομένα του είναι αποθηκευμένα. Μπορείτε επίσης σε αυτό το point-of-presence να έχετε έναν δεύτερο κόμβο ως καυτή αναπαραγωγή για ανθεκτικότητα.

Έτσι, αυτό είναι όπου καταλήξαμε. Ορεγκον, Βιρτζίνια, Φάλκενστάιν, Σάο Πάολο, Σιγκαπούρη, είναι όλοι οι δικοί τους αναπαραγωγικοί και δέχονται εγγραφές. Η ανάπτυξη ΕΕ (αν και μόνο τρία PoPs) έχει την ίδια συμπεριφορά.

Πώς Λειτουργεί

Ορισμένα από αυτά καλύπτονται στην προηγούμενη ενότητα, αλλά η σύντομη απάντηση είναι ότι είναι CRDT-lite. Δημιουργήσαμε μια proxy (σε Rust, γιατί φυσικά) που κάθεται μεταξύ της εφαρμογής και του Mongo και την κάνει πολυ-κύριο. Η proxy είναι σε γνώση των ομότιμων, διαχειρίζεται σημεία ελέγχου, αναπαραγωγή, παρακολούθηση και αρχική συγχρονισμό. Είναι μια πολυ-κύρια αντικατάσταση του συστήματος αναπαραγωγής του Mongo, συμπεριλαμβανομένων κάποιων DDL εντολών.

Η διαφορά από άλλα εργαλεία είναι ότι αυτό δεν παρακολουθεί το oplog. Η παρακολούθηση του oplog, ή η χρήση ροών αλλαγών, δεν θα λειτουργούσε, καθώς δείχνουν μόνο την τελική κατάσταση του αντικειμένου μετά την εγγραφή, καθιστώντας αδύνατον να διαχειριστείς συγκρούσεις. Πρέπει να καταγράφετε κάθε $set, $inc ενέργεια και να αναπαράγετε αυτήν την ενέργεια.

Αυτή είναι μια ειδική λύση για το domain. Δεν θα λειτουργούσε για όλα τα προϊόντα. Μπορείς να πεις ότι είναι σχεδίαση driven από το domain :). Λειτουργεί για εμάς επειδή από την αρχή πολύ προσεκτικά μόνο $set τα πεδία που αλλάζουμε σε έγγραφα - ποτέ δεν χρησιμοποιούμε το replaceOne του Mongo, για παράδειγμα. Το ίδιο και με τους μετρητές. Ποτέ δεν κάνετε SET VOTES = 5. Αντίθετα, θα γράφατε INCREMENT VOTES BY 5, καθώς αυτό επιτρέπει τελική συνέπεια. Οι κατανεμημένοι αποκλεισμοί διαχειρίζονται με να τους αποφεύγουμε εντελώς. Μόνο ένας κόμβος ανά συμπλέγμα έχει μια σημαία ρυθμισμένη για να τρέχει crons. Αν και αυτό μπορεί να φαίνεται περιορισμένο, μπορούμε να αγοράσουμε διακομιστές με τεραμπάιτ RAM, οπότε μπορούμε να κάνουμε αυτόν τον συμβιβασμό για να μειώσουμε τον κίνδυνο και την πολυπλοκότητα.

Ανάγνωση των Δικών σας Εγγραφών

Για τους προγραμματιστές που χρησιμοποιούν το API, θα πρέπει να μπορείτε να διαβάσετε τις δικές σας εγγραφές όπως πριν (κάντε μια κλήση API για να δημιουργήσετε ένα σχόλιο, στη συνέχεια καταγράψτε σχόλια και δείτε την νέα εγγραφή σε αυτή τη λίστα). Η προειδοποίηση είναι ότι δεν μπορείτε να το κάνετε αυτό μεταξύ περιοχών. Εάν το backend σας λειτουργεί μόνο σε μία περιοχή, όπως οι Η.Π.Α.-Δύση, τότε θα πρέπει να μπορείτε να διαβάσετε τις δικές σας εγγραφές εκτός από την περίπτωση που μεταξύ της εγγραφής σας και της ανάγνωσής σας, αυτός ο κόμβος καταρρεύσει και η cache DNS σας ενημερωθεί για να δείξει τον επόμενο πλησιέστερο κόμβο. Εφόσον δεν συμβεί αυτό, η ανάγνωση των δικών σας εγγραφών είναι αξιόπιστη.

Δοκιμές & Η Μετανάστευση

Περίπου το μισό κώδικα του συστήματος είναι το test harness, το framework και οι δοκιμές. Ωστόσο, η κυκλοφορία ήταν λίγο ανώμαλη, απαιτώντας περισσότερο χρόνο διακοπής (1 ώρα για ΕΕ και 20 λεπτά για παγκόσμια ΗΠΑ) από ότι επιθυμούσαμε, αλλά είμαστε ευτυχείς που περάσαμε αυτό το ορόσημο και σας ευχαριστούμε για την υπομονή σας!

Σε Συμπέρασμα & Τι Σημαίνει Αυτό για Εσάς

Το FastComments θα πρέπει τώρα να είναι ταχύτερο και πιο ανθεκτικό από ποτέ, και τώρα μπορούμε να επιστρέψουμε στη δουλειά για νέες δυνατότητες :)

Στην υγειά σας!