संदेश कतारें: RabbitMQ, काफ्का
संदेश कतारें: RabbitMQ, काफ्का
1) कब चुनना है
RabbitMQ (AMQP 0-9-1/1। 0, क्लासिक कतारें, कोरम कतारें, धाराएँ)
इसके लिए उपयुक्त: आरपीसी/कमांड, वर्कफ़्लो, लघु कार्य, फैनआउट/विषय मार्ग, लचीली पुष्टि, प्राथमिकता नियंत्रण।
पेशेवरों: समृद्ध रूटिंग शब्दार्थ (एक्सचेंज), 'बुनियादी। qos '(प्रीफेच), प्रति-संदेश TTL/देरी, सुविधाजनक RPC (उत्तर-टू) पैटर्न, आसान शुरुआत।
विपक्ष: कतार में संग्रहीत इतिहास, कतारों/शार्क में क्षैतिज रूप से बढ़ाया गया; बहुत बड़े प्रवाह के साथ उच्च थ्रूपुट-लागत।
अपाचे काफ्का (इवेंट लॉग, पार्टियां, उपभोक्ता समूह)
इसके लिए उपयुक्त: इवेंट स्ट्रीम, ऑडिटिंग, इवेंट सोर्सिंग, ईटीएल/एकीकरण (कनेक्ट), उच्च आरपीएस/एमबीपी, रीप्ले/री-प्रोसेसिंग, स्ट्रीम प्रोसेसिंग (स्ट्रीम/केएसक्यूएलडीबी)।
पेशेवरों: दीर्घकालिक पत्रिका, पार्टियों द्वारा स्केलिंग, स्थिर रीप्ले, प्रमुख
विपक्ष: पुल + पार्टियों मॉडल - छोटे आरपीसी के लिए नहीं; केवल पार्टी के भीतर आदेश; स्कीमा प्रबंधन/इंटरऑपरेबिलिटी टीम की जिम्मेदारी है।
2) वितरण शब्दार्थ और अपरिवर्तनीय
सबसे अधिक एक बार: कोई रिट्रेज़नहीं; तेजी से, नुकसान का जोखिम।
कम से कम एक बार: पीछे हटने के साथ; उपभोक्ता की पहचान की आवश्यकता है।
बिल्कुल एक बार: सीमित परिस्थितियों में प्राप्त करने योग्य (काफ्का TX + पहचान निर्माता + सुसंगत सिंक; RabbitMQ - deduplication table/idempotent कुंजियों के माध्यम से)।
आदेश: RabbitMQ - कतार आदेश (रेट्रास/बहु-उपभोक्ताओं के साथ उल्लंघन किया जा सकता है); पार्टी में काफ्का - क्रम, कुंजी विभाजन सेट करता है।
डोमेन अपरिवर्तनीय: धन/शेष - पत्रिकाओं/सागा और पहचानने वाली टीमों के माध्यम से; LWW पर भरोसा न करें।
3) एकीकरण पैटर्न
आउटबॉक्स/इनबॉक्स: डेटाबेस में घटना की परमाणु रिकॉर्डिंग → कतार (आउटबॉक्स) के लिए प्रकाशन और प्रसंस्करण लॉग (इनबॉक्स) के साथ अज्ञात खपत।
DLQ (मृत अक्षर): N प्रयास/त्रुटियों के बाद - DLQ + अलर्ट में।
पुनरावृत्ति/देरी: RabbitMQ - TTL + मृत-अक्षर विनिमय; काफ्का - बैकऑफ के साथ पुनः प्रयास विषय।
निवेदन/जवाब: RabbitMQ - 'उत्तर _ to' + 'सहसंबंध _ id'; काफ्का - शायद ही कभी, केवल विशेष पैटर्न के साथ।
मुआवजे: घटनाओं पर सागा; प्रत्येक ऑपरेशन में एक व्युत्क
4) कुंजी और टोपोलॉजी डिजाइन
RabbitMQ
एक्सचेंज: 'डायरेक्ट', 'टॉपिक', 'फैनआउट', 'हेडर'।
रूटिंग कुंजी: कतार हिट (ओं) को निर्दिष्ट करता है। प्राथमिकता के लिए - अलग कतारें।
QoS: 'प्रीफेच' (उदा। 50-300) संतुलन दर/विलंबता।
कोरम कतारें: बेड़ा पर दोहराई गई कतारें; प्रतिस्थापन क्लासिक प्रतिबिंबित।
धाराएँ: उच्च-थ्रूपुट/रीप्ले के लिए ऑफसेट (काफ्का जैसी) के साथ धारा।
काफ्का
विषय - विभाजन: लक्ष्य थ्रूपुट और समानतावाद पर '# विभाजन' की योजना बनाएं (पिछड़ेसंगत वृद्धि में कमी की तुलना में आसान है)।
कुंजी: एक कुंजी के सभी रिकॉर्ड - एक भाग में (कुंजी द्वारा क्रम की गारंटी)।
प्रतिकृति कारक: उत्पादक विषयों के लिए 3, 'min. insync। विश्वसनीयता के लिए प्रतिकृतियाँ = 2 '+' अक्स = सभी '।
प्रतिधारण: समय/आकार द्वारा; संघनन - विलोपन के लिए कुंजी + समाधि पत्थर द्वारा अंतिम मानों को संग्रहीत करता है।
5) रेट्राई, डीएलक्यू, पहचान
RabbitMQ
दोहराता है: बैकऑफ के साथ प्रति-संदेश TTL + DLX (मृत-अक्षर विनिमय) (उदाहरण के लिए, 1m → 5m → 15m)।
पहचान: 'सहसंबंध _ id '/' संदेश-आईडी' + संसाधित संदेश तालिका (TTL) या नियतात्मक आदेश.
पुष्टि: मैनुअल 'बेसिक। ack 'सफल लेनदेन के बाद;' बुनियादी। nack (requeue = गलत) 'в DLQ।
काफ्का
दोहराव: व्यक्तिगत पुनरावृत्ति विषय; सफल दुष्प्रभाव के बाद उपभोक्ता ऑफसेट करता है।
वास्तव में एक बार प्रसंस्करण (ईओएस): निर्माता सक्षम। पहचान = सही ', लेन-देन उत्पादक/उपभोक्ता, उपभोक्ता पर' पढ़ें _ प्रतिबद्ध '; सिंक (उदाहरण के लिए, Kafka→Kafka या Kafka→DB एक लेनदेन के माध्यम से) - बड़े करीने से तुल्यकालित।
डेडअप: बेस साइड पर कुंजी/पहचान कुंजी द्वारा, या संपीड़ित विषय के माध्यम से।
6) प्रदर्शन और आयाम
लिटिल का नियम: 'L = ć × W'
वोर्कर के लिए: आवश्यक ओवरलैपिंग 'N ≈ arrival_rate × avg_processing_time × स्टॉक (1। 2–1. 5)`.
RabbitMQ प्रीफेच: 'प्रीफेच = 100' के साथ शुरू करें और p99/इन-फ्लाइट टाइम को मापें।
काफ्का विभाजन: वांछित उपभोक्ता समानता और थ्रूपुट लक्ष्य से गणना (उदाहरण के लिए, 1 बैच SSD/10GbE पर 5-20 MB/s स्थिर है)।
7) अवलोकन और अलर्ट
सामान्य:- लैग/बैकलॉग (संदेश/बाइट्स), संदेशों की आयु (p95/p99), प्रसंस्करण की त्रुटि-दर, डीएलक्यू-दर।
- समय "publikatsiya→obrabotka" (अंत-से-अंत)।
- निर्भरता का नक्शा: निर्माता → दलाल → उपभोक्ता।
- कनेक्शन, चैनल, नॉन-एक्केड संदेश, 'मेमोरी _ अलार्म', 'डिस्क _ फ्री _ लिमिट', 'कतार लंबाई' p95.
- कोरम पर रिपोर्ट (नेता, रफ लॉग, 'कोरम पर्याप्त नहीं' याद करता है)।
- अंडर-दोहराए गए विभाजन, आईएसआर सिकुड़ ता/विस्तार, नियंत्रक परिवर्तन।
- निर्माता त्रुटियां (टाइमआउट, 'अनुरोध विलंबता'), उपभोक्ता अंतराल प्रति समूह/विभाजन।
- ब्रोकर I/O, पेज कैश हिट, GC, ZooKeeper/KRaft स्वास्थ्य।
8) सुरक्षा और बहु-किरायेदारी
TLS इन-ट्रांजिट एन्क्रिप्शन, प्रमाणीकरण (SASL/PLAIN/SCRAM/OAuth, mTLS)।
प्राधिकरण: vhost/amments (RabbitMQ), ACL को विषय/समूह (काफ्का)।
कोटा: कनेक्शन, चैनल, कतार आकार/विषय, प्रकाशन/पढ़ने की गति के लिए।
वातावरण द्वारा अलगाव (dev/stage/prod) और namespace/vhost द्वारा।
9) ऑपरेशन और ट्यूनिंग
RabbitMQ
नोड्स के लिए पोस्ट एक्सचेंज/कतारें (सीपीयू/आईओ राजधानी)।
बड़े बफ़र्स के लिए आलसी कतारें (डिस्क को संदेश); बिना शार्डिंग के "गर्म" कतारों से बचें।
एचए के लिए कोरम कतारें; प्लान रफ लॉग आकार और डिस्क।
टीटीएल/लंबाई-सीमा नीतियां, केवल वास्तविक आवश्यकता (महंगी) के लिए प्राथमिकता कतारें।
DLQ/TTL नीति उदाहरण (विचार):bash rabbitmqctl set_policy DLX "^task\." \
'{"dead-letter-exchange":"dlx","message-ttl":60000,"max-length":100000}' --apply-to queues
काफ्का
एसएसडी/एनवीएमई, तेज नेटवर्क; ओएस ट्यूनिंग (स्वैपनेस कम, फ़ाइल सीमा)।
'aks = सभी', 'linger। ms '(कसाई),' संपीड़न। बैंडविड्थ के लिए टाइप = zstd '/lz4।
उपभोक्ता विकल्प: 'अधिकतम। सर्वेक्षण। अंतराल। ms ',' अधिकतम। सर्वेक्षण। रिकॉर्ड्स ',' प्राप्त करें। min. बाइट्स '।
प्रतिधारण और संघनन - भंडारण संतुलन/पुनरावृत्ति।
विश्वसनीय प्रकाशन का उदाहरण (जावा, विचार):java props. put("acks","all");
props. put("enable. idempotence", "true");
props. put("max. in. flight. requests. per. connection","1");
props. put("retries","10");
10) एकीकरण और पारिस्थितिकी तंत्र
काफ्का कनेक्ट (सिंक/स्रोत), स्कीमा रजिस्ट्री (एवरो/जेसन/प्रोटोबुफ) और इंटरऑपरेबिलिटी ('बैकवर्ड/फॉरवर्ड/फुल')।
काफ्का स्ट्रीम/ksqlDB: स्टेटफुल ऑपरेशन, विंडो, एग्रीगेट्स।
RabbitMQ फावड़ा/महासंघ: समूहों/केंद्रों के बीच स्थानांतरण।
K8s ऑपरेटर: स्ट्रिमज़ी (काफ्का), रैबिटएमक्यू क्लस्टर ऑपरेटर; GitOps घोषणापत्र।
11) कार्यान्वयन चेकलिस्ट (0-45 दिन)
0-10 दिन
उपयोग-मामलों को परिभाषित करें: कमांड/कार्य (RabbitMQ), घटनाओं/ऑडिट (काफ्का)।
कुंजी चुनें ('रूटिंग कुंजी '/' पार्टिशन कुंजी'), SLO "publikatsiya→obrabotka" सेट करें।
बुनियादी सुरक्षा नीतियां (टीएलएस, एसीएल), कोटा, डीएलक्यू/टीटीएल।
11-25 दिन
आउटबॉक्स/इनबॉक्स, आइडेम्पोटेंसी और डेडअप लागू करें।
बैकऑफ के साथ रिट्रीस सेट करें (खरगोश: TTL + DLX; काफ्का: रीट्री टॉपिक्स)।
डैशबोर्ड: लैग, एज, डीएलक्यू-रेट, एंड-टू-एंड लेटेंसी; अलर्ट।
26-45 दिन
ट्यूनिंग बैंडविड्थ: प्रीफेच/एक्स (खरगोश); विभाजन/acks/बैच (काफ्का)।
डीआर प्रक्रियाएं (दर्पण/प्रतिकृति), नोड विफलता परीक्षण।
दस्तावेज़ घटना अनुबंध (स्कीमा) और इंटरऑपरेबिलिटी नीतियां।
12) एंटी-पैटर्न
सभी कार्यों के लिए एक "सार्वभौमिक" उपकरण।
DLQ/TTL की अनुपस्थिति: शाश्वत जहर (जहर संदेश)।
असीमित 'प्रीफेच' - उपभोक्ता भुखमरी, p99 वृद्धि।
कुंजियों के बिना काफ्का → डिफ़ॉल्ट रूप से आदेश/गर्म पार्टियों का नुकसान।
"बिल्कुल एक बार", बिना किसी वास्तविक आवश्यकता/अनुशासन के, सुरक्षा की झूठी भावना है।
TLS/ACL के बिना कोड में रहस्य/लॉगिन।
रजिस्ट्री और पलायन के बिना संदेशों की योजनाओं/संस्करणों का हार्डकोड।
13) परिपक्वता मैट्रिक्स
लैग/आयु एसएलओ समय का ≥ 99% प्रदर्शन किया जाता है; नियंत्रण में DLQ-दर।
आइडेम्पोटेंसी में 100% महत्वपूर्ण रास्ते शामिल हैं; आउटबॉक्स/इनबॉक्स लागू किया गया।
प्रतिधारण/संपीड़न प्रलेखित हैं, रिप्ले उपभोक्ताओं को नहीं तोड़ ता है।
आईएसआर/यूआरपी (काफ्का) और रफ/डिस्क लिमिट (खरगोश) पर अलर्ट स्थापित किए गए हैं।
इवेंट कॉन्ट्रैक्ट को वर्शन किया जाता है (स्कीमा रजिस्ट्री), 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
काफ्का उपभोक्ता (विचार):
java props. put("enable. auto. commit","false");
props. put("isolation. level","read_committed"); // при EOS
//...
poll -> process(idempotent) -> commitSync()
15) निष्कर्ष
RabbitMQ और Kafka समस्याओं के विभिन्न वर्गों को हल करते हैं: एक दीर्घकालिक घटना लॉग और स्केलेबल स्ट्रीमिंग के खिलाफ कमांड/कार्य और समृद्ध मार्ग। सफलता - सही डिलीवरी शब्दार्थ में, निष्क्रियता का अनुशासन, विचारशील कुंजी, रिट्रेज ़/डीएलक्यू, अवलोकन और सख्त सुरक्षा। कतारों के आसपास इंजीनियरिंग प्रथाओं का निर्माण करें - आउटबॉक्स/इनबॉक्स, स्कीमा और GitOps नीतियां - और आपका एकीकरण अनुमानित, स्केलेबल और टिकाऊ हो जाता है।