टास्क कतारें और संतुलन
1) कार्य कतारें क्यों
कार्य कतार/कार्य कतार समय और गति से निर्माताओं और कलाकारों को डिस्कनेक्ट करती है:- चिकनी चोटियाँ: सामने और भारी सबसिस्टम के बीच बफर।
- एसएलए को स्थिर करता है: प्राथमिकताएं और लोड कक्षाओं का अलगाव।
- सरलीकरण गलती सहिष्णुता: रिट्रेज़, डीएलक्यू, फिर से मंचन।
- क्षैतिज रूप से तराजू: एपीआई को बदले बिना श्रमिकों को जोड़ें।
विशिष्ट डोमेन: भुगतान प्रसंस्करण, सूचनाएं, रिपोर्ट/मीडिया जनरेशन, ईटीएल/एमएल पोस्टप्रोसेसिंग, बाहरी एपीआई के साथ एकीकरण।
2) मॉडल और बुनियादी अवधारणाएं
निर्माता: कार्य प्रकाशित करता है (पेलोड + मेटाडेटा: पहचान कुंजी, प्राथमिकता, समय सीमा)।
कतार/विषय: बफर/लॉग ऑफ़ कार्य।
श्रमिक: एक कार्य, प्रक्रिया, पुष्टि (ack) लेता है या एक त्रुटि के साथ लौटाता है।
दृश्यता समय समाप्ति/पट्टा: प्रसंस्करण की अवधि के लिए "किराया" कार्य, के बाद - ऑटो-पुनर्वितरण।
DLQ (मृत पत्र कतार): प्रयासों/घातक त्रुटियों की सीमा के बाद "दफन" कार्य।
दर सीमा/संगोष्ठी: प्रति-कार्यकर्ता/प्रति-कतार/प्रति-किरायेदार खपत सीमा।
वितरण मॉडल:- पुल: कार्यकर्ता स्वयं कार्य का अनुरोध करता है (भार को खुराक देता है)।
- पुश: ब्रोकर फ्लफ्स; कमजोर श्रमिकों को "भरने" से सुरक्षा की आवश्यकता है
3) वितरण और पुष्टि शब्दार्थ
सबसे अधिक एक बार: कोई रिट्रेज़नहीं; तेज, लेकिन संभावित नुकसान
कम से कम एक बार (अधिकांश कतारों के लिए डिफ़ॉल्ट): डुप्लिकेट संभव हैं - हैंडलर आइडेम्पोटेंसी की आवश्यकता है।
प्रभावी रूप से बिल्कुल एक बार: आवेदन स्तर पर प्राप्त (पहचान, डीडप, लेनदेन/आउटबॉक्स)। एक दलाल मदद कर सकता है, लेकिन "जादू की गोली नहीं।"
पुष्टि:- Ack/Nack: स्पष्ट परिणाम।
- Requeue/Retry: с बैकऑफ + jitter।
- जहर संदेश - डीएलक्यू को भेजें।
4) संतुलन और योजना
4. 1 अनुक्रम और एल्गोरिदम
फीफो: सरल और अनुमानित।
प्राथमिकता कतार: प्राथमिकता वर्ग (P0..। P3)।
WRR/WSR (भारित राउंड-रॉबिन/रैंडम): CPU शेयर/कक्षाओं के बीच ट्रांसपुट।
WFQ/DRR (नेटवर्क में "निष्पक्ष" कतारों के अनुरूप): प्रति किरायेदार/ग्राहक शेयर।
डेडलाइन/ईडीएफ: समय सीमा के साथ कार्यों के लिए।
फेयर शेयर: "शोर पड़ोसियों" (प्रति-किरायेदार कोटा) को सीमित करना।
4. 2 प्रसंस्करण प्रवाह
सिंगल-फ्लाइट/कोलसिंग: डुप्लिकेट कुंजी कार्यों को मिलाएं।
कॉन्क्यूरेंसी कैप: टास्क टाइप/एकीकरण (बाहरी एपीआई) द्वारा समानतावाद पर सख्त सीमाएं।
4. 3 जियो और शार्डनिंग
कुंजी (किरायेदार/आईडी) द्वारा शार्ड्स → डेटा का इलाका, शार्क के भीतर स्थिर आदेश।
स्टिकी कैश/संसाधन: एक "संलग्न" राज्य के साथ श्रमिकों को हैश रूटिंग।
5) रेट्राई, बैकऑफ और डीएलक्यू
घातीय बैकऑफ + जिटर: 'बेस 2 ^ प्रयास' यादृच्छिक '।
प्रति कार्य अधिकतम प्रयास और कुल समय सीमा (समय-से-मरना)।
त्रुटियों का वर्गीकरण: 'पुनर्प्राप्य' (नेटवर्क/सीमा), 'गैर-प्रतिशोधी' (सत्यापन/व्यवसाय निषेध)।
पार्किंग/देरी कतार: आस्थगित कार्य (उदाहरण के लिए, 15 मिनट के बाद दोहराएं)।
DLQ नीति: यह इंगित करना सुनिश्चित करें कि "जहरीला" संदेश कहां और किन परिस्थितियों में मिलता है; एक पुनर्प्रसंस्करण प्रदान करें।
6) पहचान और कमी
कार्य में पहचान-कुंजी; अंतिम N कुंजियों के लिए TTL के साथ स्टोर (Redis/DB):- देखा → स्किप/मर्ज/रिजल्ट-कैश।
- प्राकृतिक कुंजियाँ: यादृच्छिक UUID के बजाय 'order _ id/ payment_id' का उपयोग करें।
- आउटबॉक्स - कार्य के तथ्य और उसकी स्थिति को व्यापार लेनदेन के साथ एक डेटाबेस लेनदेन में रिकॉर्ड करता है।
- बिल्कुल नीले रंग में एक बार: 'UPSERT' कुंजी, वर्शनिंग, डेटाबेस में कतार + पहचान में "कम से कम एक बार"।
7) मल्टी-टेनेंसी और एसएलए कक्षाएं
वर्ग द्वारा अलग कतारें/धाराएँ: 'महत्वपूर्ण', 'मानक', 'थोक'।
प्रति किरायेदार कोटा और प्राथमिकताएं (स्वर्ण/रजत/कांस्य)।
अलगाव: P0 के तहत श्रमिकों के पूल समर्पित; पृष्ठभूमि - एक अलग क्लस्टर/नोड्स में।
प्रवेश नियंत्रण: समय सीमा में प्रक्रिया से अधिक स्वीकार न करें।
8) स्वचालित श्रमिकों
स्केलिंग के लिए मेट्रिक्स: कतार की गहराई, आगमन दर, प्रसंस्करण समय, एसएलए समय सीमा।
KEDA/क्षैतिज पॉड ऑटोस्केलर: SQS/खरगोश/काफ्का गहराई ट्रिगर।
निरोधक कारक: बाहरी दर एपीआई, डेटाबेस (बैक एंड को नष्ट न करें) को सीमित करती है।
9) प्रौद्योगिकी विकल्प और पैटर्
9. 1 RabbitMQ/AMQP
एक्सचेंज: डायरेक्ट/टॉपिक/फैनआउट; कतारें с ack/ttl/DLQ (मृत-अक्षर विनिमय)।
प्रीफेच (QoS) "कार्यकर्ता पर कितने कार्य हैं" को नियंत्रित करता है।
DLX उदाहरण:ini x-dead-letter-exchange=dlx x-dead-letter-routing-key=jobs.failed x-message-ttl=60000
9. 2 SQS (और एनालॉग्स)
दृश्यता समय समाप्ति, Seconds, RedrivePolice (DLQ)।
पहचान - अनुप्रयोग पर (डीडअप तालिका)।
सीमा: कसाई 1-10 पद; पहचानने वाले चोटों पर ध्यान केंद्रित करें।
9. 3 काफ्का/एनएटीएस जेटस्ट्रीम
बड़े पैमाने पर पाइपलाइनों के लिए: उच्च थ्रूपुट, प्रतिधारण/रीप्ले।
लॉग पर कार्य कतार: एक कार्य = एक संदेश; विभाजन के माध्यम से/विषय विभाजन के माध्यम से प्रति मुख्
रिट्राई: बैकऑफ के साथ व्यक्तिगत विषय/विषय-प्रत्यय।
9. 4 रेडिस कतारें (साइडकिक/रेस्क/बुल/सेलेरी-रेडिस)
बहुत कम विलंबता; स्थिरता के लिए देखें (RDB/AOF), एकल-उड़ान के लिए चाबियाँ और लॉक-कुंजियाँ।
"प्रकाश" कार्यों के लिए उपयुक्त, दीर्घकालिक प्रतिशोध के लिए नहीं।
9. 5 फ्रेमवर्क
अजवाइन (अजगर), साइडकीक (रूबी), आरक्यू/बुलएमक्यू (नोड), ह्यूई/रेस्क - रेडी-मेड रिट्रेज़, शेड्यूल, मिडलवेयर, मेट्रिक्स।
10) रूटिंग और बैलेंसिंग योजनाएं
राउंड-रॉबिन: समान रूप से लेकिन कार्यों की "गंभीरता" को ध्यान में नहीं रखता है।
भारित आरआर: श्रमिक क्षमता/पूल द्वारा वितरण।
निष्पक्ष/बैकप्रेशर-जागरूक: कार्यकर्ता तैयार होने पर केवल एक नया कार्य करता है।
प्राथमिकता लेन: प्रति वर्ग अलग कतारें; कार्यकर्ता उपलब्ध होने पर क्रम में पढ़ ते हैं [ ...]।
हैश-रूटिंग: 'हैश (कुंजी)% शार्क' - स्टेटफुल/कैश्ड प्रोसेसिंग के लिए।
11) टाइमआउट, डेडलाइन और एसएलए
प्रति-कार्य समय समाप्ति: काम का आंतरिक "पट्टा" (कार्यकर्ता कोड में) ≤ ब्रोकर की दृश्यता टाइमआउट।
वैश्विक समय सीमा: टी समय के बाद कार्य का कोई मतलब नहीं है - NACK→DLQ।
बजट-जागरूक: समय सीमा (आंशिक परिणाम) के करीब पहुंचने पर काम (ब्राउनआउट) को कम करें।
12) अवलोकन और प्रबंधन
12. 1 मेट्रिक्स
'queue _ depth', 'Arvision _ rate', 'service _ rate', 'lag' (Kafka), 'अदृश्य _ messages' (SQS)।
'success/असफलता/सेवानिवृत्त _ कुल', 'retry _ pression', 'dlq _ in _ tomal', 'processing _ ms _ ms {p50, p95, p99}'।
'idempotency _ hit _ rate', 'dedup _ drops _ total', 'ज़हर _ total'।
12. 2 लॉग/ट्रेसिंग
सहसंबंध: 'job _ id', 'correlation _ id', deduplication कुंजी।
'रीट्री/बैकऑफ/डीएलक' को घटनाओं के रूप में चिह्नित करें; प्रारंभिक अनुरोध से लिंकिंग।
12. 3 डैशबोर्ड/अलर्ट
ट्रिगर्स: गहराई> X, p99> SLO, DLQ वृद्धि, अटक कार्य (दृश्यता समाप्त> N), गर्म कुंजियाँ।
13) सुरक्षा और अनुपालन
किरायेदार अलगाव: व्यक्तिगत कतारें/प्रमुख स्थान, एसीएल, कोटा।
परिवहन पर एन्क्रिप्शन और/या "आराम पर"।
पेलोड में पीआईआई न्यूनतम; क्रूड पीआईआई के बजाय हैश/आईडी।
रहस्य: कार्य निकाय में टोकन नहीं डालें, तिजोरी/refs का उपयोग करें।
14) एंटी-पैटर्न
रेट्राई बिना पहचान के → डुप्लिकेट ऑपरेशन/पैसा "दो बार"।
एक विशाल कतार "सब कुछ के लिए" - कोई अलगाव नहीं, अप्रत्याशित देरी।
DLQ → शाश्वत "जहरीले" कार्यों के बिना अंतहीन रेट्राई।
दृश्यता समय समाप्ति <प्रसंस्करण समय → कैस्केडेड डुप्लिकेट।
कतार में बड़ा पेलोड → नेटवर्क/मेमोरी दबाव; किसी वस्तु स्टोर में स्टोर करना और लिंक स्थानांतरित करना बेहतर है।
बैकप्रेशर के बिना पुश मॉडल - वर्कर्स चोक।
श्रमिकों के एक पूल में महत्वपूर्ण और थोक कार्यों को मिलाना।
15) कार्यान्वयन चेकलिस्ट
- SLA (P0/P1/P2) और वॉल्यूम द्वारा कार्यों को वर्गीकृत करें।
- वांछित शब्दार्थ और प्रतिधारण के साथ एक दलाल/ढांचा चुनें।
- डिजाइन कुंजी, प्राथमिकताएं और रूटिंग (हैश/शार्ड्स/प्राथमिकता लेन)।
- बैकऑफ + जिटर रिट्रेज़और डीएलक्यू पॉलिसी सक्षम करें।
- पहचान को लागू करें (चाबियाँ, अपसर्ट, टीटीएल के साथ डेडस्टोर)।
- प्रति-कार्य, दृश्यता और सामान्य समय सीमा निर्धारित करें।
- एकीकरण/किरायेदारों द्वारा संगामिति और दर सीमित करें।
- फ्यूज के साथ गहराई/लैग ऑटो-स्केलिंग।
- मेट्रिक्स/ट्रेसिंग/अलर्ट; "तूफान" और डीएलक्यू ओवरफ्लो पर रनबुक।
- विफल होने के लिए परीक्षण: कार्यकर्ता का पतन, "जहरीला" संदेश, अधिभार, लंबे कार्य।
16) नमूना कॉन्फ़िगरेशन और कोड
16. 1 अजवाइन (रेडिस/खरगोश) - आधार प्रवाह
python app = Celery("jobs", broker="amqp://...", backend="redis://...")
app.conf.task_acks_late = True # ack после выполнения app.conf.broker_transport_options = {"visibility_timeout": 3600}
app.conf.task_default_retry_delay = 5 app.conf.task_time_limit = 300 # hard timeout
@app.task(bind=True, autoretry_for=(Exception,), retry_backoff=True, retry_jitter=True, max_retries=6)
def process_order(self, order_id):
if seen(order_id): return "ok" # идемпотентность do_work(order_id)
mark_seen(order_id)
return "ok"
16. 2 RabbitMQ - DLQ/TTL
ini x-dead-letter-exchange=dlx x-dead-letter-routing-key=jobs.dlq x-message-ttl=600000 # 10 минут x-max-priority=10
16. 3 काफ्का - स्तर द्वारा रिट्रेज़
orders -> orders.retry.5s -> orders.retry.1m -> orders.dlq
(शेड्यूलर/क्रॉन-उपभोक्ता के माध्यम से विलंबित डिलीवरी के साथ स्थानां
16. 4 NATS JetStream - उपभोक्ता с बैकऑफ
bash nats consumer add JOBS WORKERS --filter "jobs.email" \
--deliver pull --ack explicit --max-deliver 6 \
--backoff "1s,5s,30s,2m,5m"
17) एफएक्यू
प्रश्न: पुश बनाम पुल कब चुनें?
A: पुल प्राकृतिक बैकप्रेशर और "ईमानदार" संतुलन देता है; पुश कम गति पर आसान है और जब न्यूनतम टीटीएफबी की आवश्यकता होती है, लेकिन सीमाओं की आवश्यकता होती है।
प्रश्न: गर्म कुंजी से कैसे बचें?
A: कंपोजिट कुंजी ('ऑर्डर _ id% N'), बफर और बैच-प्रक्रिया द्वारा शार्ड, प्रति-कुंजी सीमा दर्ज करें।
प्रश्न: क्या "बिल्कुल एक बार" संभव है?
A: व्यावहारिक रूप से - निष्क्रियता और लेन-देन के आउटबॉक्स के माध्यम से। पूरी तरह से "गणितीय" बिल्कुल एक बार शायद ही कभी प्राप्त करने योग्य और महंगा होता है।
प्रश्नः बड़े कार्य संलग्नक कहाँ संग्रहीत करें?
A: वस्तु भंडारण (S3/GCS) में, और कार्य - लिंक/ID में; दलाल और नेटवर्क पर दबाव कम करता है।
प्रश्नः टीटीएल/दृश्यता कैसे चुनें?
A: दृश्यता ≥ p99 प्रसंस्करण समय × स्टॉक 2-3 ×। टीटीएल कार्य - कम व्यापार समय सीमा।
18) कुल
एक मजबूत कतार प्रणाली वितरण शब्दार्थ, प्राथमिकताओं और बाधाओं के बीच एक संतुलन है। डिजाइन कुंजी और रूटिंग, पहचान सुनिश्चित करना, बैकऑफ और डीएलक्यू के साथ रिट्रे करना, एसएलए कक्षाओं को संसाधन आवंटित करना और मैट्रिक्स की निगरानी करना। फिर आपकी पृष्ठभूमि प्रक्रियाएं अनुमानित, स्थिर और स्केलेबल होंगी - चोटियों के नीचे कोई आश्चर्य नहीं।