टीएल;डीआर
- समस्या: बड़े पैमाने की वास्तुकला (आर्किटेक्चर) तैयार करने के लिए उपलब्धता, थ्रूपुट और परिचालन जटिलता के बीच संतुलन बनाना आवश्यक है।
- मुख्य निष्कर्ष: शुरुआती लोगों के लिए यूआरएल शॉर्टनर सिस्टम डिज़ाइन: कोट-चेक कोड, क्रिएट और रीडायरेक्ट वॉक-थ्रू, बेस६२, स्टोरेज, कैश, और कदम-दर-कदम स्केल।
- परिणाम: उत्पादन वातावरण में विफलता से निपटने और प्रदर्शन लक्ष्यों को हासिल करने की सटीक रूपरेखा।
यूआरएल शॉर्टनर लंबी वेब एड्रेस को छोटी बनाता है, और जब कोई क्लिक करता है तो ब्राउज़र को मूल पेज पर भेज देता है। टाइनीयूआरएल और बिटली जैसे प्रोडक्ट यही करते हैं। लगभग हर ऐप के अंदर के शॉर्ट लिंक भी।
कोट-चेक सोचो। तुम एक लंबा भारी जैकेट देते हो। क्लर्क एक छोटा कागज़ का नंबर देता है। बाद में नंबर दिखाते हो और वही जैकेट वापस मिलता है। नंबर जैकेट नहीं है। यह एक टिकट है जो बताता है कि जैकेट कहाँ रखा है।
शॉर्ट यूआरएल इंटरनेट के लिए वही विचार है:
- लंबी यूआरएल जैकेट है (पूरा पता)।
- शॉर्ट कोड कोट-चेक नंबर है (या उस लंबे पते का निकनेम)।
- शॉर्टनर वह क्लर्क है जो लिस्ट रखता है: नंबर → जैकेट।
यह पोस्ट पहले क्लास की तरह पढ़ाता है। बिना मान ली गई जटिल भाषा के। हम एक क्रिएट, एक क्लिक, फिर एन्कोडिंग, स्टोरेज, कैश और स्केल चलते हैं।
हम कौन सी समस्या हल कर रहे हैं?
लंबी यूआरएल बदसूरत और शेयर करने में मुश्किल होती हैं:
https://shop.example.com/products/category/electronics/laptops/2026/model-x?utm_source=newsletter&ref=homepage
शॉर्टनर इसे कुछ ऐसा बना देता है:
https://sho.rt/aB3xY9q
दो काम मायने रखते हैं:
१. क्रिएट: लंबी यूआरएल लो, छोटा कोड बनाओ, मैपिंग याद रखो, शॉर्ट लिंक लौटाओ। २. रीडायरेक्ट: कोई शॉर्ट लिंक खोले तो लंबी यूआरएल ढूँढो और ब्राउज़र वहाँ भेजो।
बाकी सब (क्लिक स्टैट्स, कस्टम नाम, एक्सपायरी) अतिरिक्त है। पहले क्रिएट और रीडायरेक्ट सही करो।
कोट-चेक एक तस्वीर में
क्रिएट पथ (जैकेट सौंपना)
तुम → शॉर्टनर API → कोड चुनो → "कोड → लंबी यूआरएल" सेव → शॉर्ट लिंक लौटाओ
रीडायरेक्ट पथ (जैकेट वापस लेना)
दोस्त क्लिक करता है → शॉर्टनर कोड ढूँढता है → जवाब "लंबी यूआरएल पर जाओ"
→ ब्राउज़र असली पेज खोलता है
शॉर्ट डोमेन (sho.rt) कोट-चेक का डेस्क है। स्लैश के बाद वाला हिस्सा (aB3xY9q) तुम्हारे टिकट का नंबर है।
वॉक-थ्रू: शॉर्ट लिंक बनाना
मान लो तुम कोई प्रोडक्ट पेज शेयर करना चाहते हो। क्रिएट एपीआई कॉल करते हो।
रिक्वेस्ट (सरल)
POST /api/v1/links
Content-Type: application/json
{
"url": "https://shop.example.com/products/laptops/model-x"
}
सर्वर क्या करता है, कदम दर कदम
१. यूआरएल जाँच। सिर्फ सामान्य वेब लिंक (http या https)। खतरनाक स्कीम रोकें। लंबाई सीमित रखें ताकि कोई उपन्यास न चिपकाए।
२. शॉर्ट कोड बनाओ। जैसे aB3xY9q। कैसे बनता है, एन्कोडिंग सेक्शन में। अभी इसे यूनिक टिकट नंबर समझो।
३. मैपिंग सेव करो डेटाबेस में:
| code | long_url |
|---|---|
| aB३xY९q | https://shop.example.com/products/laptops/model-x |
४. शॉर्ट यूआरएल लौटाओ:
201 Created
{
"code": "aB3xY9q",
"short_url": "https://sho.rt/aB3xY9q",
"long_url": "https://shop.example.com/products/laptops/model-x"
}
तुम https://sho.rt/aB3xY9q चैट में पेस्ट करते हो। हो गया। क्रिएट दुर्लभ पथ है। ज्यादातर ट्रैफ़िक क्लिक है, क्रिएट नहीं।
क्रिएट पर वैकल्पिक अतिरिक्त:
- कस्टम एलियास: रैंडम कोड की जगह
launchमाँगते हो। सिस्टम देखता है नाम खाली है और रिज़र्व नहीं (api,healthआदि)। - टीटीएल (समय सीमा): लिंक तय समय बाद मर जाता है, जैसे अस्थायी कोट-चेक टिकट।
वॉक-थ्रू: एक यूज़र क्लिक (रीडायरेक्ट)
दोस्त शॉर्ट लिंक टैप करता है। पूरा सफ़र देखो।
1. ब्राउज़र पूछता है: GET https://sho.rt/aB3xY9q
2. रिक्वेस्ट लोड बैलेंसर से होकर रीडायरेक्ट सर्विस तक जाती है।
3. सर्विस कैश से पूछती है: "aB3xY9q पता है?"
- हिट: तुरंत सेव की हुई लंबी यूआरएल इस्तेमाल करो।
- मिस: डेटाबेस पूछो, फिर अगली बार के लिए कैश भर दो।
4. सर्विस HTTP रीडायरेक्ट से जवाब देती है:
स्टेटस 302 (या 301)
हेडर Location: https://shop.example.com/products/laptops/model-x
5. ब्राउज़र Location फॉलो करता है और असली पेज लोड करता है।
6. वैकल्पिक: सर्विस "किसी ने क्लिक किया" इवेंट साइड क्यू पर डालती है एनालिटिक्स के लिए।
यह काम रीडायरेक्ट को धीमा नहीं करना चाहिए।
अगर कोड अनजान, एक्सपायर्ड, या बंद है तो ४०४ दो, अनुमान नहीं।
३०१ बनाम ३०२ साधारण भाषा में
| स्टेटस | मतलब | क्यों मायने रखता है |
|---|---|---|
| ३०१ | "यह शिफ्ट स्थायी है।" | ब्राउज़र और सीडीएन ज़ोर से याद रख सकते हैं। तुम्हारे सर्वर पर कम हिट। क्लिक काउंट असली क्लिक से कम रह सकते हैं। |
| ३०२ | "यह शिफ्ट अस्थायी है।" | क्लाइंट तुम्हारी सर्विस से ज़्यादा बार पूछते हैं। सटीक क्लिक एनालिटिक्स चाहिए तो बेहतर। |
जब एनालिटिक्स मायने रखे तो इंटरव्यू डिफ़ॉल्ट: ३०२। अगर सस्ता रीडायरेक्ट और लगभग-सही गिनती काफी हो तो ३०१ ठीक। असली प्रोडक्ट ज़रूरत से चुनते हैं, फैशन से नहीं।
एन्कोडिंग: शॉर्ट कोड कैसे बनाते हैं
यूआरएल में सुरक्षित छोटा अल्फाबेट चाहिए। आम पसंद बेस६२ है:
0-9 a-z A-Z
६२ चिह्न। बेस६४ वाले + और / नहीं, जिन्हें एस्केप करना पड़ता है।
कितने कोड मिलते हैं?
| कोड लंबाई | लगभग क्षमता |
|---|---|
| ६ अक्षर | करीब ५७ अरब |
| ७ अक्षर | करीब ३.५ ट्रिलियन |
| ८ अक्षर | करीब २१८ ट्रिलियन |
सात अक्षर आम इंटरव्यू पसंद: शेयर करने लायक छोटा, बहुत विकास के लिए बड़ा।
कोड बनाने के तीन तरीके
क. काउंटर, फिर एन्कोड (कोट-चेक मशीन)
१. अगला ग्लोबल नंबर लो: १, २, ३, … (डीबी सीक्वेंस, रेडिस INCR, या डिस्ट्रिब्यूटेड आईडी)।
२. उस नंबर को बेस६२ अक्षरों में बदलो।
३. वही स्ट्रिंग तुम्हारा कोड है।
फ़ायदे: काउंटर यूनिक हो तो अचानक टक्कर नहीं। आसान कहानी।
नुकसान: अगर कोड क्रम से …9, …a, …b चलें तो अंदाज़ा लगाया जा सकता है। उपाय: ऊँचे से शुरू करो, एन्कोड से पहले बिट्स घुमाओ, या अल्फाबेट शफ़ल करो। फिर भी कोड को पब्लिक टिकट समझो, सीक्रेट नहीं।
बेस६२ एन्कोड की छोटी मानसिक तस्वीर:
नंबर 125 → 62 से भाग, शेष रखो → शेष को अल्फाबेट से मैप → "21" (उदाहरण आकार)
ख. लंबी यूआरएल का हैश
यूआरएल हैश करो (SHA-२५६ आदि), प्रीफ़िक्स लो, बेस६२ बनाओ, खाली है तो रखो। टक्कर पर और बिट्स या सॉल्ट जोड़कर फिर कोशिश।
फ़ायदे: अगर प्रोडक्ट चाहे तो एक ही लंबी यूआरएल हमेशा एक ही शॉर्ट कोड पर जा सकती है।
नुकसान: टक्कर पर रिट्राई लूप। दो अलग यूज़र एक ही गंतव्य के लिए एक कोड शेयर नहीं चाह सकते (मालिकाना हक और एनालिटिक्स उलझते हैं)।
ग. रैंडम कोड
७ रैंडम बेस६२ अक्षर चुनो। यूनिक कंस्ट्रेंट के साथ इंसर्ट। लिया हुआ हो तो फिर चुनो।
फ़ायदे: अंदाज़ा लगाना मुश्किल। सरल कोड।
नुकसान: स्पेस भरने पर रिट्राई (७ अक्षर पर लंबे समय तक ठीक)। अगर अंदाज़ा रोकना मायने रखे तो अच्छा रैंडम जनरेटर।
इंटरव्यू और कई प्रोडक्ट का व्यावहारिक डिफ़ॉल्ट: यूनिक आईडी (काउंटर या स्नोफ़्लेक-स्टाइल) → वैकल्पिक स्क्रैंबल → बेस६२। कस्टम एलियास उसी यूनिक code कॉलम में (या अलग यूनिक एलियास कॉलम में)।
स्टोरेज: जैकेट लिस्ट कहाँ रहती है
मूल में यह की-वैल्यू मैप है: शॉर्ट कोड → लंबी यूआरएल, थोड़ा मेटाडेटा के साथ।
सरल एसक्यूएल टेबल
| कॉलम | भूमिका |
|---|---|
code |
प्राइमरी की। टिकट नंबर। |
long_url |
असली गंतव्य। |
user_id |
लिंक का मालिक (वैकल्पिक)। |
created_at |
कब बना। |
expires_at |
कब मरे (null = हमेशा)। |
is_active |
सॉफ्ट डिलीट या टेकडाउन स्विच। |
रीडायरेक्ट लुकअप हमेशा "कोड से ढूँढो"। यह पैटर्न प्राइमरी की या की-वैल्यू स्टोर के लिए एकदम सही।
नोएसक्यूएल / की-वैल्यू विकल्प
डायनामोडीबी या कैसेंड्रा जैसे स्टोर यहाँ चमकते हैं:
- पार्टीशन की:
code - एट्रिब्यूट: लंबी यूआरएल और मेटाडेटा
- प्रोडक्ट को चाहिए तो नेटिव टीटीएल एक्सपायरी के लिए
रीडायरेक्ट एक की लुकअप बन जाता है। "यूज़र X के सारे लिंक" के लिए सेकंडरी इंडेक्स या अलग टेबल चाहिए।
हॉट रो पर क्लिक काउंटर मत रखो
हर रीडायरेक्ट पर clicks = clicks + 1 रीड पथ को राइट लड़ाई बना देता है। वायरल लिंक एक रो को पीटता है।
बेहतर:
१. रीडायरेक्ट सिर्फ मैपिंग पढ़े। २. क्लिक इवेंट क्यू पर भेजो (असिंक)। ३. वर्कर ऑफलाइन गिनती जोड़ें।
छोटे एमवीपी के लिए: लाइव काउंटर के लिए रेडिस INCR ठीक, अगर कुछ नुकसान मंज़ूर हो और बाद में ड्यूरेबल स्टोरेज में स्नैपशॉट करो।
कैश: क्लर्क का स्टिकी नोट
ज्यादातर क्लिक कुछ लोकप्रिय कोड पर गिरते हैं। हर बार डेटाबेस पढ़ना ज़रूरत से धीमा और महँगा है।
तीन परतें जिनकी बात होती है:
१. सीडीएन शॉर्ट डोमेन के आगे (वैश्विक लेटेंसी अच्छी; सटीक एनालिटिक्स जटिल कर सकता है)।
२. रेडिस (या मेमकैश्ड) ऐप के पास: code → long_url टीटीएल के साथ।
३. डेटाबेस सच का स्रोत।
कैश के साथ रीडायरेक्ट, सरल फ्लो:
कोड के लिए रेडिस पूछो
अगर मिला और वैध है → रीडायरेक्ट
नहीं तो
डीबी पूछो
अगर गायब / बंद / एक्सपायर्ड → 404 (और थोड़ी देर "नहीं मिला" याद रख सकते हो)
वरना TTL के साथ रेडिस लिखो → रीडायरेक्ट
एनालिटिक्स भी कतार में (बेस्ट एफर्ट)
कैश क्यों मदद करता है: मेमोरी लुकअप तेज़। लोकप्रिय टिकट स्टिकी नोट पर रहते हैं। दुर्लभ टिकट फिर भी जैकेट रूम (डीबी) जाते हैं।
सावधानियाँ:
- कैश स्टैंपीड: ठंडे लोकप्रिय कोड पर एक साथ कई मिस। काम जोड़ो (एक फ़ेच, कई इंतज़ार) या छोटा लॉक।
- नेगेटिव कैश: थोड़ी देर याद रखो "यह कोड नहीं है" ताकि स्कैनर डीबी न पीटें।
- टेकडाउन: लिंक बंद करते समय कैश एंट्री मिटाओ या ओवरराइट करो ताकि पुराना Location न टिका रहे।
स्केल पथ, कदम दर कदम
चालीस बक्सों वाले डायग्राम से शुरू मत करो। दर्द के साथ बढ़ो।
स्टेज १: एक ऐप, एक डेटाबेस
साइड प्रोजेक्ट या शुरुआती प्रोडक्ट के लिए काफी।
क्लाइंट → ऐप (क्रिएट + रीडायरेक्ट) → डीबी
स्टेज २: क्रिएट और रीडायरेक्ट थोड़ा अलग, कैश जोड़ो
रीडायरेक्ट हावी रहते हैं। लुकअप के आगे रेडिस रखो। क्रिएट प्राइमरी डीबी पर।
क्रिएट → API → डीबी
रीडायरेक्ट → API → रेडिस → (मिस) डीबी
स्टेज ३: लोड बैलेंसर के पीछे कई रीडायरेक्ट सर्वर
रीडायरेक्ट हैंडलर स्टेटलेस रहें। उन्हें हॉरिजॉन्टल स्केल करो। स्टेट कैश और डीबी में।
क्लाइंट → LB → रीडायरेक्ट पॉड 1..N → रेडिस → डीबी
स्टेज ४: रीड-भारी डेटाबेस तरकीबें
- ज़रूरत हो तो कैश मिस के लिए रीड रेप्लिका।
- एनालिटिक्स मैपिंग टेबल से दूर रखो।
- जब एक प्राइमरी डेटा और इंडेक्स न संभाले तो कोड हैश से पार्टीशन (शार्ड) करो।
स्टेज ५: ज़्यादा क्रिएट वॉल्यूम के लिए राइट पथ
क्रिएट आमतौर पर रीडायरेक्ट से बहुत कम होते हैं। जब बढ़ें:
- मज़बूत आईडी जनरेटर (ब्लॉक एलोकेशन, स्नोफ़्लेक-स्टाइल आईडी)।
codeपर यूनिक कंस्ट्रेंट रखो।- मल्टी-रीजन में क्रिएट सावधानी से ताकि दो रीजन एक ही कोड न बनाएँ।
स्टेज ६: विश्वसनीयता के नियम जो मायने रखते हैं
| नियम | क्यों |
|---|---|
| रीडायरेक्ट क्रिएट से ज़्यादा महत्वपूर्ण | क्लिक करने वाले नए लिंक बनाने वालों पर जीतें। |
| २०१ लौटाने के बाद मैपिंग कभी न खोओ | क्लाइंट ने शॉर्ट लिंक पहले ही शेयर कर दिया। |
| चरम लोड पर एनालिटिक्स गिर सकती है | धीमे रीडायरेक्ट से बेहतर खोया क्लिक इवेंट। |
| रेडिस गिरे तो डीबी पर जाओ | ज़्यादा लेटेंसी, फिर भी सही। |
| मेट्रिक्स पर फेल ओपन, अनजान कोड पर फेल क्लोज़्ड | अनजान कोड → ४०४, गलत पेज नहीं। |
क्षमता का अनुमान (इंटरव्यू में ज़ोर से बोलो):
- पीक पर क्रिएट प्रति सेकंड हज़ारों हो सकते हैं।
- रीडायरेक्ट १०० गुना या ज़्यादा।
- मेटाडेटा समेत हर मैपिंग रो अक्सर १ केबी से कम।
- १० करोड़ रो दसियों जीबी हैं, पेटाबाइट नहीं। शार्डिंग विकास और क्यूपीएस के लिए है, दिन एक की घबराहट के लिए नहीं।
सुरक्षा और दुरुपयोग (छोटी सूची)
शॉर्ट कोड पब्लिक टिकट हैं। उम्मीद रखो:
१. कोड अंदाज़ा करके स्पेस घूमना। रेट लिमिट। लंबे या स्क्रैंबल्ड कोड। २. फ़िशिंग तुम्हारे भरोसेमंद शॉर्ट डोमेन से। बुरे गंतव्य स्कैन या ब्लॉकलिस्ट। रिपोर्ट और टेकडाउन। ३. स्पैम क्रिएट स्टोरेज भरना। ऑथ, कोटा, कैप्चा, पेड टियर। ४. ओपन रीडायरेक्ट तभी अगर क्लिक के समय लंबी यूआरएल यूज़र नियंत्रित हो (आमतौर पर क्रिएट पर फिक्स करते हो और सिर्फ वही स्टोर्ड वैल्यू सर्व करते हो)।
शॉर्ट यूआरएल में सीक्रेट रखकर यह मत मानो कि कोई नहीं ढूँढेगा।
एंड-टू-एंड डिज़ाइन जो बचा सकते हो
आवश्यकता उदाहरण: ७ अक्षर बेस६२ कोड, वैकल्पिक कस्टम एलियास और टीटीएल, लगभग सटीक क्लिक, ऊँचा रीडायरेक्ट क्यूपीएस, मल्टी-AZ।
टुकड़े:
१. क्रिएट / लिस्ट / डिलीट के लिए एपीआई सर्विस (ऑथ के साथ)।
२. पतली रीडायरेक्ट सर्विस (हॉट पथ हल्का)।
३. यूनिक नंबर के लिए आईडी जनरेटर।
४. मैपिंग के लिए प्राइमरी स्टोर (एसक्यूएल या डायनामोडीबी-स्टाइल)।
५. code → url के लिए रेडिस।
६. क्लिक इवेंट और रोलअप के लिए क्यू + वर्कर।
क्रिएट: वैलिडेट → कोड बनाओ → इंसर्ट → शॉर्ट यूआरएल लौटाओ।
रीडायरेक्ट: कैश → डीबी → ३०२ + Location → असिंक क्लिक इवेंट।
ज़ोर से कहने लायक ट्रेड-ऑफ़:
- काउंटर एन्कोडिंग सरल और टक्कर-मुक्त; रैंडम और हैश को यूनिकनेस चेक चाहिए।
- ३०१ ओरिजिन लोड बचाता है; ३०२ एनालिटिक्स ज़्यादा ईमानदार रखता है।
- मैपिंग रो पर क्लिक काउंटर वायरल ट्रैफ़िक में पिघलेंगे।
- रीडायरेक्ट की शुद्धता परफेक्ट ग्लोबल एनालिटिक्स से ऊपर है।
दोस्त को सुना सको ऐसा सार
यूआरएल शॉर्टनर वेब एड्रेस का कोट-चेक है।
तुम लंबा जैकेट (लंबी यूआरएल) देते हो। क्लर्क छोटा नंबर (शॉर्ट कोड) देता है और किताब (डेटाबेस) में लिखता है। जब कोई नंबर दिखाता है, क्लर्क ढूँढता है और जैकेट रैक की तरफ़ इशारा करता है (Location हेडर वाला रीडायरेक्ट)। लोकप्रिय नंबरों के लिए स्टिकी नोट (कैश) रखता है ताकि हर बार पिछला कमरा न जाना पड़े।
एन्कोडिंग वह तरीका है जिससे काउंटर, हैश, या पासे से टिकट नंबर छापते हो। स्टोरेज टिकाऊ सूची है। कैश गति है। स्केल का मतलब फ्रंट डेस्क पर कई क्लर्क, ज़रूरत पड़ने पर बड़ी किताब, और क्लिक काउंटर को कतार कभी फ्रीज़ न करने देना।
एक प्रोडक्शन सबक याद रहे: रीडायरेक्ट पथ को एज सर्विस की तरह बचाओ, और एनालिटिक्स को साइड बातचीत समझो, न कि वह कदम जो यूज़र के दरवाज़े से गुज़रने से पहले पूरा होना ज़रूरी हो।
प्रोडक्शन चेकलिस्ट
- अल्फाबेट और कोड लंबाई विकास गणित से चुनी
- यूनिक कोड (काउंटर या यूनिक कंस्ट्रेंट)
- यूआरएल वैलिडेशन और स्कीम अलाउलिस्ट
- कस्टम एलियास के लिए रिज़र्व्ड शब्द
- टीटीएल और नेगेटिव कैशिंग के साथ रेडिस कैश
- प्रोडक्ट और एनालिटिक्स के लिए ३०१ बनाम ३०२ का फ़ैसला लिखा
- एनालिटिक्स हॉट पथ से बाहर
- एक्सपायरी और टेकडाउन कैश साफ़ करें
- क्रिएट और संदिग्ध रीडायरेक्ट वॉल्यूम पर रेट लिमिट
- हॉट की, कोल्ड की, कैश फेल, डीबी फेलओवर का लोड टेस्ट
- डैशबोर्ड: क्रिएट क्यूपीएस, रीडायरेक्ट क्यूपीएस, कैश हिट रेशियो, p९९ रीडायरेक्ट लेटेंसी, ४०४ दर
