FastComments.com Blog

Sun Mar 29 2026
...

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

! Αυτό το Άρθρο Περιέχει Τεχνικούς Όρους

Τι Νέα

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

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

Κάποια Ιστορία, Γιατί Η Αλλαγή

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

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

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

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

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

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

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

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

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

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

Ανάγνωση Εγγραφών Σας

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

Μπορείτε επίσης να καθορίσετε ποιο σημείο παρουσία θα προσπελάσετε. Περισσότερες πληροφορίες εδώ.

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

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

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

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

Η υγεία σας!