संदेश आदेश गारंटी
1) "क्रम" क्या है और इसकी आवश्यकता क्यों है
संदेशों का क्रम एक "क्या संसाधित किया जाना चाहिए" एक इकाई (क्रम, उपयोगकर्ता, बटुआ) की घटनाओं के लिए या पूरे धारा के लिए संबंध। यह आक्रमणकारियों के लिए महत्वपूर्ण है: "स्टेटस ए बिफोर बी", "राइट-ऑफ से पहले संतुलन", "एन + 1 से पहले संस्करण एन।"
वितरित प्रणालियों में, वैश्विक कुल आदेश महंगा है और शायद ही कभी आवश्यकता हो एक स्थानीय प्रति-कुंजी आदेश आमतौर पर पर्याप्त होता है।
2) आदेश की गारंटी के प्रकार
1. प्रति-विभाजन (लॉग सेक्शन में स्थानीय आदेश) - काफ्का: पार्टी के भीतर आदेश संरक्षित है, पार्टियों के बीच - नहीं।
2. प्रति कुंजी (कुंजी/संदेश समूह ऑर्डर करना) - एक कुंजी के साथ सभी संदेश प्रसंस्करण के एक "थ्रेड" में रूट किए जाते हैं (काफ्का कुंजी, SQS FIFO MessegroupId, पब/सब ऑर्डरिंग कुंजी)।
3. वैश्विक कुल आदेश - पूरी प्रणाली एक एकल आदेश (वितरित पत्रिका/सीक्वेंसर) देखती है। महंगी, गिरावट उपलब्धता और थ्रूपुट।
4. कारण क्रम - "ईवेंट बी आफ ए यदि बी प्रभाव ए" को वैश्विक सीक्वेंसर के बिना मेटाडेटा (संस्करण, लैम्पोर्ट-टाइम्स/वेक्टर घड़ियों) के माध्यम से पहुंचने योग्य बनाता है।
5. सर्वश्रेष्ठ प्रयास आदेश - दलाल आदेश को बनाए रखने की कोशिश करता है, लेकिन विफलताओं के मामले में, क्रमपरिवर्तन संभव है (अक्सर कई उपभोक्ताओं के साथ NATS कोर, RabbitMQ में)।
3) जहां आदेश टूटता है
एक ही कतार के समानांतर उपभोक्ता (RabbitMQ: प्रति कतार कई उपभोक्ता → इंटरलेविंग)।
रिट्रेज ़/री-डिलीवरी (कम से कम एक बार), 'एके' टाइमआउट, री-कतार।
पुनर्संतुलन/फीलोवर (काफ्का: पार्टी/नेता चाल)।
डीएलक्यू/पुनर्प्रसंस्करण - "जहरीला" संदेश डीएलक्यू को जाता है, अगले लोग आगे जाते हैं - एक तार्किक विराम।
बहु-क्षेत्र और प्रतिकृति - विभिन्न देरी - गलतफहमी।
4) प्रमुख आदेश डिजाइन
कुंजी "ऑर्डरिंग यूनिट" बनाती है। "सिफारिशें:- प्राकृतिक कुंजियाँ इस्तेमाल करें: 'क्रम _ id', 'बटुआ _ id', 'समुच्चय _ id'.
- "हॉट कीज़" के लिए देखें - एक कुंजी प्रवाह (हेड-ऑफ-लाइन ब्लॉकिंग) को "ब्लॉक" कर सकती है। यदि आवश्यक हो, तो कुंजी को विभाजित करें: 'ord _ id # shard (0. k-1) 'सिंक पर आदेश के नियतात्मक पुनर्निर्माण के साथ।
- काफ्का में - एक कुंजी → एक भाग, क्रम कुंजी के भीतर संरक्षित किया जाएगा।
java producer.send(new ProducerRecord<>("orders", orderId, eventBytes));
(कुंजी = 'ordId' स्थानीय क्रम की गारंटी देता है।)
5) "ऑर्डर बनाम बैंडविड्थ"
मजबूत गारंटी अक्सर थ्रूपुट और उपलब्धता के साथ संघर्ष करती है:- प्रति कतार एक उपभोक्ता ऑर्डर रखता है लेकिन संगामिति को कम करता है।
- कम से कम एक बार + संगति प्रदर्शन में सुधार करती है, लेकिन इसके लिए पहचान और/या पुन: व्यवस्था की आवश्यकता होती है।
- वैश्विक आदेश सीक्वेंसर → ↑latentnost और विफलता के जोखिम को जोड़ ता है।
समझौता: प्रति-कुंजी क्रम, समानतावाद = पार्टियों/समूहों की संख्या, + अज्ञात चोट।
6) विशिष्ट दलालों में आदेश का नियंत्रण
काफ्का
पार्टी के भीतर आदेश।
देखें 'max। में। उड़ान। अनुरोध। per. कनेक्शन ≤ 5 'с' सक्षम। पहचान = सही 'ताकि निर्माता के रिट्रेज़ऑर्डर को न बदलें।
उपभोक्ता समूह: एक पार्टी - एक समय में एक कार्यकर्ता। दोहराया प्रसव संभव है → व्यापार परत में अनुक्रम/संस्करण रखें।
रीड-प्रोसेस-राइट लेनदेन रीड/राइट/क्रम्ब ऑफसेट स्थिरता बनाए रखते हैं, लेकिन वैश्विक आदेश नहीं बनाते हैं।
उत्पादन न्यूनतम (उत्पादक गुण)::properties enable.idempotence=true acks=all retries=2147483647 max.in.flight.requests.per.connection=5
RabbitMQ (AMQP)
एक घाघ के लिए एक कतार में आदेश की गारंटी है। संदेशों के कई उपभोक्ताओं के साथ "मिश्रित" आ सकता है।
आदेश के लिए: एक उपभोक्ता या प्रीफेच = 1 + ack जब समाप्त हो जाता है। संगति के लिए, कुंजियों द्वारा अलग-अलग कतारें (शार्डिंग एक्सचेंज/सुसंगत-हैश एक्सचेंज)।
NATS/JetStream
NATS कोर - सबसे अच्छा प्रयास, कम विलंबता, आदेश परेशान हो सकता है।
जेटस्ट्रीम: स्ट्रीम/अनुक्रम के भीतर आदेश; पुनर्वितरण के दौरान, कंसोल पर पुनर्व्यवस्था संभव है → अनुक्रम और वसूली बफर का उपयोग करें।
SQS FIFO
बिल्कुल एक बार प्रसंस्करण (प्रभावी रूप से, deduplication के कारण) और MesegroupId के भीतर ऑर्डर। संगोष्ठी - एक हेड-ऑफ-लाइन समूह के भीतर समूहों की संख्या।
गूगल पब/सब
आदेश कुंजी कुंजी के भीतर क्रम देता है; त्रुटियों के मामले में, प्रकाशन को बहाल होने तक अवरुद्ध कर दिया जाता है - बैकप्रेशर के लिए बाहर देखें।
7) संरक्षण और बहाल करने के पैटर्न
7. 1 अनुक्रम/वर्शनिंग
प्रत्येक घटना में एक 'seq '/' संस्करण' होता है। Concummer:- एक घटना केवल तभी लेता है जब 'seq = last_seq + 1';
- अन्यथा - लापता ('लास्ट _ seq + 1') के आने से पहले प्रतीक्षा बफर में डाल देता है।
pseudo if seq == last+1: apply(); last++
else if seq > last+1: buffer[seq] = ev else: skip // дубль/повтор
7. 2 बफर्स और विंडो (स्ट्रीम प्रोसेसिंग)
टाइम-विंडो + वॉटरमार्क: हम खिड़की के भीतर आउट-ऑफ-ऑर्डर स्वीकार करते हैं, वॉटरमार्क के अनुसार हम खिड़की को "बंद" करते हैं और इसे व्यवस्थित करते हैं।
अनुमत विलंबता: देर से आने के लिए चैनल (पुनर्निर्मित/अनदेखा)।
7. 3 कुंजी द्वारा स्टिकी-रूटिंग
हैश (कुंजी)% शार्ड हैश राउटिंग एक कार्यकर्ता को सभी प्रमुख घटनाओं को भेजता है।
कुबेरनेट्स में - कतार/शेर स्तर पर एक सत्र (चिपचिपा) बनाए रखें, न कि L4 HTTP संतुलन पर।
7. 4 अभिनेता-मॉडल/" प्रति कुंजी एक धारा"
महत्वपूर्ण समुच्चय (बटुआ) के लिए: अभिनेता क्रमिक रूप से प्रक्रिया करता है, बाकी समानतावाद - अभिनेताओं की संख्या।
7. 5 पहचान + पुनर्आदेश
आदेश की बहाली के साथ भी, दोहराव संभव है। कुंजी + संस्करण और इनबॉक्स द्वारा UPSERT को मिलाएं (वास्तव में एक बार बनाम कम से कम-एक बार देखें)।
8) "जहरीले" संदेशों के साथ काम करें (जहर की गोलियाँ)
आदेश बनाए रखने का सामना कार्य के साथ किया जाता है: "अगर एक संदेश संसाधित नहीं किया जाता है तो कैसे जीना है?"
सख्त आदेश: कुंजी प्रवाह अवरुद्ध (SQS FIFO: पूरा समूह)। समाधान बाय-की डीएलक्यू है: हम केवल समस्या कुंजी/समूह को एक अलग कतार/मैनुअल पार्सिंग में स्थानांतरित करते हैं।
लचीला आदेश: हम लंघन/मुआवजे की अनुमति देते हैं; हम लॉग करें और जारी रखें (वित्त/महत्वपूर्ण समुच्चय के लिए नहीं)।
रिट्रे पॉलिसी: सीमित 'मैक्स-डिलीवरी' + बैकऑफ + avidempotent प्रभाव।
9) बहु-क्षेत्र और वैश्विक प्रणाली
क्लस्टर-लिंकिंग/प्रतिकृति (काफ्का) एक अंतर वैश्विक व्यवस्था की गारंटी नहीं देता है। स्थानीय प्रति-कुंजी क्रम और पहचानने वाले चोटों को प्राथमिकता दें।
वास्तव में-वैश्विक आदेश के लिए, एक सीक्वेंसर (केंद्रीय लॉग) का उपयोग करें, लेकिन यह उपलब्धता को प्रभावित करता है (सीएपी: नेटवर्क ब्रेक के लिए माइनस ए)।
वैकल्पिक: कुछ डोमेन (काउंटर, सेट) के लिए कारण आदेश + सीआरडीटी - किसी सख्त आदेश की आवश्यकता नहीं है।
10) आदेश की अवलोकन क्षमता
Метрики: 'out _ out _ of _ ord _ total', 'reordered _ in _ window _ total', 'let _ events _ total', 'booker _ keys _ total', 'fifo _ group _ backlog'।
11) एंटी-पैटर्न
एक कतार + कई उपभोक्ताओं को कुंजी पर शेयर किए बिना - आदेश तुरंत टूट जाता है।
एक ही कतार में फिर से जनता के माध्यम से रेट्राई बिना पहचान के - डबल्स + आउट-ऑफ-ऑर्डर।
वैश्विक "सिर्फ मामले में" आदेश बिना किसी वास्तविक लाभ के विलंबता और मूल्य का विस्फोट है।
सभी के लिए SQS FIFO एक समूह - पूर्ण हेड-ऑफ-लाइन। प्रति कुंजी MessageGroupId का उपयोग करें।
"हॉट कीज़" को नजरअंदाज करना - एक "वॉलेट" सब कुछ धीमा कर देता है; जहां संभव हो, कुंजी को उप-कुंजियों में विभाजित करें।
एक ही कतार/समूह में महत्वपूर्ण और थोक धाराओं का मिश्रण - आपसी प्रभाव और व्यवस्था का नुकसान।
12) कार्यान्वयन चेकलिस्ट
- प्रति-कुंजी/प्रति-विभाजन/कारण/वैश्विक?
- अनुक्रमण कुंजी और एंटी-हॉट कुंजी रणनीति डिजाइन की गई।
- राउटर कॉन्फ़िगर किया गया: पार्टिशनिंग/मैसेजिंग ग्रुपआईडी/ऑर्डरिंग कुंजी।
- कंसोल को चाबियों (चिपचिपा-मार्ग, शार्ड-वर्कर्स) द्वारा अलग किया जाता है।
- चोटों पर Idempotency और/या Inbox/UPSERT शामिल हैं।
- कार्यान्वित अनुक्रम/संस्करण और पुनर्आदेश बफर (यदि आवश्यक हो)।
- प्रमुख नीति और बैकऑफ़रिट्रेज़द्वारा DLQ।
- आउट-ऑफ-ऑर्डर, blocked_keys, late_events ऑर्डर और अलर्ट मेट्रिक्स।
- खेल दिवस: पुनर्संतुलन, नोड हानि, जहरीला संदेश, नेटवर्क देरी।
- प्रलेखन: आदेश अपरिवर्तनीय, खिड़की की सीमा, एसएलए पर प्रभाव।
13) कॉन्फ़िगरेशन उदाहरण
13. 1 काफ्का उपभोक्ता (आदेश उल्लंघन न्यूनतम)
properties max.poll.records=500 enable.auto.commit=false # коммит после успешной обработки батча isolation.level=read_committed
13. 2 RabbitMQ (संगामिति की कीमत द्वारा आदेश)
एक उपभोक्ता प्रति कतार + 'मूल। qos (प्रीफेच = 1) '
संगामिति के लिए - कई कतारें और हैश-एक्सचेंज:bash rabbitmq-plugins enable rabbitmq_consistent_hash_exchange публикуем с хедером/ключом для консистентного хеша
13. 3 SQS FIFO
MangeGroupId = कुंजी सेट करें। समूहों की संगति = संख्या।
डुप्लिकेट्स (प्रदाता विंडो में) के खिलाफ सुरक्षा के लिए संगठन Dedupl Id।
13. 4 NATS JetStream (उपभोक्ता, स्केच का आदेश दिया)
bash nats consumer add ORDERS ORD-KEY-42 --filter "orders.42.>" --deliver pull \
--ack explicit --max-deliver 6
कुंजी> 'अनुक्रम' की निगरानी करें और अनुप्रयोग में बफर को फिर से ऑर्डर करें।
14) एफएक्यू
प्रश्न: क्या मुझे वैश्विक व्यवस्था की आवश्यकता है?
A: लगभग कभी नहीं। लगभग हमेशा पर्याप्त प्रति-कुंजी। वैश्विक व्यवस्था महंगी है और सामर्थ्य को हिट करती है।
प्रश्न: सख्त आदेश के तहत "जहरीला" संदेश के बारे में क्या?
A: केवल अपनी कुंजी/समूह को DLQ में स्थानांतरित करें, बाकी - जारी रखें।
प्रश्न: क्या आप एक ही समय में ऑर्डर और स्केल प्राप्त कर सकते हैं?
A: हां, कुंजी क्रम + कई कुंजी/भागों + पहचान संक्रियाएं और जहां आवश्यक हो बफ़र्स को फिर से ऑर्डर करना।
प्रश्न: कौन सा अधिक महत्वपूर्ण है: आदेश या बिल्कुल एक बार?
A: अधिकांश डोमेन के लिए - कुंजी क्रम + प्रभावी रूप से बिल्कुल-एक बार प्रभाव (पहचान/UPSERT)। परिवहन कम से कम एक बार हो सकता है।
15) कुल
ऑर्डर व्यवसाय कुंजी के आसपास एक स्थानीय गारंटी है, न कि एक महंगा वैश्विक अनुशासन। डिजाइन कुंजी और पार्टियां, गर्म कुंजियों को सीमित करें, पहचान का उपयोग करें और, जहां आवश्यक हो, अनुक्रम + पुन: आदेश बफर। आउट-ऑफ-ऑर्डर और अवरुद्ध कुंजी मैट्रिक्स के लिए देखें, परीक्षण क्रैश - और आप प्रदर्शन या उपलब्धता का त्याग किए बिना पूर्वानुमानित प्रसंस्करण प्राप्त करते हैं।