FastComments.com Blog

Sun Mar 29 2026
...

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

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

Τι Νέο

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

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

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

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

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

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

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

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

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

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

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

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

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

Ανάγνωση των Ιδίων σας Γραφών

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

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

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

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

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

Ευχαριστώ!