FastComments.com Blog

Wed Sep 10 2025
...

Το FastComments Είμαι Τώρα Παγκοσμίως Διανεμημένο

Τι Νέο

Προηγουμένως, το FastComments είχε μια πολύ παραδοσιακή αρχιτεκτονική για μια web εφαρμογή. Είχαμε τους servers εφαρμογής μας, βάσεις δεδομένων και μερικές άλλες υπηρεσίες. Αυτό ήταν διπλασιασμένο σε δύο περιοχές (us-west και eu). Αν ήσασταν στη Γαλλία και θέλατε να δείτε μια σειρά σχολίων για έναν πελάτη που φιλοξενείται στο παγκόσμιο κέντρο δεδομένων μας, τα αιτήματά σας θα έπρεπε να φτάσουν μέχρι το us-west για τα δεδομένα σχολίων.

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

Πώς Λειτουργούσε Παλιότερα

Εκτός από τις βάσεις δεδομένων που είχαν πολλές ζωντανές αναπαραγωγές σε διάφορες περιοχές και παρόχους cloud, όλες οι υπηρεσίες ήταν αναπτυχθεί σε μία μόνο εικόνα ανά τύπο υπηρεσίας. Αυτό σημαίνει ότι για κάθε περιοχή είχαμε έναν server εφαρμογής, έναν server pubsub και έναν server πολυμέσων. Το σχέδιο ήταν να κλιμακώσουμε κατακόρυφα όσο μπορούσαμε καθώς αυτό διατηρούσε τα πράγματα απλά. Η συγγραφή κώδικα ήταν εύκολη - πάντα γνωρίζατε ότι μπορείτε να "διαβάσετε τις δικές σας εγγραφές" όταν χτυπάτε τη βάση δεδομένων. Η υποδομή ήταν εύκολη, με την εξαίρεση των ενημερώσεων ασφαλείας που θα απαιτούσαν ένα λεπτό downtime.

Το Πρόβλημα

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

Αυτό άρχισε να γίνεται υπερβολικά δαπανηρό στο Linode, όπου μια εικόνα $144 είναι περίπου ισοδύναμη, βάσει των δοκιμών μας κατά του passmark, με έναν κόμβο $20 OVH, και ακόμη και αν αλλάξαμε παρόχους φιλοξενίας θα είχαμε μοναδικά σημεία αποτυχίας σε όλη την περιοχή - και πάροχοι όπως η OVH τείνουν να έχουν μεγαλύτερους χρόνους αποκατάστασης από το Linode για προβλήματα συντήρησης.

RiR :)

Για τα αρχικά χρόνια, οι υπηρεσίες PubSub και Media στο FastComments γράφτηκαν σε Java. Η Java επιλέχθηκε επειδή προσφέρει σχετικά υψηλή απόδοση για την προσπάθεια που καταβάλλεται, και μετά από χρόνια ρύθμισης του GC, δοκιμάζοντας G1GC, Shenandoah και Z1, αποφασίσαμε να μην χρησιμοποιούμε πλέον Java. Η υπερβολική κατανάλωση μνήμης ήταν απλώς πολύ μεγάλη και εφόσον αυτές οι υπηρεσίες παραμένουν πολύ στατικές μόλις ολοκληρωθούν, τα οφέλη της Java φθίνουν. Επίσης, αυτές οι υπηρεσίες είχαν να αντιμετωπίσουν το πρόβλημα του "thundering herd", που σήμαινε ότι η JVM προσπαθούσε να διαχειριστεί την αιχμή της κυκλοφορίας όταν η JIT δεν είχε καν ξεκινήσει. Αυτές οι υπηρεσίες ήταν βασικοί υποψήφιοι για μετάβαση σε C++ ή Rust.

Η Rust επιλέχθηκε καθώς δεν είμαστε ειδικοί σε C++ και ένα λάθος στον κωδικό του δικτύου θα μπορούσε να εκθέσει τα δεδομένα ενός πελάτη σε άλλον. Η Rust μας βοηθά να αποτρέψουμε αυτούς τους τύπους προβλημάτων.

Ήθελαμε να ενοποιήσουμε αυτές τις υπηρεσίες έτσι κι αλλιώς, οπότε ενώ θα μπορούσαμε να κάνουμε άλλη μια αναβάθμιση βελτιώνοντάς τις ίσως με την GraalVM, αποφασίσαμε να μετακινηθούμε στη Rust και να το τελειώσουμε.

Η μετανάστευση δεν ήταν χωρίς προβλήματα. Αυτές οι υπηρεσίες πρέπει να τερματίζουν SSL, να υποστηρίζουν HTTP 1.1, HTTP/2, και ούτω καθεξής. Κάνουν πράγματα όπως η διαχείριση πολλών ροών δεδομένων ταυτόχρονα, διαβάζοντας μέσα από ένα on-disk lru cache, S3, βάσεις δεδομένων, και επικοινωνώντας σε ένα mesh. Το οικοσύστημα Java, Vertx και Netty, ήταν πολύ καλό για αυτά τα πράγματα. Πιέζουμε το οικοσύστημα βιβλιοθηκών στα όριά του, και το γεγονός ότι δεν έχουμε πολύ εμπειρία με τις βιβλιοθήκες Rust σήμαινε ότι είχαμε μερικά δοκιμαστικά λάθη. Αυτό προκάλεσε κάποια downtime, και ζητούμε συγγνώμη γι' αυτό.

Επίσης πειραματιστήκαμε με διαφορετικούς διαχειριστές μνήμης, καταλήγοντας στο mimalloc για τους προσαρμοσμένους servers DNS και libc για το μεταφορικό επίπεδο. Δεν τρέχουμε Nginx ή Apache, αντίθετα χρησιμοποιούμε τον δικό μας συνδυασμό ενός προσαρμοσμένου DNS server που δρομολογεί τους πελάτες παγκοσμίως βασισμένο σε έναν in-memory δείκτη που κατασκευάζεται εβδομαδιαία από τη Maxmind και το μεταφορικό επίπεδο σε Rust που διατηρεί ένα mesh με τις άλλες μεταφορές. Η μεταφορά τερματίζει το SSL, χειρίζεται τη δουλειά pubsub και είναι το CDN μας. Το πλεονέκτημα αυτού είναι λιγότερη υπερβολική εργασία κατά τη μετακίνηση πραγμάτων μεταξύ υπηρεσιών, και λιγότερη υπερβολική εργασία/αφαίρεση υποδομής. Το μειονέκτημα είναι η ορατότητα, επομένως τα καλά metrics είναι σημαντικά.

Σχετικά με την προκύπτουσα απόδοση, οι υπηρεσίες Rust χρησιμοποίησαν περίπου το 10-30% της μνήμης εκείνων της Java, παρά όλη μας τη δουλειά. Διαβάζω βιβλία όπως το Java Concurrency in Practice για διασκέδαση, οπότε ενώ δεν είμαι ειδικός γνωρίζω λίγα πράγματα για το πώς να γράφω γρήγορες υπηρεσίες JVM, και ήταν πολύ πιο εύκολο να το πετύχω αυτό με τη Rust. Επιπλέον, οι κορυφές μηνυμάτων σε μεγάλο αριθμό συνδρομητών barely register στην κατανάλωση CPU όταν οι υπηρεσίες JVM ξόδευαν το 40% του χρόνου τους σε GC, παρά το γεγονός ότι γράφαμε τον κώδικα μας πιο σαν μια μηχανή παιχνιδιών και λιγότερο σαν τον τυπικό server. Δεν μπορώ να πω ότι είμαι φανατικός θαυμαστής της Rust, αλλά για υπηρεσίες που κάνουν πολύ έργο και δεν αλλάζουν πολύ μετά την αρχική ανάπτυξη, είναι τέλεια. Η κύρια επιχειρησιακή λογική μας παραμένει σε TypeScript.

Η Νέα Αρχιτεκτονική

Η νέα αρχιτεκτονική δεν έχει πια "κατοικίδια" κόμβους. Αντίθετα, κάθε server είναι ένας πλήρης κλώνος με όλες τις ίδιες υπηρεσίες και σχεδόν ταυτόσημες ρυθμίσεις. Κάθε ένας τρέχει το μεταφορέα, το DNS, τον server εφαρμογής, και ένα αντίγραφο της βάσης δεδομένων. Όλοι οι κόμβοι διατηρούν Κρυπτογράφηση Ολικής Δισκομόρφωσης με αυτόματη απελευθέρωση με το Dropbear.

Κάθε server τρέχει το routing transport που τερματίζει τα αιτήματα και τα διαχειρίζεται είτε ως websocket, http stream, ή αίτημα cdn. Αυτοί οι servers συνδέονται μεταξύ τους και οποιοσδήποτε παρέχει ένα χάρτη του παγκόσμιου δικτύου στο τοπικό DNS server του για να ενημερώσει το DNS σε πραγματικό χρόνο πού είναι κάθε ζωντανός κόμβος παγκοσμίως.

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

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

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

Μπορούμε επίσης να επιλέξουμε χειροκίνητα υλικό, το οποίο είναι διασκεδαστικό και ανταποδοτικό. Οι νέοι servers είναι ένα μείγμα i5-13500 και Ryzen 5 5600X, και η ΕΕ τρέχει σε ορισμένους παλαιότερους Xeons. Στις μετρήσεις μας, όλοι αυτοί ήταν πολύ πιο γρήγοροι από τους πιο ακριβούς servers που εξερευνούσαμε σε άλλους παρόχους. Το μειονέκτημα είναι περισσότερη εργασία ρύθμισης, αλλά το έχουμε αυτοματοποιήσει, μαζί με την παρακολούθηση SMART δίσκων για αποτυχίες και ούτω καθεξής.

Κάνοντας αυτούς τους τύπους πραγμάτων μπορούμε να συνεχίσουμε να προσφέρουμε ανταγωνιστικές τιμές.

Η Διάθεση

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

Κατά την αρχική διάθεση, τα metrics μας έδειξαν αύξηση στα αιτήματα που διαρκούσαν > 100ms. Προσπαθούμε να μην έχουμε πολλά αιτήματα που διαρκούν τόσο πολύ για οτιδήποτε.

Σταδιακή Πρόοδος
Αργά Αιτήματα

Ακόμα κάνουμε σταδιακή πρόοδο βελτιώνοντας την απόδοση για ορισμένες περιοχές. Ευχαριστούμε όλους όσους έχουν παρέχει ανατροφοδότηση μέχρι τώρα.

Σκέψεις Κατά τη Χρήση Του API

Το API παραμένει ισχυρά συνεπές - μπορείτε να διαβάσετε τις δικές σας εγγραφές - για να διατηρήσουμε την οπισθογεωγραφική συμβατότητα και να διευκολύνουμε τα πράγματα για τους προγραμματιστές. Για να επιτρέψουμε στους προγραμματιστές να επιλέγουν την απόδοση πάνω από την συνάφεια, σχεδιάζουμε να εκθέσουμε την παράμετρο readPreference. Το όφελος είναι ότι μπορούμε επίσης να προσφέρουμε έκπτωση σε μονάδες για αυτές τις κλήσεις API.

Όλοι οι δημόσιοι τελικοί σημεία, όπως για την υπηρεσία του δημόσιου widget σχολίων, διαβάζουν πάντα από τη πλησιέστερη (τοπική) βάση δεδομένων σε αυτόν τον κόμβο.

Γιατί Όχι Απλώς Να Χρησιμοποιήσουμε Ένα Κανονικό CDN

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

Τέλος, ο τύπος "προοδευτικής ενίσχυσης" όπου τα δυναμικά δεδομένα χαρτογραφούνται στα στατικά δεδομένα από το CDN σας δίνει μια κακή εμπειρία όπου το περιεχόμενο πηγαίνει πάνω-κάτω ή αλλάζει μετά από μερικά δευτερόλεπτα. Προτιμούμε να μην το κάνουμε αυτό.

Ποιος Έχει Τά Δεδομένα Μου Τώρα

Τα δεδομένα σας δεν αποθηκεύονται πια στο Linode. Έχουν αναπαραχθεί ζωντανά μεταξύ Hetzner και OVH με πλήρη κρυπτογράφηση δίσκου, και όλη η επικοινωνία μεταξύ των backend servers γίνεται με TLS. Διατηρούμε μερικές κληρονομικές αναπαραγωγές Linode για εξωτερικούς proxy webhook, αλλά κανένα δεδομένο ή πολυμέσο δεν παραμένει αποθηκευμένο στο Linode.

Εν Κατακλείδι

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