कनेक्शन पूल और विलंबता
कनेक्शन पूल और विलंबता
1) पूल की आवश्यकता क्यों है
कनेक्शन महंगे हैं (टीसीपी/टीएलएस हैंडशेक, प्रमाणीकरण, वार्म-अप)। पूल अनुमति देता है:- TTFB के नीचे रेडी-मेड कनेक्शन (रखने-रहने) → फिर से उपयोग करें।
- नियंत्रण संगति और पीछे हटने के हिमस्खलन के बजाय बैकप्रेशर देना।
- सही आकार और टाइमआउट के कारण p95/p99 पूंछ को कम करें।
मुख्य जोखिम: पूल में प्रतीक्षा कतारें, हेड-ऑफ-लाइन अवरुद्ध, कनेक्शन के लिए सामग्री और पीछे हटने का तूफान।
2) गणित आधार: पूल का आकार कैसे गिनें
हम लिटिल के नियम का उपयोग करते हैं: 'L = × W'। एक पूल के लिए, इसका मतलब है:- 'ć' औसत अनुरोध स्ट्रीम (RPS) है।
- 'डब्ल्यू' औसत कनेक्शन प्रति अनुरोध व्यस्त है (सेवा समय, नेटवर्क विलंबता और दूरस्थ सेवा संचालन सहित)।
- न्यूनतम पूल का आकार 'N _ min × × W' है।
- विविधताओं और p99 के लिए एक मार्जिन जोड़ें: हेडरूम 20-50%।
- उदाहरण: 300 आरपीएस, औसत होल्ड-टाइम 40 ms 'N _ min = 300 × 0। 04 = 12`. 50% के मार्जिन के साथ, 18 कनेक्शन हैं।
यदि पूंछ बड़ी हैं: महत्वपूर्ण रास्तों के लिए 'W _ p95' या 'W _ p99' पर विचार करें - पूल बढ़ ते हैं।
3) सामान्य डिजाइन सिद्धांत
1. संक्षिप्त डेटा पथ: पुन: उपयोग (जीवित रखें, HTTP/2/3 मल्टीप्लेक्सिंग)।
2. समानतावाद की सीमा: बैकएंड को भूनने की तुलना में जल्दी से (429/503) मना करना बेहतर है।
3. टाइमआउट> रिट्रीट: छोटे टाइमआउट और दुर्लभ जिटर रिट्रीट सेट करें।
4. क्लाइंट कतारें सर्वर कतारों (तेजी से फेल-फास्ट) से कम हैं।
5. Backpressure: जब पूल भरा होता है - तुरंत NACK/त्रुटि/collbeck "बाद में।"
6. लक्ष्य द्वारा पूल का अलगाव: डीबी, कैश, बाहरी पीएसपी - उनकी सीमा।
4) HTTP/1। 1 बनाम HTTP/2/3, जीवित रखें
HTTP/1। 1: एक समय में एक कनेक्शन अनुरोध (व्यावहारिक रूप से); प्रति मेजबान कई कनेक्शन के साथ एक पूल की आवश्यकता है।
HTTP/2: एक टीसीपी में स्ट्रीम मल्टीप्लेक्सिंग; कम कनेक्शन, लेकिन पैकेट खो जाने पर टीसीपी पर एचओएल-ब्लॉकिंग संभव है।
HTTP/3 (QUIC): UDP पर स्ट्रीमिंग स्वतंत्रता - कम HOL समस्याएं, तेजी से पहली बाइट्स।
सेटिंग्स जो मदद करती हैं:- 30-90 (प्रोफाइल द्वारा), कनेक्शन के अनुरोधों की सीमा (सुंदर रीसायकल) रखना।
- कार्यकर्ता की शुरुआत में प्रीकनेक्ट (प्रीकनेक्ट)।
- अधिकतम प्रवाह प्रति HTTP/2 (उदा। 100-200).
nginx upstream backend {
server app-1:8080;
server app-2:8080;
keepalive 512;
keepalive_requests 1000;
keepalive_timeout 60s;
}
proxy_http_version 1. 1;
proxy_set_header Connection "";
दूत (HTTP/2 पूल):
yaml http2_protocol_options:
max_concurrent_streams: 200 common_http_protocol_options:
idle_timeout: 60s max_connection_duration: 3600s
5) डीबी पूल: Pgbouncer, HikariCP, ड्राइवर
लक्ष्य प्रतिस्पर्धी लेनदेन को सीमित करना और छोटा कनेक्शन रखना है।
5. 1 Pgbouncer (PostgreSQL)
मोड: 'सत्र '/' लेनदेन '/' कथन'। एपीआई के लिए - अधिक बार लेनदेन।
महत्वपूर्ण पैरामीटर 'पूल _ size', 'min _ pool _ size', 'reserve _ pool _ size', 'server _ idle _ timeout', 'query _ wate _ timeout' हैं।
ini
[databases]
appdb = host=pg-primary port=5432 dbname=appdb
[pgbouncer]
pool_mode = transaction max_client_conn = 5000 default_pool_size = 100 min_pool_size = 20 reserve_pool_size = 20 query_wait_timeout = 500ms server_idle_timeout = 60 server_reset_query = DISCARD ALL
5. 2 HikariCP (जावा)
छोटे, तेज कनेक्शन, कठिन समय।
properties dataSourceClassName=org. postgresql. ds. PGSimpleDataSource maximumPoolSize=30 minimumIdle=5 connectionTimeout=250 validationTimeout=200 idleTimeout=30000 maxLifetime=1800000 leakDetectionThreshold=5000
नियम:
- 'maximumPoolSize ≈ RPS × W × हेडरूम'।
- 'connimesteout' hundreds मिलीसेकेंड्स, सेकंड नहीं।
- रिसाव का पता लगाना सक्षम करें।
5. 3 गो/नोड/पायथन - उदाहरण
जाओ http। क्लाइंट (पुन: उपयोग + टाइमआउट):go tr:= &http. Transport{
MaxIdleConns: 512,
MaxIdleConnsPerHost: 128,
IdleConnTimeout: 60 time. Second,
TLSHandshakeTimeout: 2 time. Second,
}
c:= &http. Client{
Transport: tr,
Timeout: 2 time. Second ,//general
}
नोड। जेएस रखने वाला एजेंट:
js const http = require('http');
const agent = new http. Agent({ keepAlive: true, maxSockets: 200, maxFreeSockets: 64, timeout: 60000 });
Psycopg/SQLAlchemy (अजगर):
python engine = create_engine(
url, pool_size=30, max_overflow=10, pool_recycle=1800, pool_pre_ping=True, pool_timeout=0. 25
)
6) प्रतीक्षा कतारें और पूंछ-विलंबता
पूंछ तब होती है जब:- पूल '× × W' से छोटा है - कनेक्शन कतार बढ़ रही है।
- बफर और सीमा के बिना असमानता (फटना) लोड करें।
- लंबे अनुरोध कनेक्शन लेते हैं और एक HOL बनाते हैं।
- अनुरोध प्रकार (तेज/धीमी) द्वारा अलग पूल।
- क्लाइंट-साइड टाइमआउट लागू करें। यदि समाप्त हो गया - तेजी से NACK।
- मार्गों पर बाहरी पहचान और सर्किट-ब्रेकिंग (दूत, HAProxy)।
- "भारी" मार्गों के लिए कोटा, रिपोर्ट/निर्यात के लिए एक अलग पूल।
yaml circuit_breakers:
thresholds:
- priority: DEFAULT max_connections: 200 max_pending_requests: 100 max_requests: 1000 max_retries: 2
7) टाइमआउट और रिट्रीट (सही क्रम)
1. कनेक्ट टाइमआउट (संक्षिप्त: 50-250 एमएस डीसी के अंदर)।
2. TLS हैंडशेक टाइमआउट (500-1000 ms вне DC)।
3. अनुरोध/पढ़ें समय समाप्ति (मार्ग एसएलओ के करीब)।
4. पुनरावृत्ति: अधिकतम 1 समय, केवल अज्ञात विधियों के लिए; जिटर + बैकऑफ।
5. रिट्रे बजट: आरपीएस के प्रतिशत के रूप में वैश्विक सीमा (उदाहरण के लिए, ≤ 10%)।
8) जीवित रखें, नागल, प्रोटोकॉल
छोटे संदेश RPC के लिए Nagle (TCP_NODELAY) अक्षम करें।
जहाँ भी संभव हो, HTTP रखने को सक्षम करें.
TIME_WAIT - ट्यून 'पुन: उपयोग '/' रीसायकल' केवल तभी देखें जब आप परिणामों को समझते हैं; बेहतर - पुन: उपयोग कनेक्शन, कर्नेल ट्यूनिंग नहीं।
TLS - सत्र फिर से शुरू और ALPN का उपयोग करें।
9) ओएस/कर्नेल ट्यूनिंग (सावधानी के साथ)
'नेट। कोर। somaxconn ',' नेट। ipv4। ip_local_port_range', 'नेट। ipv4। tcp_fin_timeout'।
वर्णन: 'नोफाइल' ≥ 64k प्रति प्रॉक्सी प्रक्रिया।
आईआरक्यू बैलेंस, जीआरओ/एलआरओ - ट्रैफिक प्रोफाइल द्वारा।
प्राथमिकता - प्रोफ़ाइल मैट्रिक्स के बिना ट्यूनिंग अक्सर हानिकारक होती है।
10) अवलोकन: क्या मापना है
पूल उपयोग: व्यस्त/कुल, p50/p95 कनेक्शन लंबित।
इन-फ्लाइट अनुरोध और उनके होल्ड-टाइम (रूट स्लाइस)।
रिट्रे त्रुटि बजट: दोहराव का अनुपात।
कनेक्शन मंथन बनाएँ/बंद करें प्रति सेकंड।
TCP/TLS: SYN RTT, हैंडशेक, सत्र पुन: उपयोग।
Для БД: सक्रिय कनेक्शन, प्रतीक्षा, लंबे लेनदेन, ताले।
Графики: "आरपीएस बनाम पूल प्रतीक्षा", "होल्ड-टाइम वितरण", "पुन: उपयोग अनुपात", "सर्किट ट्रिप"।
11) केस रेसिपी
11. 1 एपीआई गेटवे → बैकएंड
HTTP/2 बैकएंड्स के लिए, 'max _ concurrent _ streams = 200'।
प्रति गेटवे नोड प्रति सेवा 20-40 कनेक्शन का एक पूल।
टाइमआउट: 100 एमएस कनेक्ट करें, प्रति-कोशिश 300-500 एमएस, 1-2 एस साझा किया, 1 जीटर के साथ रीट्री।
11. 2 Pgbounser के माध्यम से पोस्टग्रेस SQL → सेवा
सूत्र (RPS × W × 1) द्वारा 'पूल _ मोड = ट्रांजेक्शन', 'डिफ़ॉल्ट _ पूल _ साइज़'। 3).
'connectionTimeout≤250ms' में, लघु लेनदेन (<100 ms)।
भारी रिपोर्टिंग अनुरोध - अलग पूल/प्रतिकृति।
11. 3 जीआरपीसी आंतरिक
100-200 की थ्रेड सीमा के साथ एक चैनल (HTTP/2) प्रति लक्ष्य होस्ट।
SLO मार्ग पर RPC पर डेडलाइन, केवल पहचानने वाला।
लंबे आरपीसी नमूने और होल्ड-टाइम मैट्रिक्स का पता लगाते हैं।
12) कार्यान्वयन चेकलिस्ट (0-30 दिन)
0-7 दिन
प्रमुख मार्गों/ग्राहकों पर 'डब्ल्यू' (होल्ड-टाइम) मापते हैं।
'N _ min = × × W' and की गणना करें 30-50% हेडरूम जोड़ें।
संक्षिप्त कनेक्शन टाइमआउट रखना सक्षम करें.
8-20 दिन
अलग पूल (तेज/धीमा/बाहरी)।
सर्किट-ब्रेकर और रिट्रे बजट टाइप करें।
डैशबोर्ड जोड़ें: पूल प्रतीक्षा p95, पुन: उपयोग अनुपात, इन-फ्लाइट।
21-30 दिन
लोड फटने के साथ चलता है, अराजकता परीक्षण "बैकेंड का पतन।"
पूंछ अनुकूलन: भारी मार्गों का अलगाव, स्थानीय कैश।
दस्तावेज़ सूत्र और रनबुक 'एक्स में सीमाएँ।
13) एंटी-पैटर्न
पूल का आकार "यादृच्छिक पर" और कोई हेडरूम नहीं।
बड़े कनेक्शन वेटिंग टाइमआउट - तेज विफलताओं के बजाय लंबी पूंछ।
कई बिना किसी झटके और पहचान के पीछे हट जाते हैं - एक तूफान।
सभी अनुरोध प्रकारों के लिए एक साझा पूल।
लंबे लेन-देन कनेक्शन (डीबी) → बाकी की भुखमरी को बनाए रखते हैं।
विकलांग रखें-जीवित या बहुत छोटे निष्क्रिय - मंथन सीमा और टीटीएफबी विकास।
14) परिपक्वता मैट्रिक्स
पूल प्रतीक्षा p95 कुल p95 मार्ग का <10%।
आंतरिक HTTP के लिए पुनः उपयोग अनुपात (> 90%;> बाहरी के लिए 80%)।
DB txn समय p95 <100-200 ms; लंबे लेनदेन का प्रतिशत <1%।
पुन: प्रयास दर <5% (और ≤ बजट), टाइमआउट के कारण त्रुटियां स्थिर और अनुमानित हैं।
सभी महत्वपूर्ण ग्राहकों के लिए प्रलेखित पूल निप
15) निष्कर्ष
प्रभावी कनेक्शन पूलिंग कतार इंजीनियरिंग + टाइमआउट अनुशासन है। माप 'W', पूल की गणना करें × × W 'with एक मार्जिन, keep-alive/HTTP2 + को चालू करें, अलग धीमे रास्तों को चालू करें, शॉर्ट टाइमआउट रखें और जिटर के साथ न्यूनतम रेट्रा रखें। "पूल प्रतीक्षा बनाम विलंबता" अवलोकन और सर्किट-ब्रेकर जोड़ें - और आपको कम TTFB, नियंत्रित p99 पूंछ और ओवरहीटिंग बैकेंड्स के बिना उछाल प्रतिरोध मिलता है।