Χρησιμοποιεί το Whatsapp RabbitMQ
Χρησιμοποιεί το Whatsapp RabbitMQ
Το RabbitMQ είναι χτισμένο Ερλάγκ Γενική χρήση της γλώσσας προγραμματισμού και χρησιμοποιείται επίσης από το WhatsApp για μηνύματα.
Περίληψη
Το Whatsapp χρησιμοποιεί το RabbitMQ, το οποίο είναι χτισμένο στο Erlang, ως ουρά μηνυμάτων για παράδοση μηνυμάτων.
Κατά το σχεδιασμό ενός συστήματος συνομιλίας σε πραγματικό χρόνο, είναι σημαντικό να εξεταστεί η ουρά που χρησιμοποιείται από τις δημοφιλείς πλατφόρμες μηνυμάτων όπως το WhatsApp και το Facebook Messenger. Παρόλο που μπορεί να φαίνεται λογικό να έχουμε μια ουρά ανά άτομο ή Kafka-Topic για κάθε χρήστη, δεδομένου των δισεκατομμυρίων χρηστών σε αυτές τις πλατφόρμες, αυτή η προσέγγιση θα απαιτούσε έναν μη πρακτικό αριθμό ουρών ή θεμάτων. Ωστόσο, έχει παρατηρηθεί ότι το WhatsApp και το Facebook Messenger χρησιμοποιούν μια ουρά που ονομάζεται “Iris” (παρόμοια με την Kafka) για παράδοση μηνυμάτων.
Υπάρχουν εσωτερικά συστήματα που πληρούν τις βάσεις δεδομένων (όπως το HBase και το MyRocks) από την ουρά μηνυμάτων, αλλά αυτές οι βάσεις δεδομένων δεν είναι το κύριο σύστημα παράδοσης.
Ερωτήσεις και απαντήσεις
1. Τι είναι το RabbitMQ χτισμένο?
Το RabbitMQ είναι χτισμένο στη γλώσσα προγραμματισμού γενικής χρήσης Erlang.
2. Πώς χρησιμοποιεί το Whatsapp RabbitMQ?
Το Whatsapp χρησιμοποιεί το RabbitMQ ως ουρά μηνυμάτων για την παράδοση μηνυμάτων.
3. Ποιος είναι ο σκοπός μιας ουράς μηνυμάτων?
Μια ουρά μηνυμάτων χρησιμοποιείται για την αποσύνδεση των συστατικών ενός συστήματος, επιτρέποντας την αποστολή μηνυμάτων μεταξύ τους ασύγχρονα.
4. Μπορεί να χρησιμοποιηθεί μια ουρά ανά άτομο για παράδοση μηνυμάτων στο WhatsApp ή στο Facebook Messenger?
Ενώ μια ουρά ανά άτομο μπορεί να φαίνεται λογική, θα απαιτούσε έναν μη πρακτικό αριθμό ουρών που δίνουν τα δισεκατομμύρια χρήστες σε αυτές τις πλατφόρμες.
5. Ποια ουρά χρησιμοποιείται από το WhatsApp και το Facebook Messenger για παράδοση μηνυμάτων?
Το Whatsapp και το Facebook Messenger χρησιμοποιούν μια ουρά που ονομάζεται “Iris” για παράδοση μηνυμάτων. Το “Iris” είναι παρόμοιο με το Kafka.
6. Ποιες είναι μερικές από τις βάσεις δεδομένων που χρησιμοποιούνται από το WhatsApp για την αποθήκευση μηνυμάτων?
Το Whatsapp χρησιμοποιεί βάσεις δεδομένων όπως το HBase και το MyRocks για την αποθήκευση μηνυμάτων. Αυτές οι βάσεις δεδομένων συμπληρώνονται από την ουρά μηνυμάτων.
7. Είναι το RabbitMQ το κύριο σύστημα παράδοσης για το WhatsApp?
Όχι, το RabbitMQ δεν είναι το κύριο σύστημα παράδοσης για το WhatsApp. Χρησιμοποιείται ως ουρά μηνυμάτων για παράδοση μηνυμάτων.
8. Είναι παράδοση μηνυμάτων στο WhatsApp και το Facebook Messenger σύγχρονο ή ασύγχρονο?
Η παράδοση μηνυμάτων στο WhatsApp και το Facebook Messenger είναι ασύγχρονο, που σημαίνει ότι τα μηνύματα αποστέλλονται και λαμβάνονται ανεξάρτητα μεταξύ τους.
9. Ποια είναι τα οφέλη από τη χρήση μιας ουράς μηνυμάτων όπως το RabbitMQ?
Η χρήση μιας ουράς μηνυμάτων, όπως το RabbitMQ.
10. Μπορεί το RabbitMQ να χειριστεί μεγάλους όγκους μηνυμάτων?
Ναι, το RabbitMQ έχει σχεδιαστεί για να χειρίζεται μεγάλους όγκους μηνυμάτων και είναι σε θέση να τα παραδώσει αποτελεσματικά και αξιόπιστα.
11. Ποιες είναι οι εναλλακτικές λύσεις για το RabbitMQ για την εφαρμογή μιας ουράς μηνυμάτων?
Ορισμένες εναλλακτικές λύσεις για το RabbitMQ περιλαμβάνουν apache kafka, activeemq και ρεύματα redis.
12. Υπάρχουν περιορισμοί στη χρήση μιας ουράς μηνυμάτων όπως το RabbitMQ?
Μερικοί περιορισμοί χρήσης μιας ουράς μηνυμάτων όπως το RabbitMQ περιλαμβάνουν την ανάγκη να διαμορφώσετε σωστά και να το συντονίσετε για βέλτιστη απόδοση, πιθανή απώλεια μηνυμάτων εάν δεν διαμορφωθεί σωστά και η ανάγκη πρόσθετης υποδομής για την υποστήριξη της ουράς μηνυμάτων.
13. Μπορεί το RabbitMQ να χρησιμοποιηθεί για άλλους σκοπούς εκτός από τα μηνύματα?
Ναι, το RabbitMQ μπορεί να χρησιμοποιηθεί για άλλους σκοπούς εκτός από τα μηνύματα, όπως ο προγραμματισμός των εργασιών, οι αρχιτεκτονικές που βασίζονται σε γεγονότα και η ροή δεδομένων.
14. Η επιμονή μηνυμάτων του κουνελιού υποστηρίζει?
Ναι, το RabbitMQ υποστηρίζει την εμμονή του μηνύματος, επιτρέποντας την αποθήκευση και ανάκτηση μηνυμάτων ακόμη και σε περίπτωση αποτυχίας του συστήματος.
15. Πώς εξασφαλίζει η αξιοπιστία της RabbitMQ?
Το RabbitMQ εξασφαλίζει την αξιοπιστία παράδοσης μηνυμάτων μέσω χαρακτηριστικών όπως η επιβεβαίωση μηνυμάτων, ο εκδότης επιβεβαιώνει και η ανθεκτικότητα στην ουρά.
Χρησιμοποιεί το Whatsapp RabbitMQ
Το RabbitMQ είναι χτισμένο Ερλάγκ Γενική χρήση της γλώσσας προγραμματισμού και χρησιμοποιείται επίσης από το WhatsApp για μηνύματα.
Ουρά που χρησιμοποιείται σε whatsapp ή fb messenger
Ενώ σκέφτομαι μέσω ενός σχεδιασμού συστήματος για συνομιλία σε πραγματικό χρόνο, είμαι περίεργος τι είδους ουρά whatsapp ή fb messenger χρησιμοποιεί από την πλευρά του διακομιστή για να παραδώσει το μήνυμα στον παραλήπτη. Αυτό που σκέφτηκα ήταν ότι υπάρχει μια ουρά ανά άτομο/kafka-θέμα, οπότε όταν ένα νέο μήνυμα πρέπει να παραδοθεί στον χρήστη Α, το μήνυμα είναι enqueue στην ουρά του Α. Ωστόσο, ενδέχεται να υπάρχουν δισεκατομμύρια χρήστες (η FB έχει 2 δισεκατομμύρια χρήστες), αυτό σημαίνει ότι χρειαζόμαστε 2 δισεκατομμύρια ουρές/θέματα (σε όρο Kafka)? Εάν ναι, ποια ουρά μπορεί να το χειριστεί. Οποιοδήποτε σχόλιο είναι ευπρόσδεκτο! Ευχαριστώ!
ρώτησε 25 Ιουνίου 2019 στις 16:44
1,669 8 8 Χρυσά κονκάρδες 23 23 ασημένια κονκάρδες 37 37 χάλκινα κονκάρδες
Μπορείτε να βρείτε τεκμηρίωση ότι ο Messager χτίστηκε πάνω από το HBase, και τώρα MyRocks. Υπάρχουν εσωτερικά συστήματα που θα πληρώνουν αυτές τις βάσεις δεδομένων από μια ουρά, ναι, αλλά δεν είναι το κύριο σύστημα παράδοσης. κώδικας.FB.com/core-data/…
26 Ιουνίου 2019 στις 3:08
@cricket_007 Ευχαριστώ για τα σχόλια. Yeap, μοιάζει με το FB χρησιμοποιεί το Iris (Kafka Like) ως ουρά για παράδοση.
alifzl/yomkippur
Αυτή η δέσμευση δεν ανήκει σε κανένα υποκατάστημα σε αυτό το αποθετήριο και μπορεί να ανήκει σε ένα πιρούνι έξω από το αποθετήριο.
Διακόπτες/ετικέτες
Ετικέτες υποκαταστημάτων
Δεν μπορούσα να φορτώσω κλάδους
Τίποτα για εμφάνιση
Δεν μπορούσα να φορτώσω ετικέτες
Τίποτα για εμφάνιση
Όνομα ήδη χρησιμοποιείται
Υπάρχει ήδη μια ετικέτα με το παρεχόμενο όνομα κλάδου. Πολλές εντολές GIT δέχονται τόσο ονόματα ετικετών όσο και ονόματα υποκαταστημάτων, οπότε η δημιουργία αυτού του κλάδου μπορεί να προκαλέσει απροσδόκητη συμπεριφορά. Είστε βέβαιοι ότι θέλετε να δημιουργήσετε αυτό το υποκατάστημα?
Ακύρωση Δημιουργία
- Τοπικός
- Κωδικοποιητικοί χώροι
Https github cli
Χρησιμοποιήστε το git ή το checkout με το SVN χρησιμοποιώντας τη διεύθυνση URL Web.
Εργαστείτε γρήγορα με το επίσημο CLI μας. Μάθετε περισσότερα για το CLI.
Απαιτείται
Συνδεθείτε για να χρησιμοποιήσετε χώρους κωδικοποίησης.
Εκκίνηση της επιφάνειας εργασίας GitHub
Εάν δεν συμβεί τίποτα, κατεβάστε το GitHub Desktop και δοκιμάστε ξανά.
Εκκίνηση της επιφάνειας εργασίας GitHub
Εάν δεν συμβεί τίποτα, κατεβάστε το GitHub Desktop και δοκιμάστε ξανά.
Εκκίνηση Xcode
Εάν δεν συμβεί τίποτα, κατεβάστε το xcode και δοκιμάστε ξανά.
Εκκίνηση του κώδικα Visual Studio
Ο κωδικός σας θα ανοίξει μόλις έτοιμο.
Υπήρχε ένα πρόβλημα προετοιμασίας του κωδικοποιητικού χώρου σας, δοκιμάστε ξανά.
Τελευταία δέσμευση
Στατιστικά στοιχεία
Αρχεία
Αποτυχία φόρτωσης τελευταίων πληροφοριών δέσμευσης.
Τελευταίο μήνυμα δέσμευσης
Δεσμευμένος
Ανάγνωση.MD
Το Yom Kippur είναι ένα εργαλείο αυτοματισμού WhatsApp που στοχεύει να είναι μια συνεπής και μόνιμη λύση για τη μη εμπορική χρήση του WhatsApp ως αυτοματοποιημένο bot.
Τι κάνει?
- Αποστολή/λήψη ενός μηνύματος σε μια προκαθορισμένη εφαρμογή WhatsApp στο AVD (εικονική συσκευή Android)
- Δημιουργήστε λίστα επαφών στο AVD και χρησιμοποιήστε το για τα πράγματα αποστολής/λήψης
- Κυριολεκτικά μπορεί να κάνει τα πάντα με το AVD (δημιουργεί πολλές δυνατότητες για πείθει)
Στην πρώτη πρώτη, είδα τη μοναδική μου επιλογή, αλλά λόγω των προβλημάτων που αναφέρονται παρακάτω, άλλαξα το μυαλό μου για να το εφαρμόσω με άλλο τρόπο:
- Ποικιλία κοινοτικών θεμάτων (που συνδέονται εδώ)
- Το YOSUP είναι ασύγχρονο είδος API που αλληλεπιδρά με το WhatsApp Restapi, σχετικά με τις εκτιμήσεις υψηλής ασφάλειας του WhatsApp, ήρθε πολύ ευαίσθητη για τις παρούσες ενεργές συνεδρίες κάθε χρήστη και δεν θα είναι πολύ φιλικό με σύγχρονες λύσεις. (Όπως πιθανότατα γνωρίζετε τους περιορισμούς της χρήσης του web-view του WhatsApp που λέει ότι πρέπει να έχουμε μια συνεπή ενεργή σύνδεση στο Διαδίκτυο στο τηλέφωνο ταυτόχρονα)
- η τεμπελιά μου και επίσης προκαλώ τον εαυτό μου να το κάνω με τον σκληρό τρόπο
Λοιπόν, εξαρτήσεις σε αυτό το έργο, είναι μάλλον πολύ! Πρώτα από εσάς θα πρέπει να έχετε ικανοποιήσει αυτό το απαιτούμενο:
Οι εγκαταστάτες των Windows είναι αναδιαμορφωμένοι, αλλά μπορεί να προκαλέσει βλάβη στο Linux ή στο MacOS (και οι δύο δεν έχουν δοκιμαστεί)
Εξάρτηση | Περιγραφή / Λήψη συνδέσμων |
---|---|
Android Studio | Android Studio με Android API 28 |
ΙΑΒΑ | Java JDK 11 |
Mysql | Κοινότητα εγκατάστασης MySQL 8.X ή παραπάνω |
Python 2.7 | Python 2.7 |
Μίσχος | V1.10 ή παραπάνω |
Κουνέλι | Τελευταία έκδοση του RabbitMQ |
Ταχυδρόμος | Τελευταία έκδοση του Postman |
Σκέψεις: Μπορείτε να χρησιμοποιήσετε το conda virenv για το Python 2.7, αλλά μου έριξε έναν σοβαρό πονοκέφαλο (δεν συνιστάται)
Ο κύριος λόγος που χρησιμοποίησα το Python 2 για αυτό το έργο είναι ότι το Appium, το MySQL Connector Client και το RabbitMQ ήταν ασυμβίβαστες μαζί στην έκδοση 3.
Πρώτα απ ‘όλα, να είστε υπομονετικοί σε αυτό το μέρος. Μου χρειάστηκε αίμα και δάκρυα για να σκουπίσω τα σόδια εξάρτησης για να κάνω αυτό ένα τόσο απλό έργο.
1.Εικονική συσκευή Android
Luanch AVD Manager του Android Studio, Ρυθμίστε μια συσκευή με το Android 9.0 με API 28 (επιλέξτε και κατάλληλο όνομα για το AVD επειδή το χρειαζόμαστε σε περαιτέρω βήματα).
Παρατηρήστε ότι πρέπει να εγκαταστήσετε το WhatsApp μέσω του ίδιου του AVD, οπότε επιλέξτε την έκδοση που υποστηρίζεται από το PlayStore.
Ελέγξτε ότι έχετε αυτές τις μεταβλητές περιβάλλοντος στον λογαριασμό σας:
Μεταβλητό όνομα | Μεταβλητή αξία |
---|---|
Android_home | C: \ Users \ fzl \ appdata \ local \ android \ sdk |
Java_home | C: \ Program Files \ Java \ JDK-11.0.2 |
PythonPath | C: \ python27 · c: \ python27 \ lib \ site-packages · c: \ python27 \ lib · c: \ python27 \ dlls · c: \ python27 \ scripts |
Κηλίδα | C: \ python27 · c: \ python27 \ scripts · c: \ python27 \ lib \ site-packages · c: \ program files \ java \ jdk-11.0.2 · C: \ Program Files \ Java \ JDK-11.0.2 \ bin; |
Στη συνέχεια, θα πρέπει να ξεκινήσετε το AVD σας, να εγκαταστήσετε το WhatsApp σε αυτό και να εξουσιοδοτήσετε το ADB με τη συσκευή σας (υποχρεωτική)
Για να το κάνετε αυτό, θα πρέπει να εκτελέσετε συσκευές ADB ή ADB USB για να ελέγξετε την αυτοπεποίθηση του AVD.
ΝΤΟ:\ Uεδάφιο\ΦΑZl\ΕΝΑPPDATA\ΜΕΓΑΛΟόγκος\ΕΝΑμνημείο\ΜΙΚΡΟDK\ΠLATFORM-Tools: ADB Συσκευές Λίστα συσκευών Εξομαρωμένη συσκευή Emulator-5554
Εάν βλέπετε το μη εξουσιοδοτημένο αποτέλεσμα, θα πρέπει να ακολουθήσετε αυτόν τον σύνδεσμο.
2.Διαμόρφωση RabbitMQ
Μετά την εγκατάσταση του RaabitMQ, θα πρέπει να εκτελέσετε το RabbitMQ-Plugins να ενεργοποιήσετε το RabbitMQ_Management στον κατάλογο RabbitMQ SBIN για να ενεργοποιήσετε το web-gui της διαχείρισης RabbitMQ Sytem. Μπορεί να χρειαστεί η συγκράτηση της υπηρεσίας RabbitMQ.
Μετά από αυτό θα πρέπει να έχετε πρόσβαση στο RabbitMQ Web-Gui με http: // localhost: 15672/#/διεύθυνση στο τοπικό σας μηχάνημα. Εάν ναι, δημιουργήστε έναν νέο χρήστη με τις παρακάτω εντολές και κάντε τον διαχειριστή:
Κωδικός πρόσβασης ονόματος χρήστη RabbitMQCTL ADD_USER # Αυτό κάνει τον χρήστη έναν διαχειριστή Διαχειριστής ονόματος χρήστη RabbitMQCTL SET_USER_TAGS # Αυτό ορίζει δικαιώματα για τον χρήστη RabbitMqctl set_permissions -p / username «.*« «.*« «.*«
Συνδεθείτε με πρόσφατα δημιουργημένα διαπιστευτήρια και εισαγάγετε τις προδιαγραφές ουράς που είναι ήδη συνδεδεμένες σε αυτό το repo που ονομάζεται RabbitMQ_CONF.JSON στα τμήματα ορισμών εισαγωγής κάτω από την επισκόπηση Menue.
Θα δημιουργούσε τις απαραίτητες διαμορφώσεις για το RabbitMQ και θα επιτρέψει τα απαραίτητα προνόμια.
3.Μίσχος
Απλά εκτελέστε τον διακομιστή Appium με τις προεπιλεγμένες ρυθμίσεις. Appium–Default-Capabilities ” είναι ήδη ενσωματωμένη στον κώδικα. TL, DR: Δεν υπάρχει τίποτα να κάνουμε σε αυτό το βήμα.
4.Mysql
Εγκαταστήστε την κοινοτική έκδοση του MySQL, δημιουργήστε έναν κατάλληλο λογαριασμό DB και ρυθμίστε την υπηρεσία που εκτελείται αυτόματα όταν ξεκινά το λειτουργικό σύστημα.
5.Εγκαταστήστε τις εξαρτήσεις Python
Απλά εκτελέστε την εγκατάσταση PIP -R εξαρτήσεις.TXT για την επίλυση της εξάρτησης των χρησιμοποιημένων βιβλιοθηκών.
Μπορεί να αντιμετωπίσετε την εκδοχή της βιβλιοθήκης MySQLDB, η οποία μπορεί να επιλύσει αυτό και αυτό. Φροντίστε να εγκαταστήσετε το Python 2.x Έκδοση των αναφερόμενων βιβλιοθηκών.
6.Δημιουργία καταλόγων για τα αρχεία καταγραφής
Δημιουργήστε τους καταλόγους και τα αρχεία όπως αυτό’S που αναφέρεται παρακάτω:
# καταλόγων ΝΤΟ:\ vAR\μεγάλοOG [Κατάλογος] C:\ vAR\μεγάλοόγκος\ whatsapp_api [Κατάλογος] # αρχεία καταγραφής ΝΤΟ:\ vAR\μεγάλοόγκος\έναπι.Log C:\ vAR\μεγάλοόγκος\ whatsapp_single_consumer.Log C:\ vAR\μεγάλοόγκος\ whatsapp_single_worker.Log C:\ vAR\μεγάλοOG \
7.Ρυθμίστε το Yom Kippur’αρχείο διαμόρφωσης S
Μεταβείτε στο Yomkippur-Master \ Configs \ Config.CFG και εισάγετε τα ακόλουθα.
(Μην αλλάζετε τίποτα esle εκτός αν ξέρετε τι κάνετε)
[mysql] host = 127.0.0.1 Όνομα χρήστη ="Το όνομα χρήστη MySQL" Κωδικός πρόσβασης ="τον κωδικό πρόσβασης MySQL" Database = WhatsApp [RabbitMQ] IP = 127.0.0.1 ipqueuename = ipaddr.Όνομα χρήστη ουράς ="Το όνομα χρήστη RabbitMQ" Κωδικός πρόσβασης ="Ο κωδικός πρόσβασης RabbitMQ" [queue_name] single_message = whatsapp_singlemessage_queue broadcast_message = whatsapp_broadcastmessage_queue add_contact = whatsapp_newcontact_listener_queue listor_message = whatsapp_messagelistener_queue
Εκτελέστε το κύριο.py και add_new_contact_producer.PY σε δύο ξεχωριστό περιβάλλον τερματικού/cmd.
Εάν δεν είδατε κανένα σφάλμα, είστε καλό να πάτε.
- Βεβαιωθείτε ότι εκτελείται ο MySQL Server
- Βεβαιωθείτε ότι το RabbitMq Sever είναι runnig
- Εκτελέστε το Appium με ρυθμίσεις Defualt
- Εκτελέστε αυτά τα σενάρια
Python Main.py python add_new_contact_producer.py python single_message_producer.ΡΥ
- Εκτελέστε το Postman και δημιουργήστε επιθυμητές εντολές post από την παρακάτω λίστα:
Προσθήκη επαφής στην εφαρμογή Επαφών Google
Αποστολή ενιαίου μηνύματος μέσω του WhatsApp
Ανάπτυξη και συνεισφορά?
Θέλετε να συνεισφέρετε? Εξαιρετική! Μη διστάσετε να με χτυπήσετε σε ένα.fazeli95 [at] gmail [dot] com ή απλά δημιουργήστε ένα αίτημα έλξης.
Όλα τα στοιχεία που χρησιμοποιούνται σε αυτό το έργο είναι ανοιχτό πηγή και έχουν άδεια MIT και μπορεί να χρησιμοποιηθεί σε οποιοδήποτε μη εμπνευσμένο προϊόν
Σχετικά με
WhatsApp Message Broker με RabbitMQ, AVD και Appium
Εισαγωγή στο RabbitMQ
Εδώ θα μάθουμε τι είναι το RabbitMQ, οι χρήσεις του RabbitMQ και γιατί πρέπει να χρησιμοποιήσουμε το RabbitMQ στις εφαρμογές μας με παραδείγματα.
Τι είναι το RabbitMQ?
Κουνέλι είναι ένα Amqp Μεσίτης μηνυμάτων και είναι ο πιο δημοφιλής μεσίτης μηνυμάτων ανοιχτού κώδικα και διασταυρούμενης πλατφόρμας.
Το RabbitMQ είναι επίσης ένας τρόπος ανταλλαγής των δεδομένων μεταξύ διαφορετικών εφαρμογών πλατφόρμας, όπως ένα μήνυμα που αποστέλλεται από .Καθαρά Η εφαρμογή μπορεί να διαβαστεί από ένα Κόμβος.JS αίτηση ή Ιάβα εφαρμογή.
Το RabbitMQ είναι χτισμένο Ερλάγκ Γενική χρήση της γλώσσας προγραμματισμού και χρησιμοποιείται επίσης από το WhatsApp για μηνύματα.
Τι είναι το AMQP?
Το πρωτόκολλο προχωρημένης ουράς μηνυμάτων (Amqp) είναι ένα ανοιχτό πρότυπο πρωτόκολλο στρώματος εφαρμογής για προσανατολισμένα στο μήνυμα και τα χαρακτηριστικά του AMQP είναι προσανατολισμός μηνυμάτων, ουρά, δρομολόγηση (συμπεριλαμβανομένων σημείων προς σημείο και δημοσίευσης και εγγραφής), αξιοπιστία και ασφάλεια.
Αναπτύχθηκε από την JPMorgan και την Imatix Corporation. Το AMQP σχεδιάστηκε με τα ακόλουθα κύρια χαρακτηριστικά ως στόχους:
- Ασφάλεια
- Αξιοπιστία
- Διαλειτουργικότητα
- Πρότυπο
- Ανοιξε
Το RabbitMQ είναι ελαφρύ και εύκολο στην ανάπτυξη σε διαθέσιμες εγκαταστάσεις και υποστηρίζει πολλαπλά πρωτόκολλα μηνυμάτων. Το RabbitMQ μπορεί να αναπτυχθεί σε κατανεμημένες και ομοσπονδιακές διαμορφώσεις για να πληροί τις απαιτήσεις υψηλής κλίμακας, υψηλής διαθεσιμότητας.
Ακολουθεί η εικονογραφική αναπαράσταση του τρόπου με τον οποίο το RabbitMQ θα λειτουργήσει ως διαμεσολαβητής μεταξύ αποστολέα και καταναλωτή στις εφαρμογές μας.
Γιατί και πότε να χρησιμοποιήσετε το RabbitMQ?
Τώρα μια μέρα που οι περισσότεροι άνθρωποι θα εκτελέσουν πολλαπλές εργασίες σε μεμονωμένη εφαρμογή, όπως η αποστολή μηνυμάτων ηλεκτρονικού ταχυδρομείου ή SMS, αναφορές και θα δημιουργήσουν ένα βαρύ φορτίο στην εφαρμογή, οπότε αν διαχωρίσετε αυτές τις εργασίες, τότε θα λάβουμε περισσότερο χώρο (μνήμη) για να εξυπηρετήσουμε περισσότερα αιτήματα.
Χρησιμοποιώντας το RabbitMQ, μπορούμε να αφαιρέσουμε κάποια βαριά εργασία από τις εφαρμογές ιστού μας, όπως η αποστολή αναφορών σε μορφή Excel ή PDF’ή στέλνοντας ένα μήνυμα ηλεκτρονικού ταχυδρομείου, SMS ή άλλη εργασία, όπως ενεργοποιήστε κάποιες άλλες εφαρμογές για να ξεκινήσετε την επεξεργασία.
Το RabbitMQ είναι ένας μεσίτης μηνυμάτων ανοιχτού κώδικα και cross-platform, έτσι’είναι εύκολο στη χρήση με πολλές γλώσσες όπως .Net, Java, Python, Ruby, Node.JS.
Βιβλιοθήκες πελατών που υποστηρίζουν το RabbitMQ
Το RabbitMQ θα υποστηρίξει πολλαπλά λειτουργικά συστήματα και γλώσσες προγραμματισμού. Το RabbitMQ έχει παράσχει διάφορες βιβλιοθήκες πελατών για τις ακόλουθες γλώσσες προγραμματισμού.
- .Καθαρά
- Ιάβα
- Πλαίσιο άνοιξη
- Ρουμπίνι
- Πύθων
- PHP
- Στόχος-C και Swift
- Javascript
- ΠΗΓΑΙΝΩ
- Περλ
Σχεδιασμός συστήματος: WhatsApp
Ας σχεδιάσουμε μια υπηρεσία άμεσων μηνυμάτων, παρόμοια με υπηρεσίες όπως το WhatsApp, το Facebook Messenger και το WeChat.
Τι είναι το Whatsapp?
Το WhatsApp είναι μια εφαρμογή συνομιλίας που παρέχει υπηρεσίες άμεσης ανταλλαγής μηνυμάτων στους χρήστες της. Είναι μία από τις πιο χρησιμοποιούμενες εφαρμογές για κινητά στον πλανήτη που συνδέει πάνω από 2 δισεκατομμύρια χρήστες σε 180+ χώρες. Το Whatsapp είναι επίσης διαθέσιμο στον ιστό.
Απαιτήσεις
Το σύστημά μας πρέπει να πληροί τις ακόλουθες απαιτήσεις:
Λειτουργικές απαιτήσεις
- Πρέπει να υποστηρίξει τη συνομιλία one-on-one.
- Ομαδικές συνομιλίες (μέγιστο 100 άτομα).
- Θα πρέπει να υποστηρίξει την κοινή χρήση αρχείων (εικόνα, βίντεο κ.λπ.·.
Μη λειτουργικές απαιτήσεις
- Υψηλή διαθεσιμότητα με ελάχιστη λανθάνουσα κατάσταση.
- Το σύστημα πρέπει να είναι κλιμακωτό και αποτελεσματικό.
Εκτεταμένες απαιτήσεις
- Αποστέλλονται, παραδίδονται και διαβάζουν αποδείξεις των μηνυμάτων.
- Δείξτε την τελευταία ώρα των χρηστών.
- Ειδοποιήσεις Push.
Εκτίμηση και περιορισμούς
Ας ξεκινήσουμε με την εκτίμηση και τους περιορισμούς.
Σημείωση: Βεβαιωθείτε ότι έχετε ελέγξει οποιαδήποτε κλίμακα ή υποθέσεις που σχετίζονται με την κυκλοφορία με τον ερευνητή σας.
ΚΙΝΗΣΗ στους ΔΡΟΜΟΥΣ
Ας υποθέσουμε ότι έχουμε 50 εκατομμύρια καθημερινούς ενεργούς χρήστες (dau) και κατά μέσο όρο κάθε χρήστης στέλνει τουλάχιστον 10 μηνύματα σε 4 διαφορετικά άτομα κάθε μέρα. Αυτό μας δίνει 2 δισεκατομμύρια μηνύματα την ημέρα.
50 M I L L I O N × 20 M E S S S S = 2 B I L L I O N / D A Y 50 \ Space Million \ Times 20 \ Διαστημικό μηνύματα = 2 \ Space Billion / Day 50 Mi Ll I O N × 20 M ESS A G ES = 2 BI LL I O N / D A Y
Τα μηνύματα μπορούν επίσης να περιέχουν μέσα όπως εικόνες, βίντεο ή άλλα αρχεία. Μπορούμε να υποθέσουμε ότι το 5 % των μηνυμάτων είναι αρχεία πολυμέσων που μοιράζονται οι χρήστες, γεγονός που μας δίνει επιπλέον 200 εκατομμύρια αρχεία που θα χρειαζόταν να αποθηκεύσουμε.
5 P e r c e n t × 2 b i l l i o n = 200 m i l i o n / d y 5 \ space percent \ times 2 \ space δισεκατομμύρια = 200 \ space εκατομμύρια / ημέρα 5 p erce n t × 2 bi ll i o n = 200 mi ll i o n / d a y
Τι θα ήταν αιτήματα ανά δευτερόλεπτο (RPS) για το σύστημά μας? 2 δισεκατομμύρια αιτήματα ανά ημέρα μεταφράζονται σε αιτήματα 24K ανά δευτερόλεπτο.
2 B I L L I O N (24 H R S × 3600 S E C O N D S) = ~ 24 K R E QU U E S / S E C O N D \ FRAC<2 \space billion> <(24 \space hrs \times 3600 \space seconds)>= \ sim 24k \ αιτήσεις χώρου / δευτερόλεπτο (24 h rs × 3600 seco n d s) 2 bi ll i o n = ~ 24 k re q u es t s / seco n d2>
### Αποθήκευση Αν υποθέσουμε ότι κάθε μήνυμα κατά μέσο όρο είναι 100 bytes, θα χρειαστούμε περίπου 200 GB αποθήκευσης βάσης δεδομένων κάθε μέρα.
2 B I L L I O N × 100 B Y T E S = ~ 200 g B / D A Y 2 \ Space Billion \ Times 100 \ Space Bytes = \ Sim 200 \ Space GB / Day 2 Bi Ll I O N × 100 B Y T ES = ~ 200 GB / D A Y
Σύμφωνα με τις απαιτήσεις μας, γνωρίζουμε επίσης ότι περίπου το 5 % των ημερήσιων μηνυμάτων μας (100 εκατομμύρια) είναι αρχεία μέσων ενημέρωσης. Εάν υποθέσουμε ότι κάθε αρχείο είναι 50 KB κατά μέσο όρο, θα χρειαστούμε 10 TB αποθήκευσης κάθε μέρα.
100 m i l l i o n × 100 k b = 10 t b / d a y 100 \ space εκατομμύρια \ φορές 100 \ space kb = 10 \ space tb / ημέρα 100 mi ll i o n × 100 k b = 10 tb / d y y
Και για 10 χρόνια, θα χρειαστούμε περίπου 38 pb αποθήκευσης.
(10 T B + 0.2 t b) × 10 y e a r s × 365 d a y s = ~ 38 p b (10 \ space tb + 0.2 \ Space TB) \ Times 10 \ Χρόνια χώρου \ Times 365 \ Space Days = \ Sim 38 \ Space PB (10 TB + 0.2 TB) × 10 Ye a rs × 365 d a ys = ~ 38 pb
### Bandwidth καθώς το σύστημά μας χειρίζεται 10.2 TB εισόδου κάθε μέρα, θα απαιτήσουμε ένα ελάχιστο εύρος ζώνης περίπου 120 MB ανά δευτερόλεπτο.
10.2 T B (24 H R S × 3600 S E C O N D S) = ~ 120 m B / S E C O N D \ FRAC<10.2 \space TB> <(24 \space hrs \times 3600 \space seconds)>= \ sim 120 \ space mb/second (24 h rs × 3600 seco n d s) 10.2 TB = ~ 120 mb / seco n d10.2>
### Εκτίμηση υψηλού επιπέδου εδώ είναι η εκτίμηση υψηλού επιπέδου:
Τύπος | Εκτίμηση |
---|---|
Καθημερινά ενεργοί χρήστες (dau) | 50 εκατομμύρια |
Αιτήματα ανά δευτερόλεπτο (RPS) | 24K/S |
Αποθήκευση (ανά ημέρα) | 10 10.2 TB |
Αποθήκευση (10 έτη) | ~ 38 pb |
εύρος ζώνης | ~ 120 MB/s |
Σχεδιασμός μοντέλου δεδομένων
Αυτό είναι το γενικό μοντέλο δεδομένων που αντικατοπτρίζει τις απαιτήσεις μας. Έχουμε τους ακόλουθους πίνακες: χρήστες Αυτός ο πίνακας θα περιέχει πληροφορίες χρήστη, όπως όνομα, τηλεφωνικό αριθμό και άλλες λεπτομέρειες. μηνύματα Όπως υποδηλώνει το όνομα, αυτός ο πίνακας θα αποθηκεύει μηνύματα με ιδιότητες όπως ο τύπος (κείμενο, εικόνα, βίντεο κ.λπ.), το περιεχόμενο και τα χρονικά σήματα για την παράδοση μηνυμάτων. Το μήνυμα θα έχει επίσης ένα αντίστοιχο chatid ή groupID . συνομιλίες Αυτός ο πίνακας αντιπροσωπεύει βασικά μια ιδιωτική συνομιλία μεταξύ δύο χρηστών και μπορεί να περιέχει πολλά μηνύματα. Users_chats Αυτός ο πίνακας χαρτίζει τους χρήστες και τις συνομιλίες, καθώς πολλοί χρήστες μπορούν να έχουν πολλαπλές συνομιλίες (σχέση n: m) και αντίστροφα. ομάδες Αυτός ο πίνακας αντιπροσωπεύει μια ομάδα μεταξύ πολλών χρηστών. users_groups Αυτός ο πίνακας χαρτογραφεί τους χρήστες και τις ομάδες ως πολλοί χρήστες μπορούν να αποτελέσουν μέρος πολλών ομάδων (σχέση n: m) και αντίστροφα.
Τι είδους βάση δεδομένων πρέπει να χρησιμοποιήσουμε?
Ενώ το μοντέλο δεδομένων μας φαίνεται αρκετά σχεσιακό, δεν χρειάζεται απαραίτητα να αποθηκεύσουμε τα πάντα σε μια ενιαία βάση δεδομένων, καθώς αυτό μπορεί να περιορίσει την επεκτασιμότητα μας και να γίνει γρήγορα συμφόρηση. Θα χωρίσουμε τα δεδομένα μεταξύ διαφορετικών υπηρεσιών που έχουν καμία ιδιοκτησία σε ένα συγκεκριμένο τραπέζι. Στη συνέχεια, μπορούμε να χρησιμοποιήσουμε μια σχεσιακή βάση δεδομένων όπως το PostgreSQL ή μια κατανεμημένη βάση δεδομένων NOSQL όπως το Apache Cassandra για την περίπτωση χρήσης μας.
Σχεδιασμός API
Ας κάνουμε ένα βασικό σχέδιο API για τις υπηρεσίες μας:
Λάβετε όλες τις συνομιλίες ή τις ομάδες
Αυτό το API θα πάρει όλες τις συνομιλίες ή τις ομάδες για ένα συγκεκριμένο χρήστη .
Πάρτα ολα(ταυτότητα χρήστη: Ευσπλαχνικός) Κουβέντα[] | Ομάδα[]
Εισαγάγετε τη λειτουργία πλήρους οθόνης
Έξοδος από τη λειτουργία πλήρους οθόνης
Παράμετροι Αναγνωριστικό χρήστη (UUID): ID του τρέχοντος χρήστη. Επιστρέφει Αποτέλεσμα (CHAT [] | Ομάδα []): Όλες οι συνομιλίες και οι ομάδες ο χρήστης είναι μέρος του.
Λάβετε μηνύματα
Λάβετε όλα τα μηνύματα για έναν χρήστη δεδομένου του ChannelID (chat ή id ομάδας).
getMessages(ταυτότητα χρήστη: Ευσπλαχνικός, καναλιή: Ευσπλαχνικός) Μήνυμα[]
Εισαγάγετε τη λειτουργία πλήρους οθόνης
Έξοδος από τη λειτουργία πλήρους οθόνης
Παράμετροι Αναγνωριστικό χρήστη (UUID): ID του τρέχοντος χρήστη. ID καναλιού (UUID): ID του καναλιού (συνομιλία ή ομάδα) από τα οποία τα μηνύματα πρέπει να ανακτηθούν. Επιστρέφει Μηνύματα (μήνυμα []): Όλα τα μηνύματα σε μια δεδομένη συνομιλία ή ομάδα.
Να στείλετε μήνυμα
Στείλτε ένα μήνυμα από έναν χρήστη σε ένα κανάλι (συνομιλία ή ομάδα).
να στείλετε μήνυμα(ταυτότητα χρήστη: Ευσπλαχνικός, καναλιή: Ευσπλαχνικός, μήνυμα: Μήνυμα) φουσκωμένος
Εισαγάγετε τη λειτουργία πλήρους οθόνης
Έξοδος από τη λειτουργία πλήρους οθόνης
Παράμετροι Αναγνωριστικό χρήστη (UUID): ID του τρέχοντος χρήστη. ID καναλιού (UUID): Το αναγνωριστικό του χρήστη του καναλιού (συνομιλία ή ομάδα) θέλει να στείλει ένα μήνυμα στο. Μήνυμα (μήνυμα): Το μήνυμα (κείμενο, εικόνα, βίντεο, κλπ.) ότι ο χρήστης θέλει να στείλει. Επιστρέφει Αποτέλεσμα (boolean): αντιπροσωπεύει αν η λειτουργία ήταν επιτυχής ή όχι.
Εγγραφείτε ή αφήστε μια ομάδα
Στείλτε ένα μήνυμα από έναν χρήστη σε ένα κανάλι (συνομιλία ή ομάδα).
ιχνοστροφή(ταυτότητα χρήστη: Ευσπλαχνικός, καναλιή: Ευσπλαχνικός) φουσκωμένος αφήνω την ομάδα(ταυτότητα χρήστη: Ευσπλαχνικός, καναλιή: Ευσπλαχνικός) φουσκωμένος
Εισαγάγετε τη λειτουργία πλήρους οθόνης
Έξοδος από τη λειτουργία πλήρους οθόνης
Παράμετροι Αναγνωριστικό χρήστη (UUID): ID του τρέχοντος χρήστη. ID καναλιού (UUID): ID του καναλιού (συνομιλία ή ομάδα) Ο χρήστης θέλει να συμμετάσχει ή να φύγει. Επιστρέφει Αποτέλεσμα (boolean): αντιπροσωπεύει αν η λειτουργία ήταν επιτυχής ή όχι.
Σχεδιασμός υψηλού επιπέδου
Τώρα ας κάνουμε ένα σχεδιασμό υψηλού επιπέδου του συστήματός μας.
Αρχιτεκτονική
Θα χρησιμοποιούμε αρχιτεκτονική Microservices, καθώς θα διευκολύνει την οριζόντια κλίμακα και την αποσύνδεση των υπηρεσιών μας. Κάθε υπηρεσία θα έχει την κυριότητα του δικού της μοντέλου δεδομένων. Ας προσπαθήσουμε να διαιρέσουμε το σύστημά μας σε ορισμένες βασικές υπηρεσίες. Υπηρεσία χρήστη Πρόκειται για μια υπηρεσία που βασίζεται σε HTTP που διαχειρίζεται ανησυχίες που σχετίζονται με το χρήστη, όπως ο έλεγχος ταυτότητας και οι πληροφορίες χρήστη. Υπηρεσία συνομιλίας Η υπηρεσία συνομιλίας θα χρησιμοποιήσει το WebSockets και θα δημιουργήσει συνδέσεις με τον πελάτη για να χειριστεί τη λειτουργικότητα που σχετίζεται με το μήνυμα και την ομάδα μηνυμάτων. Μπορούμε επίσης να χρησιμοποιήσουμε την προσωρινή μνήμη για να παρακολουθούμε όλες τις ενεργές συνδέσεις σαν συνεδρίες που θα μας βοηθήσουν να προσδιορίσουμε εάν ο χρήστης είναι συνδεδεμένος ή όχι. Υπηρεσία ειδοποίησης Αυτή η υπηρεσία θα στείλει απλώς ειδοποιήσεις push στους χρήστες. Θα συζητηθεί λεπτομερώς ξεχωριστά. Υπηρεσία παρουσίας Η υπηρεσία παρουσίας θα παρακολουθεί την τελευταία κατάσταση όλων των χρηστών. Θα συζητηθεί λεπτομερώς ξεχωριστά. Υπηρεσία μέσων ενημέρωσης Αυτή η υπηρεσία θα χειριστεί τα μέσα (εικόνες, βίντεο, αρχεία κ.λπ.) Μεταφορτώσεις. Θα συζητηθεί λεπτομερώς ξεχωριστά. Τι γίνεται με την ανακάλυψη επικοινωνίας και υπηρεσίας μεταξύ υπηρεσιών? Δεδομένου ότι η αρχιτεκτονική μας βασίζεται σε μικροεπιχειρήσεις, οι υπηρεσίες θα επικοινωνούν μεταξύ τους επίσης. Γενικά, το REST ή το HTTP αποδίδει καλά, αλλά μπορούμε να βελτιώσουμε περαιτέρω την απόδοση χρησιμοποιώντας το GRPC που είναι πιο ελαφρύ και αποτελεσματικό. Η ανακάλυψη υπηρεσιών είναι ένα άλλο πράγμα που θα πρέπει να λάβουμε υπόψη. Μπορούμε επίσης να χρησιμοποιήσουμε ένα πλέγμα υπηρεσίας που επιτρέπει τη διαχείριση, παρατηρήσιμη και ασφαλή επικοινωνία μεταξύ των μεμονωμένων υπηρεσιών. Σημείωση: Μάθετε περισσότερα σχετικά με το REST, το GraphQL, το GRPC και πώς συγκρίνονται μεταξύ τους.
Μηνύματα σε πραγματικό χρόνο
Πώς στέλνουμε αποτελεσματικά και λαμβάνουμε μηνύματα? Έχουμε δύο διαφορετικές επιλογές: Μοντέλο έλξης Ο πελάτης μπορεί να στείλει περιοδικά ένα αίτημα HTTP σε διακομιστές για να ελέγξει εάν υπάρχουν νέα μηνύματα. Αυτό μπορεί να επιτευχθεί μέσω κάτι σαν μακρά δημοσκόπηση. Μοντέλο ώθησης Ο πελάτης ανοίγει μια σύνδεση μακράς διάρκειας με τον διακομιστή και μόλις είναι διαθέσιμα νέα δεδομένα, θα ωθηθεί στον πελάτη. Μπορούμε να χρησιμοποιήσουμε websockets ή συμβάντα διακομιστή (SSE) για αυτό. Η προσέγγιση του μοντέλου έλξης δεν είναι κλιμακωτή, καθώς θα δημιουργήσει περιττά αίτημα γενικά έξοδα στους διακομιστές μας και τις περισσότερες φορές η απάντηση θα είναι κενή, σπαταλώντας έτσι τους πόρους μας. Για να ελαχιστοποιηθεί η καθυστέρηση, η χρήση του μοντέλου ώθησης με το websockets είναι μια καλύτερη επιλογή επειδή τότε μπορούμε να προωθήσουμε δεδομένα στον πελάτη μόλις είναι διαθέσιμο χωρίς καθυστέρηση δεδομένης της σύνδεσης είναι ανοιχτή με τον πελάτη. Επίσης, οι WebSockets παρέχουν επικοινωνία πλήρους διπλής όψης, σε αντίθεση με τα συμβάντα Server-Sent (SSE), τα οποία είναι μόνο μονοκατευθυντικά. Σημείωση: Μάθετε περισσότερα σχετικά με τις μεγάλες δημοσκοπήσεις, τα websockets, τα συμβάντα διακομιστή (SSE).
Εθεάθη τελευταία
Για να εφαρμόσουμε την τελευταία λειτουργικότητα, μπορούμε να χρησιμοποιήσουμε έναν μηχανισμό καρδιακού παλμού, όπου ο πελάτης μπορεί να τοποθετήσει περιοδικά τους διακομιστές που υποδεικνύουν τη ζωντάνια του. Δεδομένου ότι αυτό πρέπει να είναι όσο το δυνατόν χαμηλότερο, μπορούμε να αποθηκεύσουμε την τελευταία ενεργή χρονική σήμανση στην προσωρινή μνήμη ως εξής:
Κλειδί | αξία |
---|---|
Χρήστης α | 2022-07-01T14: 32: 50 |
Χρήστης β | 2022-07-05T05: 10: 35 |
Χρήστης γ | 2022-07-10T04: 33: 25 |
Αυτό θα μας δώσει την τελευταία φορά που ο χρήστης ήταν ενεργός. Αυτή η λειτουργικότητα θα αντιμετωπιστεί από την υπηρεσία παρουσίας σε συνδυασμό με το Redis ή Memcached ως cache μας. Ένας άλλος τρόπος για να εφαρμοστεί αυτό είναι να παρακολουθείτε την τελευταία ενέργεια του χρήστη, μόλις η τελευταία δραστηριότητα διασχίσει ένα συγκεκριμένο όριο, όπως “Ο χρήστης δεν έχει πραγματοποιήσει καμία ενέργεια τα τελευταία 30 δευτερόλεπτα”, Μπορούμε να δείξουμε τον χρήστη ως εκτός σύνδεσης και να δει τελευταία με την τελευταία καταγεγραμμένη χρονική σήμανση. Αυτό θα είναι περισσότερο μια τεμπέλης προσέγγιση ενημέρωσης και μπορεί να μας ωφελήσει τον καρδιακό παλμό σε ορισμένες περιπτώσεις.
Ειδοποιήσεις
Μόλις αποσταλεί ένα μήνυμα σε συνομιλία ή ομάδα, θα ελέγξουμε πρώτα εάν ο παραλήπτης είναι ενεργός ή όχι, μπορούμε να λάβουμε αυτές τις πληροφορίες λαμβάνοντας την ενεργή σύνδεση του χρήστη και εξετάζεται για τελευταία φορά. Εάν ο παραλήπτης δεν είναι ενεργός, η υπηρεσία συνομιλίας θα προσθέσει ένα συμβάν σε μια ουρά μηνυμάτων με πρόσθετα μεταδεδομένα, όπως η πλατφόρμα συσκευών του πελάτη που θα χρησιμοποιηθεί για τη δρομολόγηση της ειδοποίησης στη σωστή πλατφόρμα αργότερα. Στη συνέχεια, η υπηρεσία ειδοποίησης θα καταναλώσει το συμβάν από την ουρά μηνυμάτων και θα προωθήσει το αίτημα στο Firebase Cloud Messaging (FCM) ή την υπηρεσία ειδοποίησης Apple Push (APNS) με βάση την πλατφόρμα συσκευών του πελάτη (Android, iOS, Web κ.λπ.). Μπορούμε επίσης να προσθέσουμε υποστήριξη για email και SMS. Γιατί χρησιμοποιούμε μια ουρά μηνυμάτων? Δεδομένου ότι οι περισσότερες ουρές μηνυμάτων παρέχουν παραγγελία με την καλύτερη προσπάθεια που εξασφαλίζει ότι τα μηνύματα παραδίδονται γενικά με την ίδια σειρά με την αποστολή τους και ότι ένα μήνυμα παραδίδεται τουλάχιστον μία φορά που αποτελεί σημαντικό μέρος της λειτουργικότητας υπηρεσιών μας. Ενώ αυτό φαίνεται σαν μια κλασική υπόθεση χρήσης δημοσίευσης-subscribe, δεν είναι στην πραγματικότητα ως κινητές συσκευές και προγράμματα περιήγησης που έχουν το δικό τους τρόπο χειρισμού ειδοποιήσεις ώθησης. Συνήθως, οι ειδοποιήσεις αντιμετωπίζονται εξωτερικά μέσω της Firebase Cloud Messaging (FCM) ή της υπηρεσίας ειδοποίησης Push Apple (APNs) σε αντίθεση με το message fan-out που συνήθως βλέπουμε στις υπηρεσίες backend. Μπορούμε να χρησιμοποιήσουμε κάτι σαν το Amazon SQS ή το RabbitMQ για να υποστηρίξουμε αυτήν τη λειτουργικότητα.
Διαβάστε τις αποδείξεις
Η διαχείριση των αποδείξεων ανάγνωσης μπορεί να είναι δύσκολη, για αυτή τη περίπτωση χρήσης μπορούμε να περιμένουμε κάποιο είδος αναγνώρισης (ACK) από τον πελάτη για να προσδιορίσουμε εάν το μήνυμα παραδόθηκε και ενημερώνει το αντίστοιχο πεδίο παραδοχής. Ομοίως, θα επισημάνουμε το μήνυμα που παρατηρείται μόλις ο χρήστης ανοίξει τη συνομιλία και θα ενημερώσει το αντίστοιχο πεδίο Timestamp Seenat.
Σχέδιο
Τώρα που εντοπίσαμε μερικά βασικά στοιχεία, ας κάνουμε το πρώτο σχέδιο του σχεδιασμού του συστήματός μας.
Λεπτομερές σχέδιο
Ήρθε η ώρα να συζητήσουμε λεπτομερώς τις αποφάσεις σχεδιασμού μας.
Διαχωρισμός δεδομένων
- Διαχωρισμός με βάση το hash
- Διαχωρισμός βάσει λίστας
- Διαχωρισμός βασισμένου σε εύρος
- Σύνθετος διαχωρισμός
Οι παραπάνω προσεγγίσεις μπορούν ακόμα να προκαλέσουν ανομοιόμορφα δεδομένα και κατανομή φόρτωσης, μπορούμε να λύσουμε αυτό χρησιμοποιώντας συνεπή κατακερματισμό.
Προσωρινή αποθήκευση
Σε μια εφαρμογή μηνυμάτων, πρέπει να είμαστε προσεκτικοί σχετικά με τη χρήση της προσωρινής μνήμης, καθώς οι χρήστες μας αναμένουν τα τελευταία δεδομένα, αλλά πολλοί χρήστες θα ζητούν τα ίδια μηνύματα, ειδικά σε μια ομαδική συνομιλία. Έτσι, για να αποτρέψουμε τις αιχμές χρήσης από τους πόρους μας, μπορούμε να αποθηκεύσουμε τα παλαιότερα μηνύματα.
Ορισμένες ομαδικές συνομιλίες μπορούν να έχουν χιλιάδες μηνύματα και να στείλουν αυτό το δίκτυο θα είναι πραγματικά αναποτελεσματικές, για να βελτιώσουμε την αποτελεσματικότητα μπορούμε να προσθέσουμε σελίδα στα API του συστήματός μας. Αυτή η απόφαση θα είναι χρήσιμη για τους χρήστες με περιορισμένο εύρος ζώνης δικτύου, καθώς δεν θα χρειαστεί να ανακτήσουν παλιά μηνύματα εκτός εάν ζητηθούν.
Ποια πολιτική εξώθησης cache πρέπει να χρησιμοποιήσει?
Μπορούμε να χρησιμοποιήσουμε λύσεις όπως το Redis ή το Memcached και το Cache Cache 20% της καθημερινής κυκλοφορίας, αλλά τι είδους πολιτική αποτροπής προσωρινής αποθήκευσης θα ταιριάζει καλύτερα στις ανάγκες μας?
Το λιγότερο πρόσφατα χρησιμοποιούμενο (LRU) μπορεί να είναι μια καλή πολιτική για το σύστημά μας. Σε αυτήν την πολιτική, απορρίψαμε πρώτα το λιγότερο πρόσφατα χρησιμοποιούμενο κλειδί.
Πώς να χειριστείτε την προσωρινή μνήμη?
Κάθε φορά που υπάρχει μια μνήμη cache, οι διακομιστές μας μπορούν να χτυπήσουν απευθείας τη βάση δεδομένων και να ενημερώσουν την προσωρινή μνήμη με τις νέες καταχωρήσεις.
Για περισσότερες λεπτομέρειες, ανατρέξτε στην προσωρινή προσφορά.
Πρόσβαση και αποθήκευση μέσων ενημέρωσης
Όπως γνωρίζουμε, το μεγαλύτερο μέρος του αποθηκευτικού χώρου μας θα χρησιμοποιηθεί για την αποθήκευση αρχείων πολυμέσων όπως εικόνες, βίντεο ή άλλα αρχεία. Η υπηρεσία των μέσων ενημέρωσης θα χειρίζεται τόσο την πρόσβαση όσο και την αποθήκευση των αρχείων πολυμέσων χρήστη.
Αλλά πού μπορούμε να αποθηκεύσουμε αρχεία σε κλίμακα? Λοιπόν, η αποθήκευση αντικειμένων είναι αυτό που ψάχνουμε. Τα αντικείμενα αποθηκεύουν τα αρχεία δεδομένων σε κομμάτια που ονομάζονται αντικείμενα. Στη συνέχεια, αποθηκεύει αυτά τα αντικείμενα σε ένα μόνο αποθετήριο, το οποίο μπορεί να εξαπλωθεί σε πολλαπλά δίκτυα συστήματα. Μπορούμε επίσης να χρησιμοποιήσουμε κατανεμημένο χώρο αποθήκευσης αρχείων όπως HDFs ή Glusterfs.
Γεγονός διασκέδασης: Το WhatsApp διαγράφει τα μέσα ενημέρωσης στους διακομιστές του μόλις μεταφορτωθεί από τον χρήστη.
Μπορούμε να χρησιμοποιήσουμε καταστήματα αντικειμένων όπως το Amazon S3, το Azure Blob Storage ή το Google Cloud Storage για αυτήν την περίπτωση χρήσης.
Δίκτυο παράδοσης περιεχομένου (CDN)
Το δίκτυο παράδοσης περιεχομένου (CDN) αυξάνει τη διαθεσιμότητα και την απόλυση περιεχομένου μειώνοντας παράλληλα το κόστος του εύρους ζώνης. Γενικά, στατικά αρχεία όπως εικόνες και βίντεο σερβίρονται από το CDN. Μπορούμε να χρησιμοποιήσουμε υπηρεσίες όπως το Amazon CloudFront ή το Cloudflare CDN για αυτή τη χρήση χρήσης.
Πύλη API
Δεδομένου ότι θα χρησιμοποιήσουμε πολλαπλά πρωτόκολλα όπως HTTP, WebSocket, TCP/IP, αναπτύσσοντας πολλαπλές ισοζυγές L4 (μεταφορά) ή L7 (Layer Application Layer) για κάθε πρωτόκολλο θα είναι ακριβό. Αντ ‘αυτού, μπορούμε να χρησιμοποιήσουμε μια πύλη API που υποστηρίζει πολλαπλά πρωτόκολλα χωρίς προβλήματα.
Το API Gateway μπορεί επίσης να προσφέρει άλλα χαρακτηριστικά όπως ο έλεγχος ταυτότητας, η εξουσιοδότηση, ο περιορισμός των επιτοκίων, ο στραγγαλισμός και η έκδοση API που θα βελτιώσουν την ποιότητα των υπηρεσιών μας.
Μπορούμε να χρησιμοποιήσουμε υπηρεσίες όπως το Amazon API Gateway ή το Azure API Gateway για αυτή τη περίπτωση χρήσης.
Προσδιορίστε και επίλυση σημείων συμφόρησης
Ας προσδιορίσουμε και να επιλύσουμε τα σημεία συμφόρησης, όπως τα μεμονωμένα σημεία αποτυχίας στο σχεδιασμό μας:
- “Τι γίνεται αν μια από τις υπηρεσίες μας καταρρέει?«
- “Πώς θα διανείμεμε την κυκλοφορία μας μεταξύ των εξαρτημάτων μας?«
- “Πώς μπορούμε να μειώσουμε το φορτίο στη βάση δεδομένων μας?«
- “Πώς να βελτιώσετε τη διαθεσιμότητα της προσωρινής μνήμης μας?«
- “Δεν θα ήταν ένα μόνο σημείο αποτυχίας?«
- “Πώς μπορούμε να κάνουμε το σύστημα ειδοποιήσεων πιο ισχυρό?«
- “Πώς μπορούμε να μειώσουμε το κόστος αποθήκευσης των μέσων ενημέρωσης”?
- “Η υπηρεσία συνομιλίας έχει υπερβολική ευθύνη?«
Για να καταστήσουμε το σύστημά μας πιο ανθεκτικό, μπορούμε να κάνουμε τα εξής:
- Εκτέλεση πολλαπλών περιπτώσεων καθενός από τις υπηρεσίες μας.
- Εισαγωγή εξισορρόπησης φορτίου μεταξύ πελατών, διακομιστών, βάσεων δεδομένων και διακομιστών προσωρινής μνήμης.
- Χρησιμοποιώντας πολλαπλά αντίγραφα ανάγνωσης για τις βάσεις δεδομένων μας.
- Πολλαπλές περιπτώσεις και αντίγραφα για την κατανεμημένη προσωρινή μνήμη μας.
- Μπορούμε να έχουμε ένα αντίγραφο αναμονής της πύλης API μας.
- Ακριβώς όταν η παράδοση και η παραγγελία μηνυμάτων είναι προκλητική σε ένα κατανεμημένο σύστημα, μπορούμε να χρησιμοποιήσουμε έναν ειδικό μεσίτη μηνυμάτων, όπως το Apache Kafka ή το Nats για να καταστήσουμε το σύστημα ειδοποιήσεων πιο ισχυρό.
- Μπορούμε να προσθέσουμε δυνατότητες επεξεργασίας και συμπίεσης μέσων ενημέρωσης στην υπηρεσία μέσων ενημέρωσης για τη συμπίεση μεγάλων αρχείων παρόμοια με το WhatsApp που θα εξοικονομήσουν πολύ χώρο αποθήκευσης και θα μειώσουν το κόστος.
- Μπορούμε να δημιουργήσουμε μια ομάδα ομάδας ξεχωριστά από την υπηρεσία συνομιλίας για να αποσυνδέσει περαιτέρω τις υπηρεσίες μας.
Αυτό το άρθρο αποτελεί μέρος του μαθήματος σχεδιασμού του συστήματος ανοιχτού κώδικα που διατίθεται στο GitHub.
KaranPratapsingh / System-Design
Μάθετε πώς να σχεδιάζετε συστήματα σε κλίμακα και προετοιμασία για συνεντεύξεις σχεδιασμού συστήματος
Μάθημα σχεδιασμού συστήματος
Γεια σου, καλώς ήλθατε στο μάθημα. Ελπίζω αυτό το μάθημα να προσφέρει μια μεγάλη μαθησιακή εμπειρία.
Αυτό το μάθημα είναι επίσης διαθέσιμο στον ιστότοπό μου και ως eBook στο LeanPub. Αφήστε ένα ⭐ ως κίνητρο εάν αυτό ήταν χρήσιμο!
Πίνακας περιεχομένων
- Ξεκινώντας
- Τι είναι ο σχεδιασμός του συστήματος?
- IP
- Μοντέλο OSI
- TCP και UDP
- Σύστημα ονόματος τομέα (DNS)
- Εξισορρόπηση φορτίου
- Ομαδοποίηση
- Προσωρινή αποθήκευση
- Δίκτυο παράδοσης περιεχομένου (CDN)
- Πληρεξούσιο
- Διαθεσιμότητα
- Επεκτασιμότητα
- Αποθήκευση
- Βάσεις δεδομένων και DBMS
- Βάσεις δεδομένων SQL
- Βάσεις δεδομένων NOSQL
- Βάσεις δεδομένων SQL vs NOSQL
- Αντιγραφή βάσης δεδομένων
- Ευρετήριο
- Εξομάλυνση και απονεμοποίηση
- Όξινα μοντέλα συνέπειας και βάσης
- Θεώρημα καπακιού
- Θεώρημα PACELC
- Συναλλαγές
- Κατανεμημένες συναλλαγές
- Θραύση
- Σταθερός κατακερματισμός
- Ομοσπονδία βάσης δεδομένων
- Αρχιτεκτονική
- Μεσίτες μηνυμάτων
- Ουρές μηνυμάτων
- Δημοσίευση-καταγραφή
- Bus Enterprise Service Bus (ESB)
- Μονόλιθοι και μικροεπιχειρήσεις
- Αρχιτεκτονική που βασίζεται σε εκδηλώσεις (EDA)
- Προμήθεια εκδήλωσης
- Διαχωρισμός ευθύνης εντολών και ερωτήσεων (CQRS)
- Πύλη API
- REST, GraphQL, GRPC
- Μεγάλη δημοσκόπηση, websockets, συμβάντα διακομιστή (SSE)