Πίνακας περιεχομένων[Κρύβω][Προβολή]
Το Instagram Feed είναι μια πλατφόρμα για κοινή χρήση και σύνδεση με άτομα και πράγματα που έχουν σημασία για εσάς. Όταν ανοίγετε το Instagram ή ανανεώνετε τη ροή σας, οι φωτογραφίες και τα βίντεο που πιστεύουμε ότι θα σας ενδιαφέρουν θα εμφανίζονται στην κορυφή.
Η ροή ειδήσεων είναι μια συλλογή στοιχείων που περιέχουν κείμενο, εικόνες ή βίντεο που έχουν δημιουργηθεί από άλλες οντότητες του συστήματος που προορίζονται για ανάγνωση. Αλλάζει πάντα, ενώ άλλοι οργανισμοί κάνουν νέες αναρτήσεις.
Σε αυτήν την ανάρτηση, θα εξετάσουμε προσεκτικά τον σχεδιασμό του συστήματος της ροής δεδομένων του Instagram. Λοιπόν, ας ξεκινήσουμε.
1. Απαιτήσεις
Λειτουργική αναγκαιότητα
- Η ροή ειδήσεων του χρήστη δημιουργείται από αναρτήσεις από άλλες οντότητες του συστήματος που ο χρήστης έχει ακολουθήσει ή ενδιαφέρεται για.
- Κείμενο, εικόνες και βίντεο βρίσκονται όλα σε αναρτήσεις.
- Η ροή ειδήσεων του χρήστη θα πρέπει να ενημερώνεται με νέες δημοσιεύσεις που δημιουργούνται από άλλους.
Μη λειτουργικό κριτήριο
- Η δημιουργία ειδήσεων θα πρέπει να πραγματοποιείται σε πραγματικό χρόνο. Ο τελικός χρήστης θα πρέπει να έχει μόνο 12 δευτερόλεπτα καθυστέρηση.
- Προσάρτηση νέας ανάρτησης: Δεν θα χρειαστούν περισσότερα από 5 δευτερόλεπτα για να εμφανιστεί μια νέα ανάρτηση σε ένα αίτημα τροφοδοσίας ειδήσεων μετά την υποβολή της στο σύστημα.
2. Εκτίμηση χωρητικότητας
- Από τον Μάρτιο του 2021, ο παγκόσμιος πληθυσμός είναι μόλις 7.8 δισεκατομμύρια άνθρωποι. Δείχνει ότι το 21% του παγκόσμιου πληθυσμού είναι Facebook DAU (Daily Active User) και το 32% είναι Facebook MAU (Monthly Active User) (Monthly Active User). Είναι εκπληκτικό.
- Ας υποθέσουμε ότι το σύστημα που κατασκευάζουμε έχει 1 δισεκατομμύριο DAU για να διευκολύνουμε τα πράγματα.
- Ας υποθέσουμε ότι ένα άτομο ακολουθεί 500 άτομα ή επιχειρήσεις στο Facebook. Μια ομάδα ή μια σελίδα μπορεί να θεωρηθεί οντότητα.
Εκτιμώμενη κίνηση
Ας υποθέσουμε ότι ένας χρήστης κατεβάζει τη ροή ειδήσεων 10 φορές κάθε μέρα κατά μέσο όρο. Έτσι, είναι περίπου 116 QPS και 1e10 αιτήματα κάθε μέρα.
Εκτιμήσεις αποθήκευσης
Ας υποθέσουμε ότι διατηρούμε στη μνήμη 500 αναρτήσεις από τη ροή ειδήσεων κάθε χρήστη κατά μέσο όρο για γρήγορη ανάκτηση και κάθε ανάρτηση έχει μέγεθος 1 KB. Άρα 500 KB ανά χρήστη, 500 TB για όλα τα DAU και 5000 υπολογιστές με 100 GB RAM ο καθένας.
3. API για συστήματα
userId (GUID): ο χρήστης του οποίου η ροή ειδήσεων λαμβάνεται.
Τα ακόλουθα πεδία είναι διαθέσιμα στην παράμετρο προαιρετικών επιλογών:
- afterPostId (GUID): λάβετε τη ροή ειδήσεων από την ανάρτηση που ακολουθεί. Εάν δεν προσδιορίζεται, λάβετε τις πιο πρόσφατες αναρτήσεις.
- count (αριθμός): ο μέγιστος αριθμός αναρτήσεων που μπορεί να επιστρέψει κάθε αίτημα. Το backend ορίζει έναν προεπιλεγμένο μέγιστο αριθμό εάν δεν παρέχεται κανένας.
- excludeReplies (boolean): αποτρέπει τη συμπερίληψη των απαντήσεων στη ροή ειδήσεων.
- Το JSON που επιστράφηκε περιέχει μια λίστα με στοιχεία ροής ειδήσεων.
4. Σχεδιασμός Βάσης Δεδομένων
Φορείς
- Χρήστες
- Το entityId, το όνομα, η περιγραφή και η χρονική σήμανση είναι όλα υποχρεωτικά πεδία.
- Απαιτούνται τα ακόλουθα πεδία: PostId, τίτλος, κείμενο, authorId και timestamp.
- timestamp, url και mediaId
Σχέσεις
- Άλλοι χρήστες ή οντότητες μπορούν να ακολουθούνται από έναν χρήστη. (m:n)
- Συγγραφέας-Δημοσίευση: Τόσο οι χρήστες όσο και οι οντότητες μπορούν να δημιουργήσουν αναρτήσεις. Ας υποθέσουμε ότι μόνο οι χρήστες μπορούν να δημιουργούν Αναρτήσεις για λόγους απλότητας. (1:n; Το authorId είναι ενσωματωμένο).
- Κάθε ανάρτηση συνοδεύεται από κάποια μορφή μέσων. (1:n)
5. Σχεδιασμός υψηλού επιπέδου
Αρχιτεκτονική
Ροές εργασίας
Παραγωγή ζωοτροφών
Όταν ο Jay ζητήσει τη ροή ειδήσεων της, το σύστημα θα κάνει τα εξής:
- Ανακτήστε τις ταυτότητες όλων των ανθρώπων και των πραγμάτων που ακολουθεί ο Τζέι.
- Συγκεντρωτικές αναρτήσεις: δεδομένων αυτών των αναγνωριστικών, αποκτήστε τις πιο πρόσφατες, δημοφιλείς και σχετικές αναρτήσεις.
- Κατατάξτε τις αναρτήσεις σύμφωνα με τη συνάφειά τους και το χρόνο τους.
- Προσωρινή μνήμη: αποθηκεύστε τις δημιουργημένες ροές και στείλτε στον Jay τις 20 κορυφαίες αναρτήσεις.
- Όταν ο Jay ολοκληρώσει την ανάγνωση των πρώτων 20 αναρτήσεων, αποστέλλεται ένα άλλο αίτημα για λήψη των επόμενων 20 αναρτήσεων.
Διανομή ζωοτροφών
Ας υποθέσουμε ότι ο Jay ακολουθεί τον Aayush και ότι ο Aayush δημοσιεύει οτιδήποτε νέο. Η ροή ειδήσεων του Jay θα πρέπει να ενημερωθεί από το σύστημα:
- Ανακτήστε τα ID των οπαδών του Aayush.
- Προσθήκη νέων άρθρων: Προσθέστε την ανάρτηση του Aayush στη δεξαμενή ειδήσεων των ακολούθων αυτών των αναγνωριστικών.
- Κατατάξτε τις αναρτήσεις σύμφωνα με τη συνάφειά τους και το χρόνο τους.
- Ενημερώστε τη μνήμη cache της ανάρτησης κατάταξης.
- Οι ακόλουθοι θα πρέπει να ειδοποιούνται όταν δημοσιεύονται νέες αναρτήσεις.
εξαρτήματα
Οι συνδέσεις των χρηστών διατηρούνται από διακομιστές ιστού.
Οι διαδικασίες που αναφέρονται παραπάνω εκτελούνται από τον διακομιστή εφαρμογών.
Προσωρινή μνήμη και βάση δεδομένων:
- Σχεσιακή βάση δεδομένων χρήστη/οντότητα
- Σχεσιακή βάση δεδομένων (ανάρτηση)
- Χαρακτηριστικό εικόνας/βίντεο: Aayush storge
- Μεταδεδομένα σχεσιακής βάσης δεδομένων
Εξατομικευμένες υπηρεσίες:
- Παραγωγή ζωοτροφών
- Ειδοποίηση ροών
6. Λεπτομερής Σχεδιασμός
Δημιουργία ζωοτροφών
Fan-out ανάγνωση αφελής υλοποίηση:
Τα προβλήματα με αυτήν την ακατάλληλη εφαρμογή περιλαμβάνουν:
- Οι χρήστες με μεγάλο αριθμό φίλων/ακολούθων θα παρατηρήσουν σημαντική επιβράδυνση, καθώς πρέπει να κοσκινίσουμε, να συγχωνεύσουμε και να ταξινομήσουμε μεγάλο αριθμό αναρτήσεων.
- Όταν ένας χρήστης φορτώνει τη σελίδα του, κατασκευάζουμε τη γραμμή χρόνου. Αυτό μπορεί να είναι αργό και να έχει μεγάλη καθυστέρηση.
- Κάθε ενημέρωση κατάστασης θα έχει ως αποτέλεσμα ενημερώσεις ροής για όλους τους ακόλουθους για ζωντανές ενημερώσεις. Αυτό μπορεί να προκαλέσει σημαντικές καθυστερήσεις στην υπηρεσία δημιουργίας ειδήσεων.
Μπορούμε να δημιουργήσουμε εκ των προτέρων τη χρονολογία και να την αποθηκεύσουμε στη μνήμη για να αυξήσουμε την απόδοση.
Παραγωγή εκτός σύνδεσης (Εγγραφή Fan-out)
Μπορούμε να έχουμε αποκλειστικούς διακομιστές που δημιουργούν και αποθηκεύουν συνεχώς τις ειδήσεις των χρηστών στη μνήμη. Μπορούμε απλώς να παραδώσουμε τη ροή ειδήσεων από την προ-δημιουργημένη, αποθηκευμένη τοποθεσία όποτε το θέλει κάποιος χρήστης.
Πόσα στοιχεία ροής πρέπει να αποθηκεύονται στη μνήμη η ροή ενός χρήστη;
Προσαρμόστε με βάση τη συμπεριφορά χρήσης σας.
Πρέπει να δημιουργήσουμε μια ροή ειδήσεων για όλους τους χρήστες (και να τη διατηρήσουμε στη μνήμη);
- Για άτομα που δεν συνδέονται πολύ συχνά.
- Η προσωρινή αποθήκευση βάσει LRU είναι μια απλή προσέγγιση.
- Μια καλύτερη λύση είναι να καταλάβετε πώς συνδέονται οι χρήστες. Πότε είναι; Για ποιες καθημερινές μιλάς;
Δημοσίευση ζωοτροφών
Το Fanout είναι η διαδικασία αποστολής μιας ανάρτησης σε όλους τους ακόλουθούς σας.
Fanout ανάγνωση (έλξη)
Όταν ζητάτε μια ροή ειδήσεων, το σύστημα λαμβάνει ένα αίτημα ανάγνωσης. Η ανάγνωση του Fanout στέλνει ένα αίτημα ανάγνωσης σε όλους τους ακόλουθούς σας, ζητώντας τους να διαβάσουν το περιεχόμενό τους.
Πλεονεκτήματα:
- Η διαδικασία γραφής είναι φθηνή.
- Κατά την ανάγνωση δεδομένων, είναι ευκολότερο να χρησιμοποιείτε διάφορους αλγόριθμους συγκέντρωσης.
Μειονεκτήματα:
- Για ένα άτομο με πολλούς ακόλουθους, η λειτουργία ανάγνωσης είναι μάλλον ακριβή.
- Οι χρήστες δεν θα δουν νέα δεδομένα μέχρι να τα τραβήξουν.
- Όταν τραβάμε για να φέρουμε τις πιο πρόσφατες δημοσιεύσεις σε τακτική βάση, είναι δύσκολο να βρούμε τον κατάλληλο ρυθμό έλξης και τα περισσότερα αιτήματα έλξης θα επιστρέψουν μια κενή απάντηση, σπαταλώντας πόρους.
Fanout εγγραφή (ώθηση)
Ένα αίτημα εγγραφής υποβάλλεται στο σύστημα όταν στέλνετε μια νέα ανάρτηση. Το αίτημα εγγραφής αποστέλλεται σε όλους τους ακόλουθούς σας για να ενημερώσουν το newsfeed τους χρησιμοποιώντας fanout εγγραφή.
Pro
- Η διαδικασία ανάγνωσης είναι φθηνή.
με
- Για έναν χρήστη με εκατομμύρια ακόλουθους, το γράφω η διαδικασία είναι πολύ ακριβή.
Η κατάταξη της ροής
Αντί απλώς να ταξινομούν τις ροές με χρονολογική σειρά, οι σημερινοί αλγόριθμοι κατάταξης προσπαθούν επιπλέον να εγγυηθούν ότι τα στοιχεία με μεγαλύτερη συνάφεια έχουν προτεραιότητα.
- Επιλέξτε παράγοντες που μπορούν να σας βοηθήσουν να αποφασίσετε τη συνάφεια ενός στοιχείου ροής, όπως ο αριθμός των επισημάνσεων "μου αρέσει", τα σχόλια και οι κοινοποιήσεις, ο χρόνος τελευταίας ενημέρωσης του στοιχείου εάν το άρθρο περιέχει φωτογραφίες ή βίντεο κ.λπ.
- Υπολογίστε τη βαθμολογία με βάση τα χαρακτηριστικά.
- Χρησιμοποιήστε τη βαθμολογία για να ταξινομήσετε τις δημοσιεύσεις.
Ρυθμίστε KPI, όπως διατήρηση χρηστών, έσοδα από διαφημίσεις κ.λπ., για να δείτε πόσο αποτελεσματικό είναι το σύστημα κατάταξής μας.
Συμπέρασμα
Παρά το γεγονός ότι το Instagram ή η μητρική του επιχείρηση Facebook είναι μια τεράστια εταιρεία, έχει καλύτερη κατανόηση σχεδιασμός συστήματος.
Προσπάθησα ό,τι μπορούσα για να σας παρέχω μια περίληψη υψηλού επιπέδου της ροής του Instagram.
Ελπίζω ότι ήταν χρήσιμο και ότι θα το χρησιμοποιήσετε σωστά.
Αφήστε μια απάντηση