बैकेंड प्रतिक्रिया अनुकूलन: कतारें, async, backpressure
1) क्यों: लक्ष्य और एसएलओ
लक्ष्य फटने के तहत भी एक स्थिर तेज प्रतिक्रिया है। व्यापार इस एसएलओ को व्यक्त करता है:- API (CRUD/निर्देशिका): p95 ≤ 250-400 ms, त्रुटि दर <1%।
- भुगतान/निपटान (अतुल्यकालिक): पुष्टि के लिए आंतरिक एसएलए ≤ 2-5 मिनट, और ग्राहक - तत्काल 202/Accepted + स्थिति मतदाता/वेबहुक।
- WS/वास्तविक समय: RTT p95 ≤ 120 мс, डिस्कनेक्ट ≤ 0। 5%.
कुंजी: कतारों और सक्षम लोड सीमा के माध्यम से उपयोगकर्ता प्रतिक्रिया से "धीमी" चरणों (प्रदाता, डेटाबेस, बाहरी एपीआई) को खोलना।
2) मूल चित्र: जहां विलंबता ली जाती है
अड़ चनें: डेटाबेस (पूल/इंडेक्स), बाहरी प्रदाता (पीएसपी/गेम), ब्लॉकिंग I/O, GC/स्टॉप वर्ल्ड, JSON धारावाहिक, "भारी" एकत्रीकरण।
लक्षण: p99 वृद्धि, डीबी कनेक्शन कतार, रिट्रे फटना, पुन: तूफान।
एंटीडोट: अतुल्यकालिक पाइपलाइनें + बैकप्रेशर + टाइमआउट/रिट्रीट + पहचान।
3) अतुल्यकालिक पैटर्न: SEDA और CQRS
SEDA (मंचन घटना-संचालित वास्तुकला): प्रसंस्करण को चरणों में विभाजित करें (इंग्रेस → सत्यापन → लिखें → एकीकरण → अधिसूचना)। प्रत्येक की अपनी बारी और संगामिति सीमा है।
CQRS: अलग पढ़ ता है और लिखता है। लॉग/डेटाबेस में लिखना, पढ़ ना - अनुमान/कैश से।
आउटबॉक्स: घटना रिकॉर्ड के साथ परमाणु रूप से प्रकाशित होती है ("खोए हुए" संदेशों से बचें)।
सागा: वैश्विक लोगों के बजाय लेनदेन की भरपाई के साथ लंबी व्यावसायिक प्रक्रिया
4) कतारें और धाराएँ: चयन और ट्यूनिंग
RabbitMQ/NATS JetStream - कार्य कमांड (कार्य कतारें), काफ्का - रीप्ले के साथ घटनाएँ/धाराएँ।
सेटिंग्स जो प्रतिक्रिया को प्
प्रीफेच/अधिकतम इन-फ्लाइट: प्रति कार्यकर्ता एक साथ संसाधित संदेशों की संख्या को सीमित करें (उदाहरण के लिए, 16-64) ताकि डेटाबेस/बाहरी एपीआई को "क्लॉग" न करें।
Acker/दोहराता है: पहचान रिकॉर्डिंग के बाद 'ack'; घातीय देरी और जिटर दोहराता है।
DLQ/पार्किंग स्थल: कोई अंतहीन रिट्रीट नहीं हैं - एन के प्रयासों के बाद, डेड लेटर क्यू में जाता है।
विभाजन (काफ्का): आदेश देने के लिए सार द्वारा कुंजी (userId/txnId); पार्टियों की संख्या के माध्यम से समानतावाद।
5) बैकप्रेशर - कैसे डूबने के लिए नहीं
विचार: एसएलओ की विलंबता के भीतर आप जितना संसाधित कर सकते हैं उतना ही लें।
तकनीशियन:- प्रवेश नियंत्रण: प्रत्येक बाहरी निर्भरता के लिए सीमा प्रतियोगिता (सेमाफोर/वर्कर-पूल): डेटाबेस, पीएसपी, गेम प्रदाता।
- ट्रैफिक आकार: सेवा प्रवेश द्वार पर और महत्वपूर्ण मार्गों पर टोकन-बाल्टी/लीकी-बाल्टी।
- ऊपरी सीमा के साथ कतारें: जब पूरा होता है, तो पूंछ (429/503 + रेट्री-आफ्टर) को काट दें या आसप-बैच में स्थानांतरित करें।
- अनुकूली संगति (AIMD): सफलता पर समानता बढ़ाएं, टाइमआउट पर कमी करें।
- सर्किट ब्रेकर: बाहरी एपीआई की त्रुटियों/टाइमआउट द्वारा 'बंद open आधा-खुला'; जब खुला गिरावट (कैश/स्टब)।
गो सेम: = मेक (चान संरचना {}, 64 )//डीबी/पीएसपी के लिए प्रतिस्पर्धा की सीमा
फंक हैंडल (req) {
{चुनें
केस सेम <- संरचना {} {}:
स्थगित कवक () {<-sem} ()
ctx, रद्द करें: = संदर्भ। WithTimeout (req। ctx, 300time। मिलीसेकंड)
स्थगित रद्द करें ()
res, err: = db। करें (ctx, req)
यदि err = = संदर्भ। चयनित {metrics से अधिक। टाइमआउट। इंक (); वापसी भी धीमा ()}
वापसी ठीक है (रेस)
डिफ़ॉल्ट:
मेट्रिक्स। Backpressure। इंक ()
वापसी व्यस्त (429, "रीट्री-आफ्टर: 0। 2")
}
}
6) टाइमआउट, रिट्रीट और जिटर: "तीन जीवित व्हेल"
SLO से कम समय: यदि SLO 400 ms, DB/प्रदाता 250-300 ms के लिए समयसीमा; कुल अनुरोध टाइमआउट <400-600 एमएस।
रेट्राई सीमित और स्मार्ट: 1-2 अधिकतम प्रयास, केवल सुरक्षित संचालन (पहचान) के लिए, घातांक और जीटर के साथ।
कोलसिंग: एकल कुंजी के लिए कुल रिप्ले।
स्यूडोकोड (घातांक + जिटर):रेंज में प्रयास के लिए अजगर (0, 2):
कोशिश करें:
रिटर्न कॉल (डेप, टाइमआउट = 0। 3)
टाइमआउट को छोड़ कर:
बैकऑफ = (0। 05 (2attempt)) + यादृच्छिक। वर्दी (0, 0। 05)
नींद (बैकऑफ)
अपस्ट्रीम अनुपलब्ध उठाएँ
7) पहचान और कमी
डेटाबेस (अद्वितीय सूचकांक) में HTTP (जमा, भुगतान), 'ऑपरेशन _ id' पर पहचान-कुंजी।
इनबॉक्स/आउटबॉक्स: आने वाले वेबहूक - हमेशा 'इवेंट _ आईडी' द्वारा डीडुप के साथ अपरिवर्तनीय इनबॉक्स तालिका के माध्यम से; आउटबाउंड - लेनदेन द्वारा आउटबॉक्स से।
वास्तव में-एक बार "अर्थ में": हम बार-बार वितरण/निष्पादन की अनुमति देते हैं, लेकिन केवल एक प्रभाव है।
8) धीमी गति से संचालन के लिए तेज एपीआई
तुल्यकालिक प्रतिक्रिया: 201/202 + स्थिति URL ('/स्थिति/{ id} '), ETA और रेट्रो संकेत।
वेबहुक/सर्वर-प्रेषित घटना/डब्ल्यूएस - तैयार होने पर राज्य को धक्का दें।
क्लाइंट अनुशासन: 'रेट्री-आफ्टर', पहचान, मतदान सीमा।
प्रतिक्रिया का उदाहरण:json
HTTP/1। 1 202 स्वीकार किया
स्थान :/ v1/withdrawals/req_9f2/status
रीट्री-आफ्टर: 2
{
" : "" "राज्य": "प्रसंस्करण", " 2:
}
9) गर्म काम को कम करें
भारी चीजों को पृष्ठभूमि में रखें: परिवर्तन, एकत्रीकरण, सूचनाएं, DWH को लिखना।
कैश और अनुमान: आमतौर पर पढ़ें - छोटे टीटीएल और घटना विकलांगता के साथ कैश-अलग।
बैच पैटर्न: समूह बाहरी कॉल (उदा। एन एमएस में एक बार अनुरोध प्रदाता सीमा)।
क्रमबद्धता: सेवा-से-सेवा संचार के लिए फास्ट कोडेक (प्रोटोबुफ/एमएसजीपैक); JSON केवल किनारे पर।
10) डीबी नियंत्रण में
कनेक्शन पूल: ऊपरी सीमा (कोर/आईओ पर आधारित), पूल सक्षम करने के लिए कतारें।
सूचकांक और योजना: p95 व्याख्या + प्रतिगमन योजनाओं के ऑटोटेस्ट।
अनुरोध समय समाप्ति: संक्षिप्त, 'कथन _ timeout' (Postgres).
हॉट पंक्तियाँ/ताले: कुंजी शार्डिंग, आशावादी ताले (संतुलन संस्करण), "अखंड" लेनदेन के बजाय गाथा।
11) वेबसॉकेट/वास्तविक समय
न्यूज़ लेटर लिमिटर: बैच प्रसारण, अधिकतम msgs/sec प्रति कनेक्शन।
आंतरिक बैकप्रेशर: एक टोपी के साथ आउटबाउंड संदेश कतार; ओवरफ्लो पर - कम-प्राथमिकता छोड़ दें।
रिलीज के दौरान स्टिकी-रूटिंग और पीडीबी - ताकि फिर से जुड़े तूफान का उत्पादन न हो।
12) अवलोकन ताकि अनुमान न लगाया जा सके
मेट्रिक्स (RED/USE + backpressure):- 'request _ rate', 'त्रुटि _ ratio', 'latency _ p95/p99' on मार्ग।
- 'queue _ depth', 'lag _ seconds', 'comment _ inflight', 'retries _ total', 'dlq _ rate'।
- 'backpressure _ drops', 'प्रवेश _ अस्वीकार', 'सर्किट _ open'।
- Для БД: 'कनेक्शन _ in _ use/max', 'लॉक्स', 'स्लो _ queries'।
- ट्रेस: स्पैन 'कतार → वर्कर → db/psp' with टैग 'ऑपरेशन _ id', 'पार्टीशन', 'रीट्री'।
- लॉग: संरचनात्मक, 'ट्रेस _ आईडी' के साथ, पीआईआई के बिना; व्यक्तिगत "ओपन/क्लोज़सर्किट" घटनाएँ।
13) लोड परीक्षण
फटने के लिए ओपन-मॉडल (आगमन/सेकंड); सत्रों के लिए बंद मॉडल (वीयू)।
प्रोफाइल: संक्षिप्त विस्फोट 60-120 एस और 1-4 एच भिगोएं।
इंजेक्शन विफलताएं: बाहरी एपीआई को + 200-500 एमएस से धीमा करें, p99/retrai/कतारों को देखें।
ग्रीन ज़ोन मानदंड: कोई वृद्धि 'कतार _ लैग', स्थिर p95, 'dlq_rate≈0'।
14) सुरक्षा और विश्वसनीयता
टीएलएस/एमटीएलएस कतारें, संदेश हस्ताक्षर, स्कीमा निगरानी (एवरो/प्रोटोबुफ + स्कीमा रजिस्ट्री)।
आदर्श निर्माता (काफ्का), वास्तव में एक बार tx जहां उचित है।- अराजकता मोड: समय-समय पर लत को "ड्रॉप" करते हैं और गिरावट (सर्किट, फॉलबैक) को देखते हैं।
15) विन्यास के "टुकड़े" के उदाहरण
Nginx/दूत इनपुट आकार देना:nginx limit_req_zone $ binary _ remote _ addr zone = api: 10m दर = 20r/s;
सर्वर {सर्वर
स्थान/एपी/{
limit_req ज़ोन = एपी फट = 40 नोडले;
proxy_read_timeout 0। 6s; # SLO proxy_connect_timeout 0 से छोटा है। 2s;
}
}
RabbitMQ (प्रीफेच):
बुनियादी। Qos (prefetch_count = 32) # CPU/IO संतुलन
काफ्का उपभोक्ता (जावा टुकड़ा):
जावा प्रॉप्स। पुट ( Config। MAX_POLL_RECORDS_CONFIG, 200);
prs। पुट ( Config। , ;
prs। पुट ( Config। , ;
16) कार्यान्वयन चेकलिस्ट (प्रोड-रेडी)
- गंभीर पथ तुल्यकालिक प्रतिक्रिया और अतुल्यकालिक प्रसंस्करण (एसईडीए) में विभाजित हैं।
- बाहरी निर्भरता के लिए प्रवेश नियंत्रण और प्रतियोगिता सीमा।
- टाइमआउट एसएलओ से छोटे हैं; रेट्राई ≤ 2, घातांक और जीटर के साथ; कोलसिंग।
- सर्किट ब्रेकर + गिरावट (कैश/स्टब), आधी-खुली नीति।
- कतार/धाराएँ: प्रीफेच/इन-फ्लाइट, डीएलक्यू, प्रमुख बैच।
- Idempotency (operation_id/Idempotency-Key), Outbox/Inbox, deduplication।
- कैश: कैश-एक तरफ, छोटा TTL + इवेंट विकलांगता।
- डीबी: पूल लिमिट, statement_timeout, इंडेक्स, एंटी-लॉक रणनीतियाँ।
- डब्ल्यूएस: संदेश सीमा, कसाई, चिपचिपा-मार्ग, पीडीबी।
- अवलोकन: बैकप्रेशर/कतारें/रिट्रीज़मेट्रिक्स, एंड-टू-एंड ट्रेल्स, डैशबोर्ड।
- लोड और विफलता परीक्षण (ओपन + बंद, फट + सोक), ग्रीन ज़ोन मानदंड।
सारांश फिर से शुरू करें
एक तेज़ बैकेंड एक "एक और कैश बनाना" नहीं है, लेकिन एक नियंत्रित धारा: प्रवेश सीमित है, भारी - पृष्ठभूमि में, एक कतार और सीमा के साथ प्रत्येक चरण, रिट्रे दुर्लभ और स्मार्ट हैं, और सर्किट ब्रेकर और पहचार्स द्स द्स। टाइमआउट अनुशासन, अवलोकन और नियमित तनाव परीक्षण जोड़ें - और बाहरी प्रदाताओं के फटने और सनक के तहत भी आपका p95/p99 हरा रहेगा।