Ουρές μηνυμάτων: RabbitMQ, Kafka
Ουρές μηνυμάτων: RabbitMQ, Kafka
1) Πότε να επιλέξετε
RabbitMQ (AMQP 0-9- 1/1. 0, κλασικές ουρές, ουρά απαρτίας, ρεύματα)
Κατάλληλο για: RPC/εντολές, ροή εργασίας, σύντομες εργασίες, δρομολόγηση fanout/θέμα, ευέλικτες επιβεβαιώσεις, έλεγχος προτεραιότητας.
Υπέρ: πλούσια σημασιολογία δρομολόγησης (ανταλλαγές), 'βασική. qos '(prefetch), ανά μήνυμα TTL/καθυστέρηση, βολικό RPC (reply-to) μοτίβα, εύκολη εκκίνηση.
Cons: Ιστορικό αποθηκευμένο σε σειρά αναμονής, κλιμακωμένο οριζόντια σε ουρές/θραύσματα. Υψηλό κόστος διεκπεραίωσης με πολύ μεγάλες ροές.
Apache Kafka (ημερολόγιο εκδηλώσεων, μέρη, ομάδες καταναλωτών)
Κατάλληλο για: ροές γεγονότων, λογιστικός έλεγχος, προμήθεια γεγονότων, ETL/ολοκλήρωση (Connect), υψηλές RPS/MBp, επανάληψη/επανεπεξεργασία, επεξεργασία ροής (Streams/ksqlDB).
Pros: μακροπρόθεσμο περιοδικό, κλιμάκωση κατά μέρη, σταθερή επανάληψη, συμπίεση κλειδιού.
Cons: μοντέλο pull + parties - όχι για μικρά RPC· διαταγή μόνο εντός του διαδίκου· η διαχείριση/διαλειτουργικότητα σχημάτων αποτελεί ευθύνη της ομάδας.
2) Σημασιολογία παράδοσης και αναλλοίωτες
Το πολύ μία φορά: χωρίς retrays. ταχεία, κίνδυνος απώλειας.
Τουλάχιστον μία φορά: με υποχωρήσεις. απαιτεί την ευελιξία των καταναλωτών.
Ακριβώς μία φορά: εφικτό υπό περιορισμένες συνθήκες (παραγωγός Kafka TX + idempotent + σταθερό νεροχύτη. RabbitMQ - μέσω του πίνακα αφαίρεσης/idempotent κλειδιά).
Παραγγελία: RabbitMQ - σειρά αναμονής (μπορεί να παραβιαστεί με ρετράς/πολλαπλούς καταναλωτές)· Κάφκα - τάξη στο κόμμα, το κλειδί καθορίζει την κατάτμηση.
Domain invariants: χρήματα/υπόλοιπα - μέσω περιοδικών/sagas και ομάδων idempotent? δεν βασίζονται στην LWW.
3) Πρότυπα ολοκλήρωσης
Outbox/InBox: ατομική καταγραφή του γεγονότος στη βάση δεδομένων → δημοσίευση στην ουρά αναμονής (outbox) και idempotent κατανάλωση με το ημερολόγιο επεξεργασίας (inbox).
DLQ (νεκρά γράμματα): μετά από N απόπειρες/σφάλματα - σε DLQ + συναγερμό.
Retry/Καθυστέρηση: RabbitMQ - TTL + ανταλλαγή νεκρών γραμμάτων. Kafka - επανάληψη θεμάτων με backoff.
Αίτηση/απάντηση: RabbitMQ - «απάντηση _ στο» + «συσχέτιση _ id», Κάφκα - σπάνια, μόνο με ειδικά μοτίβα.
Αποζημιώσεις: sagas για γεγονότα. κάθε πράξη έχει αντίστροφο.
4) Βασικός και τοπολογικός σχεδιασμός
RabbitMQ
Ανταλλαγές: 'direc ,' topic ',' fanout ',' headers '.
Πλήκτρο δρομολόγησης: Προσδιορίζει το (τα) χτύπημα (-α) αναμονής. Για την ιεράρχηση - ξεχωριστές ουρές αναμονής.
QoS: 'prefetch' (π.χ. 50-300) επιτόκιο υπολοίπων/καθυστέρηση.
Απαρτία αναμονής: αναπαραγωγή αναμονής σε Raft? αντικατάσταση καθρεφτισμένη κλασική.
Ροές: ροή με αντισταθμίσεις (όπως το Kafka) για υψηλής απόδοσης/επανάληψη.
Kafka
Θεματικές κατατμήσεις: σχεδιάστε '# κατατμήσεις' για τη διεκπεραίωση του στόχου και τον παραλληλισμό (η προς τα πίσω συμβατή αύξηση είναι ευκολότερη από τη μείωση).
Κλειδί: όλες οι εγγραφές ενός κλειδιού - σε ένα μέρος (εγγύηση κατά κλείδα).
Συντελεστής αναπαραγωγής: 3 για παραγωγικά θέματα, 'min. insync. αντίγραφα = 2 '+' acks = όλα 'για αξιοπιστία.
Κατακράτηση: κατά χρόνο/μέγεθος. συμπίεση - αποθηκεύει τις τελευταίες τιμές κατά κλειδιά + ταφόπλακες για διαγραφή.
5) Retrai, DLQ, idempotency
RabbitMQ
Επαναλήψεις: ανά μήνυμα TTL + DLX (ανταλλαγή νεκρών γραμμάτων) με backoff (για παράδειγμα, 1m → 5m → 15m).
Ταυτότητα: 'συσχέτιση _ id '/' message-id' + επεξεργασμένος πίνακας μηνυμάτων (TTL) ή ντετερμινιστικές εντολές.
Επιβεβαιώσεις: εγχειρίδιο 'basic. ack «μετά την επιτυχή συναλλαγή·» βασική. nack (requeue = false) 'в DLQ.
Kafka
Επαναλήψεις: μεμονωμένα θέματα επαναπροσδιορισμού. ο καταναλωτής αναλαμβάνει υποχρεώσεις αντιστάθμισης μετά από επιτυχή παρενέργεια.
Ακριβώς μετά τη μεταποίηση (EOS): Ο παραγωγός "επιτρέπει. idempotence = true ', transactional production/consumer,' read _ consulted 'on consumer· βυθίζονται (για παράδειγμα, Kafka→Kafka ή Kafka→DB μέσω συναλλαγής) - συγχρονίζονται τακτικά.
Dedup: με πλήκτρο/idempotent πλήκτρο στη βασική πλευρά, ή μέσω συμπιεσμένου θέματος.
6) Επιδόσεις και διάσταση
Νόμος του Little 's: 'L = λ × W'
Απαιτούμενο επικαλυπτόμενο απόθεμα «N ≈ arrival_rate × avg_processing_time ×» (1. 2–1. 5)`.
RabbitMQ prefetch: Ξεκινήστε με 'prefetch = 100' και μετρήστε p99/χρόνο πτήσης.
Kafka χωρίσματα: υπολογισμός από τον επιθυμητό καταναλωτικό παραλληλισμό και στόχο απόδοσης (για παράδειγμα, 1 παρτίδα είναι σταθερή 5-20 MB/s σε SSD/10GbE).
7) Παρατηρησιμότητα και προειδοποιήσεις
Γενικά:- Lag/Backlog (μηνύματα/ψηφιολέξεις), ηλικία μηνυμάτων (p95/p99), ποσοστό σφάλματος επεξεργασίας, ρυθμός DLQ.
- Χρόνος «publikatsiya→obrabotka» (από το τέλος έως το τέλος).
- Χάρτης εξάρτησης: παραγωγός-μεσίτης καταναλωτής.
- Συνδέσεις, κανάλια, μηνύματα χωρίς βελόνες, 'memory _ alarm', 'disk _ free _ limit', 'queue length' p95.
- Αναφορές για την απαρτία (επικεφαλής, Raft log, χάνει «απαρτία όχι αρκετή»).
- Υπο-αναπαραγόμενα χωρίσματα, ISR συρρικνώνονται/επεκτείνονται, αλλαγές ελεγκτή.
- Σφάλματα παραγωγού (χρονικά περιθώρια, «καθυστέρηση αίτησης»), υστέρηση καταναλωτή ανά ομάδα/κατάτμηση.
- Broker I/O, page cache hit, GC, ZooKeeper/Kraft health.
8) Ασφάλεια και πολυπλοκότητα
TLS in-transit κρυπτογράφηση, επαλήθευση ταυτότητας (SASL/PLAIN/SCRAM/OAuth, mTLS).
Έγκριση: vhost/άδειες (RabbitMQ), ACL για θέματα/ομάδες (Kafka).
Ποσοστώσεις: για συνδέσεις, κανάλια, μέγεθος σειράς αναμονής/θέμα, ταχύτητα δημοσίευσης/ανάγνωσης.
απομόνωση ανά περιβάλλον (dev/stage/prod) και ανά χώρο ονομάτων/vhost.
9) Λειτουργία και ρύθμιση
RabbitMQ
Ταχυδρομικές ανταλλαγές/ουρές προς κόμβους (κεφάλαιο CPU/IO).
Τεμπέλικες ουρές (μηνύματα προς δίσκο) για μεγάλα ρυθμιστικά διαλύματα. να αποφεύγονται οι «θερμές» ουρές χωρίς στρίψιμο.
Ουρές απαρτίας για HA· Σχεδιασμός του αρχείου καταγραφής και του δίσκου Raft.
Πολιτικές περιορισμού του TTL/μήκους, ουρές προτεραιότητας μόνο για πραγματικές ανάγκες (ακριβές).
bash rabbitmqctl set_policy DLX "^task\." \
'{"dead-letter-exchange":"dlx","message-ttl":60000,"max-length":100000}' --apply-to queues
Kafka
SSD/NVMe, γρήγορα δίκτυα· Συντονισμός OS (χαμηλό swappiness, όρια αρχείων).
'acks = al ,' linger. m (butching), 'συμπίεση. τύπος = zstd '/lz4 για εύρος ζώνης.
Επιλογές καταναλωτών: 'max. poll. διάστημα. κα ',' max. δημοσκόπηση. αρχεία «,» φέρτε. min. bytes '.
Διατήρηση και συμπίεση - ισορροπία αποθήκευσης/αναπαραγωγή.
java props. put("acks","all");
props. put("enable. idempotence", "true");
props. put("max. in. flight. requests. per. connection","1");
props. put("retries","10");
10) Ολοκλήρωση και οικοσύστημα
Kafka Connect (καταβόθρες/πηγές), Schema Registry (Avro/JSON/Protobuf) και διαλειτουργικότητα ('BACKWARD/FORWARD/FULL').
Kafka Streams/ksqlDB: λειτουργίες stateful, παράθυρα, συγκεντρωτικά μεγέθη.
RabbitMQ Shovel/Ομοσπονδία: μεταφορά μεταξύ συστάδων/κέντρων.
χειριστές: Strimzi (Kafka), RabbitMQ Cluster Operator· Μανιφέστο GitOps.
11) Κατάλογος ελέγχου εφαρμογής (0-45 ημέρες)
0- 10 ηµέρες
Ορισμός περιπτώσεων χρήσης: εντολές/εργασίες (RabbitMQ), εκδηλώσεις/έλεγχοι (Kafka).
Επιλέξτε κλειδιά ('πλήκτρο δρομολόγησης '/' πλήκτρο κατάτμησης'), ορίστε SLO «publikatsiya→obrabotka».
Βασικές πολιτικές ασφάλειας (TLS, ACL), ποσοστώσεις, DLQ/TTL.
11-25 ημέρες
Εφαρμογή outbox/inbox, idempotency και deadup.
Set up retreas with backoff (Κουνέλι: TTL + DLX; Kafka: επανάληψη θεμάτων).
Dashboards: υστέρηση, ηλικία, ρυθμός DLQ, καθυστέρηση τέλους έως τέλους· ειδοποιήσεις.
26-45 ημέρες
Εύρος ζώνης ρύθμισης: prefetch/acks (Rabbit). χωρίσματα/άσκοι/παρτίδα (Kafka).
Διαδικασίες DR (αντανάκλαση/αντιγραφή), δοκιμές αστοχίας κόμβου.
Συμβάσεις γεγονότων εγγράφων (σχήματα) και πολιτικές διαλειτουργικότητας.
12) Αντι-μοτίβα
Ένα «καθολικό» εργαλείο για όλες τις εργασίες.
Απουσία DLQ/TTL: αιώνια δηλητήρια (δηλητηριώδη μηνύματα).
Απεριόριστη «πρόγνωση» → λιμοκτονία των καταναλωτών, p99 ανάπτυξη.
Κάφκα χωρίς κλειδιά → απώλεια παραγγελίας/θερμών κομμάτων εξ ορισμού.
«Ακριβώς μια φορά», χωρίς πραγματική ανάγκη/πειθαρχία, είναι μια ψευδής αίσθηση ασφάλειας.
Μυστικά/συνδέσεις στον κωδικό, χωρίς TLS/ACL.
Hardcode των συστημάτων/εκδόσεων μηνυμάτων χωρίς μητρώο και μετάβαση.
13) Μετρήσεις διάρκειας
Lag/ηλικία SLO εκτελείται ≥ 99% του χρόνου· Ρυθμός DLQ υπό έλεγχο.
Η ταυτότητα καλύπτει το 100% των κρίσιμων διαδρομών. Εφαρμόστηκε outbox/inbox.
Η διατήρηση/σύγκριση είναι τεκμηριωμένη, η αναπαραγωγή δεν σπάει τους καταναλωτές.
Δημιουργούνται ειδοποιήσεις για τα όρια ISR/URP (Kafka) και Raft/disk (Rabbit).
Οι συμβάσεις γεγονότων επαληθεύονται (Schema Registry), η συμβατότητα ελέγχεται σε CI.
Κανονικές ημέρες παιχνιδιού: κόμβος/μεσίτης/AZ αστοχία, έλεγχος ανάκτησης.
14) Παραδείγματα ρυθμίσεων (περίληψη)
RabbitMQ: πρόθεμα και επιβεβαιώσεις (ψευδοκώδικας):python channel. basic_qos(prefetch_count=200)
for msg in consume("tasks"):
try:
handle(msg)
channel. basic_ack(msg. delivery_tag)
except Transient:
channel. basic_nack(msg. delivery_tag, request = False) # will go to DLQ
Kafka Καταναλωτής (ιδέες):
java props. put("enable. auto. commit","false");
props. put("isolation. level","read_committed"); // при EOS
//...
poll -> process(idempotent) -> commitSync()
15) Συμπέρασμα
Οι RabbitMQ και Kafka λύνουν διαφορετικές κατηγορίες προβλημάτων: εντολές/εργασίες και πλούσια δρομολόγηση ενάντια σε ένα μακροπρόθεσμο ημερολόγιο γεγονότων και κλιμακωτή ροή. Επιτυχία - στη σωστή σημασιολογία, πειθαρχία της ιδεότητας, στοχαστικό πλήκτρο, retrays/DLQ, παρατηρησιμότητα και αυστηρή ασφάλεια. Οικοδόμηση τεχνικών πρακτικών γύρω από ουρές αναμονής - outbox/inbox, schemas, και GitOps πολιτικές - και η ενσωμάτωσή σας γίνεται προβλέψιμη, κλιμακωτή και βιώσιμη.