Το Kafka είναι ένα υψηλής απόδοσης, κατανεμημένο σύστημα ανταλλαγής μηνυμάτων που αναπτύχθηκε από το LinkedIn και χρησιμοποιείται ευρέως σε σενάρια όπως η συλλογή αρχείων καταγραφής, η επεξεργασία δεδομένων ροής, η διανομή μηνυμάτων στο διαδίκτυο και εκτός σύνδεσης και πολλά άλλα. Αν και δεν έχει σχεδιαστεί ως παραδοσιακό MQ, το Kafaka μπορεί να αντικαταστήσει τα παραδοσιακά συστήματα ανταλλαγής μηνυμάτων όπως το ActiveMQ στις περισσότερες περιπτώσεις.
Ο Κάφκα οργανώνει τη ροή των μηνυμάτων ανά θέματα και ο διακομιστής που κρατά τα μηνύματα ονομάζεται μεσίτης και οι καταναλωτές μπορούν να εγγραφούν σε ένα ή περισσότερα θέματα. Προκειμένου να εξισορροπηθεί το φορτίο, τα μηνύματα ενός θέματος μπορούν να χωριστούν σε πολλαπλές κατατμήσεις και όσο περισσότερες κατατμήσεις, τόσο μεγαλύτερος είναι ο παραλληλισμός και η απόδοση του Κάφκα.
Τα συμπλέγματα Kafka απαιτούν υποστήριξη zookeeper για την υλοποίηση clusters και το zookeeper περιλαμβάνεται ήδη στην πιο πρόσφατη διανομή kafka, η οποία μπορεί να αναπτυχθεί για να ξεκινήσει ένας διακομιστής zookeeper και ένας διακομιστής Kafka ταυτόχρονα ή να χρησιμοποιήσει άλλα υπάρχοντα clusters zookeeper.
Σε αντίθεση με το παραδοσιακό MQ, οι καταναλωτές πρέπει να διατηρούν μια αντιστάθμιση μόνοι τους και όταν λαμβάνουν μηνύματα από τον Κάφκα, να τραβούν μηνύματα μόνο μετά την τρέχουσα μετατόπιση. Ο πελάτης scala/java του Kafka εφαρμόζει ήδη αυτό το μέρος της λογικής αποθηκεύοντας τη μετατόπιση στον φύλακα του ζωολογικού κήπου. Κάθε καταναλωτής μπορεί να επιλέξει ένα αναγνωριστικό και οι καταναλωτές με το ίδιο αναγνωριστικό θα λάβουν το ίδιο μήνυμα μόνο μία φορά.Εάν οι καταναλωτές ενός θέματος χρησιμοποιούν όλοι το ίδιο αναγνωριστικό, είναι μια παραδοσιακή ουρά. Εάν κάθε καταναλωτής χρησιμοποιεί διαφορετικό αναγνωριστικό, είναι ένα παραδοσιακό pub-sub.
Αναθεώρηση:
Κατανάλωση Κάφκα
1. Καταναλωτές του ίδιου group_id, μόνο ένας καταναλωτής μπορεί να καταναλώσει μηνύματα (Λειτουργία ουράς αναμονής)
2. Οι καταναλωτές διαφορετικών group_id λαμβάνουν τα ίδια νέα
Πλεονεκτήματα του Κάφκα
Κατανεμημένο και εξαιρετικά επεκτάσιμο. Τα συμπλέγματα Kafka μπορούν να κλιμακωθούν με διαφάνεια για να προσθέσουν νέους διακομιστές στο σύμπλεγμα.
Υψηλή απόδοση. Η απόδοση του Kafka υπερβαίνει κατά πολύ αυτή των παραδοσιακών υλοποιήσεων MQ όπως το ActiveMQ και το RabbitMQ, ειδικά το Kafka, το οποίο υποστηρίζει επίσης ομαδικές λειτουργίες. Η παρακάτω εικόνα δείχνει τα αποτελέσματα του stress test απόδοσης καταναλωτή του LinkedIn:
Ανοχή σφαλμάτων. Τα δεδομένα από κάθε διαμέρισμα στο Kafka αναπαράγονται σε πολλούς διακομιστές. Όταν ένας μεσίτης αποτύχει, η υπηρεσία ZooKeeper θα ειδοποιήσει τον παραγωγό και τον καταναλωτή, οι οποίοι μεταβαίνουν σε άλλο μεσίτη.
Μειονεκτήματα του Κάφκα:
Επαναλάβετε τα μηνύματα. Ο Κάφκα εγγυάται μόνο ότι κάθε μήνυμα θα παραδοθεί τουλάχιστον μία φορά, και ενώ οι πιθανότητες είναι μικρές, υπάρχει πιθανότητα ένα μήνυμα να παραδοθεί πολλές φορές. Τα νέα είναι εκτός λειτουργίας. Αν και τα μηνύματα μέσα σε μια κατάτμηση είναι εγγυημένα τακτοποιημένα, αν ένα θέμα έχει πολλές κατατμήσεις, η παράδοση μηνυμάτων μεταξύ κατατμήσεων δεν είναι εγγυημένη ότι θα είναι τακτική. Πολυπλοκότητα. Ο Κάφκα απαιτεί την υποστήριξη συστάδων ζωολογικών κήπων και τα θέματα συνήθως απαιτούν χειρωνακτική εργασία για τη δημιουργία, την ανάπτυξη και τη συντήρηση πιο ακριβών από τις γενικές ουρές μηνυμάτων
Λειτουργίες Kafka ουράς μηνυμάτων .NET/C#
Αρχικά, χρησιμοποιήστε το .NET Core 3.1 για να δημιουργήσετε δύο νέα έργα κονσόλας, συγκεκριμένα το Kafka-Consumer και το Kafka-Producer
Χρησιμοποιήστε το nuget για να αναφέρετε το πακέτο Confluent.Kafka ως εξής, με την ακόλουθη εντολή:
Διεύθυνση GitHub:Η σύνδεση με υπερσύνδεσμο είναι ορατή.
Ξεκινάμε πρώτα το πρόγραμμα Producer και αν ξεκινήσουμε πρώτα τον καταναλωτή, θα λάβουμε το ακόλουθο σφάλμα:
Παρουσιάστηκε σφάλμα: Μεσίτης: Άγνωστο θέμα ή διαμέρισμα Αυτό το άρθρο θα καταναλώσει ρυθμίσειςΤο EnableAutoOffsetStore είναι ψευδές, δηλαδή, μη αυτόματη ρύθμιση του χώρου αποθήκευσης μετατόπισης (παρόμοια με ένα μη αυτόματο μήνυμα επιβεβαίωσης)
Οι καταναλωτές δεν ρυθμίζουν το OffsetStore μετά την κατανάλωση
Προσπαθήστε να χρησιμοποιήσετε τον παραγωγό για να παράγετε δύο μηνύματα, ενεργοποιήστε την κατανάλωση καταναλωτή, MaxPollIntervalMs = 10000 // 10 δευτερόλεπτα χωρίς χειροκίνητη ρύθμιση, επιτρέψτε σε άλλους πελάτες να καταναλώσουν, φυσικά, δεν θα καταναλωθεί από άλλους πελάτες εντός 10 δευτερολέπτων
Το MaxPollIntervalMs εξηγεί
Για προχωρημένους καταναλωτές, ο μέγιστος επιτρεπόμενος χρόνος για την κατανάλωση μηνυμάτων μεταξύ των κλήσεων (για παράδειγμα, rd_kafka_consumer_poll()). Εάν ξεπεραστεί αυτό το διάστημα, ο καταναλωτής θεωρείται ότι έχει αποτύχει και η ομάδα εξισορροπείται εκ νέου, έτσι ώστε η κατάτμηση να εκχωρηθεί εκ νέου σε άλλο μέλος της ομάδας καταναλωτών. Προειδοποίηση: Οι υποβολές μετατόπισης ενδέχεται να μην είναι δυνατές αυτήν τη στιγμή. Σημείωση: Συνιστάται να ορίσετε το "enable.auto.offset.store=false" για εφαρμογές που υποβάλλονται σε επεξεργασία για μεγάλο χρονικό διάστημα και, στη συνέχεια, να αποθηκεύσετε ρητά τη μετατόπιση (χρησιμοποιώντας το offsets_store()) μετά την επεξεργασία του μηνύματος* για να διασφαλίσετε ότι η μετατόπιση δεν πραγματοποιείται αυτόματα πριν ολοκληρωθεί η επεξεργασία. Ελέγχετε μία φορά το δευτερόλεπτο σε διαστήματα δύο. Για περισσότερες πληροφορίες, ανατρέξτε στο KIP-62. Οι αποδόσεις είναι οι εξής:
Το OffsetStore ορίζεται αφού ο καταναλωτής ολοκληρώσει τις δαπάνες
κώδικας
Αφού ολοκληρωθεί η ρύθμιση, περιμένετε 10 δευτερόλεπτα και θα συνεχίσει να κάνειΛάβατε το τελευταίο μήνυμα(Όταν ο καταναλωτής συνδέεται με τον μεσίτη,Ξεκινήστε την κατανάλωση από τη θέση μετατόπισηςΕάν έχει οριστεί c.Commit(cr). Το τελευταίο μήνυμα δεν θα ληφθεί επανειλημμένα.
Προβολή πηγαίου κώδικα
δεσμεύστε τη μετατόπιση + 1 υποβολή και τελικά καλέστε Librdkafka.topic_partition_list_destroy(cOffsets).
Η σύνδεση με υπερσύνδεσμο είναι ορατή.
Η σύνδεση με υπερσύνδεσμο είναι ορατή.
Ορισμός διαφορετικού GroupId
Δοκιμάστε να ορίσετε ένα διαφορετικό GroupId μέσω της παραμέτρου της γραμμής εντολών και στη συνέχεια στείλτε ένα μήνυμα μέσω της πύλης παροχής, όπως φαίνεται στην παρακάτω εικόνα:
Τόσο clinet1 όσο και πελάτης2Λήψη ιστορικών μηνυμάτων, και αφού ο παραγωγός στείλει ένα μήνυμα, και τα δύο θα είναι σχεδόνΛάβετε μηνύματα ταυτόχρονα。
Οι νέοι καταναλωτές λαμβάνουν μόνο νέα μηνύματα
Πώς κάνετε έναν νέο πελάτη να λαμβάνει μόνο νέα μηνύματα και να αγνοεί ιστορικά δεδομένα;
Οι ρυθμίσεις είναι οι εξής:
Οπως φαίνεται παρακάτω:
Κωδικός παραγωγού
Ως εξής:
Κωδικός καταναλωτή
Ως εξής:
Λήψη πηγαίου κώδικα
Τουρίστες, αν θέλετε να δείτε το κρυφό περιεχόμενο αυτής της ανάρτησης, παρακαλώ Απάντηση
|