प्रॉम्प्ट और लागू संदर्भ
फॉलो ग्राफ़ द्वारा समर्थित एक पर्सनलाइज़्ड न्यूज़ फ़ीड डिज़ाइन करें। लोग टेक्स्ट या इमेज पोस्ट पब्लिश कर सकते हैं, ऑथर्स को फॉलो या अनफॉलो कर सकते हैं, और प्रासंगिकता-रैंक वाली होम फ़ीड ब्राउज़ कर सकते हैं। किसी पोस्ट को डिलीट करना, उसे प्राइवेट करना, किसी ऑथर को ब्लॉक करना, या अनफॉलो करना बाद के रीड्स को तुरंत प्रभावित करना चाहिए। लाइक्स, कमेंट्स, और सिफारिश मॉडल रैंकिंग सिग्नल हैं। मीडिया ट्रांसकोडिंग, कमेंट ट्रीज़, विज्ञापन नीलामी (ad auctions), और मॉडल ट्रेनिंग दायरे से बाहर हैं।
मान लें कि 50 मिलियन दैनिक सक्रिय उपयोगकर्ता (DAU) हैं। प्रत्येक सक्रिय उपयोगकर्ता प्रति दिन 20 पेज पढ़ता है, प्रति पेज 20 आइटम होते हैं, और सिस्टम को प्रति दिन 10 मिलियन नए पोस्ट प्राप्त होते हैं। फ़ीड-रीड p99 200 मिलीसेकंड से कम होना चाहिए। एक सामान्य ऑथर का पोस्ट p99 पर पांच सेकंड के भीतर सक्रिय फॉलोअर्स को दिखाई देना चाहिए। एक सामान्य ऑथर के औसतन 200 पात्र (eligible) फॉलोअर्स होते हैं, जबकि सबसे बड़े ऑथर के 50 मिलियन फॉलोअर्स हैं। ये आंकड़े और समय-सीमाएं इंटरव्यू की सीमाएं हैं, किसी मौजूदा उत्पाद के बारे में दावे नहीं।
यह प्रॉम्प्ट मिड-टू-सीनियर बैकएंड, इंफ्रास्ट्रक्चर, और सिस्टम-डिज़ाइन इंटरव्यू के अनुकूल है। सार्वजनिक इंटरव्यू सामग्री सीधे तौर पर राइट फ़ैन-आउट, रीड फ़ैन-आउट, सेलिब्रिटी ऑथर्स, कर्सर पेजिनेशन, कैशिंग, और कंसिस्टेंसी के बारे में पूछती है। फर्स्ट-पार्टी इंजीनियरिंग विवरण भी कैंडिडेट रिट्रीवल, एग्रीगेशन, फ़िल्टरिंग, और मल्टी-पास रैंकिंग को अलग करते हैं, जबकि सुंदर डिग्रेडेशन (graceful degradation) के लिए मटीरियलाइज़्ड सामग्री को बनाए रखते हैं। इसलिए एक मजबूत उत्तर एक निश्चित आरेख को पुनरुत्पादित करने के बजाय स्पष्ट लागत और शुद्धता की आवश्यकताओं से तंत्रों को जोड़ता है।
इंटरव्यूअर क्या मूल्यांकन करता है
पहला, क्या उम्मीदवार रीड-राइट विषमता (read-write asymmetry) को माप सकता है? 50 मिलियन DAU गुणा 20 पेज प्रति दिन एक बिलियन रीड्स है, या लगभग 11,600 औसत QPS। पांच गुना पीक लगभग 58,000 QPS है। दस मिलियन पोस्ट औसतन केवल 116 क्रिएशन्स प्रति सेकंड होते हैं, लेकिन 200 पात्र फॉलोअर्स के लिए राइट फ़ैन-आउट इसे प्रति दिन लगभग दो बिलियन टाइमलाइन-रेफरेंस इंसर्ट्स, या औसतन लगभग 23,100 प्रति सेकंड में विस्तारित करता है। केवल रॉ पोस्ट QPS की तुलना मुख्य राइट लोड को छुपाती है।
दूसरा, क्या उम्मीदवार पुश, पुल, और हाइब्रिड की सीमाओं को समझता है? प्योर फ़ैन-आउट-ऑन-राइट रीड्स को सस्ता बनाता है, लेकिन 50 मिलियन फॉलोअर्स वाला एक ऑथर 50 मिलियन इंसर्ट्स बनाता है। प्योर फ़ैन-आउट-ऑन-रीड पब्लिशिंग को सस्ता बनाता है, लेकिन प्रत्येक रीड कई फॉलो किए गए ऑथर्स को मर्ज कर सकता है। एक मजबूत डिज़ाइन सामान्य ऑथर्स के लिए रेफरेंसेस की प्री-कंप्यूटिंग करता है, रीड्स के दौरान हाई-फ़ैन-आउट ऑथर्स को पुल करता है, और सक्रिय फॉलोअर्स, पोस्टिंग दर, कतार बजट (queue budget), और फ्रेशनेस लक्ष्यों से सीमा निर्धारित करता है।
तीसरा, क्या उम्मीदवार पोस्ट सोर्स ऑफ़ ट्रुथ, कैंडिडेट पूल्स, और अंतिम प्रस्तुति को अलग कर सकता है? एक टाइमलाइन कॉपी की गई बॉडीज़ के बजाय हल्के रेफरेंसेस को स्टोर करती है। एग्रीगेटर एक प्री-कंप्यूटेड इनबॉक्स, हाई-फ़ैन-आउट ऑथर्स के हालिया पोस्ट्स, और सिफारिश कैंडिडेट्स को मर्ज करता है; ऑथराइजेशन, डिलीशन, ब्लॉकिंग, और डीडुप्लीकेशन लागू करता है; फिर रैंक और हाइड्रेट करता है। एक मॉडल स्कोर कभी भी विजिबिलिटी नियमों को ओवरराइड नहीं करता है।
चौथा, क्या उम्मीदवार रैंकिंग में बदलाव के दौरान उपयोगी पेजिनेशन सिमेंटिक्स को संरक्षित कर सकता है? स्कोर्स एंगेजमेंट और मॉडल वर्जन्स के साथ बदलते हैं, इसलिए अकेले ऑफसेट या स्कोर डुप्लिकेट्स और ओमिशन का कारण बनता है। उत्तर में या तो अल्पकालिक फ़्रोज़न फ़ीड सेशन या वर्जन्ड कंपाउंड कर्सर का प्रस्ताव होना चाहिए और यह समझाना चाहिए कि स्क्रॉलिंग के दौरान नए पोस्ट, डिलीट, अनफॉलो, और विजिबिलिटी परिवर्तन होने पर क्या होता है।
अंत में, डिज़ाइन को रिकवर होने योग्य और गलत साबित करने योग्य (falsifiable) होना चाहिए। इवेंट बस, कैश, और फ़ैन-आउट वर्कर्स विफल हो सकते हैं या काम दोहरा सकते हैं। इडेम्पोटेंट रेफरेंसेस, लैग मॉनिटरिंग, बाउंडेड सोर्स फ़ॉलबैक, टॉम्बस्टोन फ़िल्टरिंग, और रिपेयर स्कैन्स को कन्वर्ज होना चाहिए। वैलिडेशन में सेलिब्रिटी बर्स्ट्स, डुप्लिकेट और आउट-ऑफ-ऑर्डर इवेंट्स, अनफॉलो रेस, डिलीशन लीक्स, और कैश लॉस शामिल होने चाहिए।
उत्तर देने से पहले स्पष्ट करने योग्य प्रश्न
- होम पेज को क्या फ़ीड करता है? मुख्य रूप से फॉलो किए गए ऑथर्स के पोस्ट्स, एक छोटे सिफारिश पूल के साथ। विज्ञापन, ग्रुप्स, और टॉपिक फ़ीड्स दायरे से बाहर हैं।
- रैंकिंग अनुबंध क्या है? प्रासंगिकता रैंकिंग डिफ़ॉल्ट है। परिणाम फ्रेश होने चाहिए और स्रोतों को जानबूझकर मिलाना चाहिए, लेकिन सख्त क्रोनोलॉजिकल क्रम की आवश्यकता नहीं है।
- एक पोस्ट कौन देख सकता है? एक पोस्ट सार्वजनिक, केवल-फॉलोअर्स, या प्राइवेट हो सकती है। ब्लॉक्स, डिलीट्स, और विजिबिलिटी प्रतिबंध कैश हिट्स और रैंकिंग पर प्राथमिकता लेते हैं।
- रीड-योर-राइट्स किसे चाहिए? ऑथर को तुरंत एक नया पोस्ट देखना चाहिए। सक्रिय सामान्य फॉलोअर्स का पांच सेकंड का विजिबिलिटी लक्ष्य है। ऑफ़लाइन फॉलोअर्स को उनकी अगली विज़िट पर अपडेट किया जा सकता है।
- पेजिनेशन कितना स्थिर होना चाहिए? एक निरंतर स्क्रॉल को डुप्लिकेट्स और गैप्स को कम करना चाहिए। नए पोस्ट रीफ़्रेश पर या एक नए सेशन में दिखाई दे सकते हैं। वर्तमान सेशन के भीतर डिलीशन और निरस्त एक्सेस तुरंत लागू होते हैं।
- ग्राफ़ कितना विषम (skewed) है? एक सामान्य ऑथर के औसतन 200 पात्र फॉलोअर्स होते हैं, जबकि सबसे बड़े के 50 मिलियन हो सकते हैं। एक औसत को हॉटस्पॉट्स को नहीं छिपाना चाहिए।
- कितना रिटेन किया जाता है? प्रत्येक सक्रिय उपयोगकर्ता के लिए 500 सबसे नए कैंडिडेट रेफरेंसेस की प्री-कंप्यूटिंग करें। उत्पाद नीति के तहत पोस्ट बॉडीज़ को बनाए रखें और आवश्यकता पड़ने पर ऑथर और सिफारिश इंडेक्स से पुराने आइटम्स को पुनः प्राप्त करें।
- क्षेत्रीय आवश्यकताएं क्या हैं? रीड्स को स्थानीय रूप से सर्व करें और ऑथर के होम रीजन में कमिट होने के बाद एक पोस्ट को एसिंक्रोनस रूप से रेप्लिकेट करें। सामान्य फ्रेशनेस सेकंड्स में हो सकती है; विजिबिलिटी प्रतिबंध एक उच्च-प्राथमिकता वाले इनवैलिडेशन पथ का उपयोग करता है।
30-सेकंड उत्तर फ्रेमवर्क
“मैं आधिकारिक पोस्ट स्टोर, फॉलो ग्राफ़, और प्रति-उपयोगकर्ता कैंडिडेट इनबॉक्स को अलग करूंगा। एक क्रिएट ट्रांजैक्शन पोस्ट और एक आउटबॉक्स इवेंट लिखता है। फ़ैन-आउट वर्कर्स सामान्य ऑथर्स को सक्रिय-फॉलोअर इनबॉक्स में इडेम्पोटेंट रूप से इंसर्ट करते हैं, जबकि हाई-फ़ैन-आउट ऑथर्स केवल एक ऑथर-रीसेंट इंडेक्स लिखते हैं और रीड्स के दौरान पुल किए जाते हैं। फ़ीड एग्रीगेटर प्री-कंप्यूटेड, हाई-फ़ैन-आउट, और अनुशंसित कैंडिडेट्स को मर्ज करता है; ऑथराइजेशन, डिलीशन, ब्लॉकिंग, और डीडुप्लीकेशन लागू करता है; फिर एक अल्पकालिक फ़ीड सेशन बनाने के लिए रिट्रीवल और रैंकिंग का उपयोग करता है। कर्सर में सेशन और स्थिति होती है, और पोस्ट बॉडीज़ को केवल अंतिम आइटम्स के लिए हाइड्रेट किया जाता है। डिलीट्स और विजिबिलिटी प्रतिबंध आधिकारिक टॉम्बस्टोन और उच्च-प्राथमिकता वाले इनवैलिडेशन्स लिखते हैं, जबकि प्रत्येक रीड उन्हें दोबारा जांचता है। कतार में देरी (queue lag) के दौरान, एक पुराना मटीरियलाइज़्ड फ़ीड लौटाएं और बाउंडेड सोर्स रीड्स निष्पादित करें। पोस्ट-टू-विजिबल लेटेंसी, डुप्लिकेट्स, डिलीशन लीक्स, और प्रत्येक स्टेज के p99 की निगरानी करें।”
चरण-दर-चरण गहन विश्लेषण
चरण 1: क्षमता से आर्किटेक्चर बजट प्राप्त करना
दैनिक फ़ीड रीड्स हैं:
50,000,000 DAU × 20 pages/day = 1,000,000,000 feed reads/day
1,000,000,000 / 86,400 ≈ 11,574 average read QPS
11,574 × 5 peak factor ≈ 57,870 peak read QPSपोस्ट निर्माण औसतन 10,000,000 / 86,400 ≈ 116 QPS है। यदि सामान्य ऑथर्स औसतन 200 सक्रिय फॉलोअर्स तक फ़ैन आउट करते हैं, तो वे प्रति दिन लगभग दो बिलियन कैंडिडेट-रेफरेंस इंसर्ट्स उत्पन्न करते हैं, या औसतन 2,000,000,000 / 86,400 ≈ 23,148 इंसर्ट्स प्रति सेकंड। एक 50-मिलियन-फॉलोअर पोस्ट सामान्य राइट बजट के कई सेकंड से अधिक हो जाता है, इसलिए सिंक्रोनस पूर्ण फ़ैन-आउट असुरक्षित है।
50 मिलियन सक्रिय उपयोगकर्ताओं में से प्रत्येक के लिए 500 रेफरेंसेस रखने से 25 बिलियन रेफरेंसेस उत्पन्न होते हैं। यदि एक कच्चा रेफरेंस post_id, author_id, एक प्रारंभिक स्कोर, समय, और फ़्लैग्स के लिए 64 बाइट्स का उपयोग करता है, तो इंडेक्स, इंजन ओवरहेड, और रेप्लिका से पहले तार्किक निचली सीमा लगभग 1.6 TB है। इसलिए टाइमलाइन्स को बाउंडेड रेफरेंसेस स्टोर करने चाहिए, न कि कॉपी की गई पोस्ट बॉडीज़, और एक्टिविटी-टियर स्टोरेज का उपयोग करना चाहिए।
चरण 2: ओनरशिप, APIs, और न्यूनतम डेटा मॉडल को परिभाषित करना
पोस्ट सर्विस बॉडी, ऑथर, निर्माण समय, विजिबिलिटी, वर्शन, और डिलीशन टॉम्बस्टोन का स्वामित्व रखती है। सोशल-ग्राफ़ सर्विस following और followers आसन्नता (adjacency) इंडेक्स का स्वामित्व रखती है। फ़ीड सर्विस कैंडिडेट रेफरेंसेस, सेशन्स, और इम्प्रेशन रिकॉर्ड्स का स्वामित्व रखती है। ऑब्जेक्ट स्टोरेज और एक CDN इमेजेस रखते हैं; एक टाइमलाइन में केवल मीडिया रेफरेंसेस होते हैं। कोर APIs हो सकते हैं:
POST /v1/posts create a post with Idempotency-Key
DELETE /v1/posts/{post_id} write a deletion tombstone
PUT /v1/users/{id}/following/{author} follow an author
DELETE /v1/users/{id}/following/{author} unfollow an author
GET /v1/feed?cursor=...&limit=20 read one ranked page
GET /v1/posts/{post_id} hydrate one visible postposts आधिकारिक स्थिति को post_id द्वारा और (author_id, created_at, post_id) पर एक हालिया इंडेक्स स्टोर करता है। follows को व्यूअर द्वारा फॉलोअर्स को सूचीबद्ध करना चाहिए और ऑथर द्वारा फॉलोअर्स को शार्ड करना चाहिए। feed_inbox को viewer_id द्वारा पार्टिशन किया जाता है; इसकी सॉर्ट की में एक रिट्रीवल स्कोर, निर्माण समय, और post_id शामिल हैं। feed_sessions अस्थायी रूप से एक रैंकिंग वर्शन, क्रमबद्ध कैंडिडेट IDs, और समाप्ति समय स्टोर करता है। रीड के दौरान प्रत्येक कैंडिडेट को सिंक्रोनस रूप से अपडेट करने के बजाय इम्प्रेशन और एंगेजमेंट इवेंट्स फीचर्स और प्रयोगों के लिए अलग-अलग लॉग्स में जाते हैं।
पोस्ट क्रिएशन एक कॉलर इडेम्पोटेंसी की लेता है। पोस्ट और आउटबॉक्स इवेंट एक डेटाबेस ट्रांजैक्शन में कमिट होते हैं, जिसके बाद ऑथर पोस्ट सोर्स ऑफ़ ट्रुथ से पढ़ सकता है। बस कम से कम एक बार डिलीवरी (at-least-once delivery) प्रदान करती है। एक यूनिक या कंडीशनल (viewer_id, post_id) राइट डुप्लिकेट फ़ैन-आउट को कन्वर्ज करता है। इवेंट्स पोस्ट वर्शन ले जाते हैं ताकि एक पुराना इवेंट डिलीट किए गए या नए प्रतिबंधित पोस्ट को पुनर्जीवित न कर सके।
चरण 3: सामान्य और हाई-फ़ैन-आउट ऑथर्स के लिए हाइब्रिड फ़ैन-आउट का उपयोग करना
एक सामान्य ऑथर द्वारा पोस्ट करने के बाद, फ़ैन-आउट सर्विस पात्र सक्रिय फॉलोअर्स के शार्ड्स को पढ़ती है और प्रत्येक इनबॉक्स में एक हल्का रेफरेंस बैच-इंसर्ट करती है। वर्कर्स शार्ड कर्सर और इवेंट IDs के साथ प्रगति को ट्रैक करते हैं। एक टाइम-आउट बैच दूसरा कैंडिडेट बनाए बिना उसी काम को दोबारा करता है। ऑफ़लाइन या लंबे समय से निष्क्रिय उपयोगकर्ताओं को तुरंत मटीरियलाइज़ करने की आवश्यकता नहीं है; उनके हालिया कैंडिडेट्स को उनकी अगली विज़िट पर फॉलो ग्राफ़ से फिर से बनाया जा सकता है।
एक हाई-फ़ैन-आउट पोस्ट केवल (author_id, created_at) हालिया इंडेक्स और एक हॉट कैश में जाती है। जब कोई व्यूअर ऐसे ऑथर्स को फॉलो करता है, तो एग्रीगेटर समानांतर में प्रत्येक से हालिया आइटम्स की एक सीमित संख्या खींचता है (pulls) और उन्हें इनबॉक्स के साथ मर्ज करता है। सीमा एक स्थायी फॉलोअर-काउंट स्थिरांक नहीं होनी चाहिए। eligible_active_followers × posts_per_window राइट लागत का अनुमान लगाएं और इसकी तुलना अपेक्षित रीड-मर्ज लागत, कतार हेडरूम, और पांच-सेकंड के फ्रेशनेस बजट से करें। यदि कोई ऑथर लोकप्रिय हो जाता है या बर्स्ट में पोस्ट करता है, तो कंट्रोल प्लेन ऑथर को पुल मोड में स्विच कर सकता है। पहले से कतारबद्ध बैच इडेम्पोटेंट रूप से पूरे हो सकते हैं या रद्द किए जा सकते हैं, लेकिन दोनों पथ सीमाओं के बिना नहीं चलने चाहिए।
पुल अभी भी महंगा रीड फ़ैन-आउट बना सकता है जब कोई व्यूअर कई हाई-फ़ैन-आउट ऑथर्स को फॉलो करता है। एग्रीगेटर प्रति स्रोत कैंडिडेट्स, समवर्तीता (concurrency), और समय सीमा को सीमित करता है; हालिया-ऑथर इंडेक्स को कैश करता है; और जब एक स्रोत का समय समाप्त हो जाता है तो अन्य पात्र कैंडिडेट्स लौटाता है। क्षेत्रीय या फॉलो-क्लस्टर प्री-एग्रीगेशन संभव है, लेकिन यह केवल तभी उचित है जब मापी गई मर्ज लागत एक बाधा बन जाती है।
चरण 4: कैंडिडेट जनरेशन, फ़िल्टरिंग, रैंकिंग, और हाइड्रेशन को अलग करना
रीड पथ में चार चरण हैं:
- सामान्य-ऑथर इनबॉक्स से एक कैंडिडेट बैच और हाई-फ़ैन-आउट व सिफारिश स्रोतों से बाउंडेड बैच पढ़ें।
post_idद्वारा डीडुप्लिकेट करें, फिर फॉलो, ब्लॉक, टॉम्बस्टोन, वर्तमान विजिबिलिटी, और क्षेत्रीय नीति की जांच करें।- सेट को कम करने के लिए एक सस्ते स्कोर का उपयोग करें, फिर एंगेजमेंट संभावना, फ्रेशनेस, स्रोत गुणवत्ता, और नकारात्मक फीडबैक के लिए एक भारी मॉडल, जिसके बाद विविधता और आवृत्ति प्रतिबंध लागू होते हैं।
- अंतिम 20 आइटम्स के लिए बॉडी, ऑथर सारांश, और कुल काउंट्स को बैच-हाइड्रेट करें, उन्हें लौटाएं, और एसिंक्रोनस रूप से इम्प्रेशन्स लॉग करें।
Meta का प्रकाशित इंजीनियरिंग विवरण एक फ़ीड एग्रीगेटर का वर्णन करता है जो रैंकिंग से पहले कैंडिडेट्स, ऑब्जेक्ट्स, और फीचर्स एकत्र करता है, जिसमें कई मॉडल पास होते हैं जो गणना को कम करते हैं। Pinterest का प्रकाशित आर्किटेक्चर भी अनदेखे कैंडिडेट पूल्स, सामग्री जनरेशन, और एक मटीरियलाइज़्ड फ़ीड को अलग करता है। एक साक्षात्कार डिज़ाइन को किसी भी सिस्टम की नकल करने की आवश्यकता नहीं है, लेकिन ये विवरण दिखाते हैं कि पूरे पोस्ट्स को कैश में कॉपी करना और वहां सॉर्ट करना महत्वपूर्ण सीमाओं का अभाव क्यों करता है।
ऑथराइजेशन और उत्पाद प्रतिबंध रैंकिंग से पहले और बाद में लागू होते हैं। प्रारंभिक फ़िल्टरिंग काम बचाती है; हाइड्रेशन के दौरान पोस्ट वर्शन को दोबारा जांचना रैंकिंग के दौरान आने वाले डिलीट या विजिबिलिटी प्रतिबंध को रोकता है। एक मॉडल स्कोर केवल एक ऑर्डरिंग इनपुट है और अदृश्य सामग्री को फिर से पेश नहीं कर सकता है। एंगेजमेंट काउंट्स इवेंचुअली कंसिस्टेंट हो सकते हैं। ऑथर, बॉडी, विजिबिलिटी, और टॉम्बस्टोन आधिकारिक पोस्ट वर्शन से आते हैं।
चरण 5: फ़ीड सेशन के साथ डायनेमिक रैंकिंग को स्थिर करना
एक offset आइटम्स को दोहराता है या छोड़ देता है जब नई सामग्री आती है या स्कोर बदलते हैं। एक (score, post_id) कीसेट अकेले भी अपर्याप्त है जब री-रैंकिंग अगले पेज से पहले स्कोर बदल देती है। पहला अनुरोध 500 कैंडिडेट IDs तक रैंक कर सकता है और उन्हें 30-मिनट के feed_session_id के तहत स्टोर कर सकता है। एक अपारदर्शी कर्सर में सेशन, अगली स्थिति, क्वेरी फ़िंगरप्रिंट, और सिग्नेचर शामिल हैं। बाद के पेज स्थिति के अनुसार पढ़ते हैं, विजिबिलिटी की दोबारा जांच करते हैं, और अंतराल भरते हैं।
नए पोस्ट तब दिखाई देते हैं जब व्यूअर रीफ़्रेश करता है या एक नया सेशन शुरू करता है, बजाय इसके कि उन्हें बीच में डाला जाए। डिलीट्स, ब्लॉक्स, और विजिबिलिटी प्रतिबंध तुरंत फ़िल्टर होते हैं, इसलिए एक वर्तमान सेशन एक आइटम खो सकता है; एग्रीगेटर बाद के सेशन कैंडिडेट्स से भरता है। यदि सेशन कैश खो जाता है या समाप्त हो जाता है, तो एक पहचानने योग्य कर्सर-समाप्त परिणाम लौटाएं ताकि क्लाइंट पहले से प्रदर्शित IDs को रख सके और रीफ़्रेश कर सके। नई रैंकिंग पर चुपचाप पुरानी स्थिति लागू न करें।
यदि 500 फ़्रोज़न IDs को स्टोर करना बहुत महंगा है, तो एक रैंकिंग एपॉक और कंपाउंड कीसेट स्टोर करें और क्लाइंट को प्रदर्शित IDs का सारांश सबमिट करने दें। वह डिज़ाइन कम सेशन स्टोरेज का उपयोग करता है लेकिन डीडुप्लीकेशन, मॉडल परिवर्तन, और डिलीशन फिल को कठिन बनाता है। कर्सर एन्कोडिंग को मुख्य उत्तर मानने के बजाय निरंतर-स्क्रॉल अवधि, स्वीकार्य डुप्लिकेट दर, और सेशन बजट में से चुनें।
चरण 6: फॉलो, डिलीट, और विजिबिलिटी परिवर्तनों को सही ढंग से कन्वर्ज करना
एक फॉलो कमिट होने के बाद, व्यूअर का अगला रीड नए ऑथर के हालिया पोस्ट्स को खींच सकता है जबकि एक बाउंडेड बैकफ़िल एसिंक्रोनस रूप से चलता है। अनफॉलो और ब्लॉक पहले आधिकारिक ग्राफ़ को अपडेट करते हैं; रीड पथ तुरंत उस ऑथर को फ़िल्टर करता है, फिर इनबॉक्स को एसिंक्रोनस रूप से साफ करता है। प्रस्तुति रुकने से पहले लाखों भौतिक डिलीट्स को समाप्त करने की आवश्यकता नहीं है। यदि फॉलो और पोस्ट इवेंट्स आउट ऑफ ऑर्डर आते हैं, तो कैंडिडेट में संबंध वर्शन केवल एक ऑप्टिमाइज़ेशन है। अंतिम विजिबिलिटी अभी भी वर्तमान आधिकारिक नियम का उपयोग करती है।
किसी पोस्ट को डिलीट करते समय या उसे प्राइवेट बनाते समय, पोस्ट सर्विस नए वर्शन, टॉम्बस्टोन, और उच्च-प्राथमिकता वाले आउटबॉक्स इवेंट को एक साथ कमिट करती है। कैश इनवैलिडेशन, सर्च क्लीनअप, और इनबॉक्स क्लीनअप एसिंक्रोनस हो सकते हैं, लेकिन फ़ीड हाइड्रेशन वर्तमान वर्शन को बैच-रीड करता है और इसे फ़िल्टर करता है। एक हॉट टॉम्बस्टोन कैश जांच को छोटा करता है, जबकि टिकाऊ (durable) पोस्ट रिकॉर्ड कैश हानि के बाद पुरानी सामग्री को फिर से प्रदर्शित होने से रोकता है। एक रिपेयर स्कैन पुराने रेफरेंसेस को हटाता है; भौतिक सफाई ऑथराइजेशन नहीं है।
जब भी कोई स्कोर बदलता है तो लाइक्स और कमेंट्स को प्रत्येक फॉलोअर इनबॉक्स को फिर से नहीं लिखना चाहिए। एंगेजमेंट इवेंट्स कुल काउंट्स और फीचर्स को अपडेट करते हैं, और सक्रिय व्यूअर्स अपने अगले अनुरोध पर कैंडिडेट्स को फिर से रैंक करते हैं। अत्यधिक हॉट सामग्री एक साझा फीचर कैश को अपडेट कर सकती है। यह अस्थायी रैंकिंग स्टेलनेस को स्वीकार करता है और प्रत्येक इंटरैक्शन को दूसरे ग्लोबल फ़ैन-आउट में बदलने से रोकता है।
चरण 7: डिग्रेडेशन, रिकवरी, और क्षेत्रीय सीमाओं को डिज़ाइन करना
फ़ैन-आउट कतार में देरी के दौरान, पहले पोस्ट निर्माण और मटीरियलाइज़्ड-फ़ीड रीड्स को सुरक्षित रखें। फ़ीड एक पुराना पात्र कैंडिडेट सेट लौटा सकता है और व्यूअर के हाल ही में सक्रिय फ़ॉलोअर्स के लिए बाउंडेड सोर्स रीड्स कर सकता है। फ्रेशनेस डिग्रेड हो सकती है; ऑथराइजेशन नहीं। यदि कोई एक ऑथर कतार में हॉटस्पॉट बनाता है, तो उस ऑथर को पुल मोड में स्विच करें और अधूरे बैचों को सीमित करें। रिकवरी के बाद, इवेंट समय और वर्शन द्वारा इडेम्पोटेंट रूप से कैच अप करें। केवल कतार की लंबाई ही नहीं, बल्कि सबसे पुराने इवेंट की आयु की भी निगरानी करें।
यदि कैंडिडेट कैश विफल हो जाता है, तो ड्यूरेबल इनबॉक्स से कम कैंडिडेट्स पढ़ें या एक संग्रहीत सेशन लौटाएं। यदि रैंकिंग का समय समाप्त हो जाता है, तो एक डिटर्मिनिस्टिक फ्रेशनेस स्कोर और विविधता नियमों का उपयोग करें। जब आधिकारिक पोस्ट या ग्राफ़ स्टोर अनुपलब्ध हो, तो केवल एक सुरक्षित ऑथराइजेशन TTL के भीतर पहले से सत्यापित सामग्री ही सर्व करें। उस TTL के बाद, उन सामग्रियों को प्रदर्शित करने के बजाय विफल हो जाएं या परिणामों को संकीर्ण करें जिनकी एक्सेस निरस्त हो सकती है।
कई क्षेत्रों में, ऑथर का होम रीजन एक पोस्ट स्वीकार करता है और एक ग्लोबल ID असाइन करता है, फिर इवेंट्स रीड रीजन्स में एसिंक्रोनस रूप से रेप्लिकेट होते हैं। साधारण सामग्री में सेकंड-स्तरीय फ्रेशनेस हो सकती है; ऑथर को होम रीजन के माध्यम से तत्काल रीड-योर-राइट्स मिलते हैं। डिलीट्स, ब्लॉक्स, और विजिबिलिटी प्रतिबंध उच्च-प्राथमिकता वाले रेप्लिकेशन का उपयोग करते हैं, और पुराने रेप्लिकास तब तक प्रतिबंधित रहते हैं जब तक कि ग्लोबल टॉम्बस्टोन सर्विस स्थिति की पुष्टि नहीं करती है। एक्टिव-एक्टिव फॉलो-ग्राफ़ राइट्स संबंध संघर्ष जोड़ते हैं और केवल एक स्पष्ट आवश्यकता के लिए पेश किए जाने चाहिए।
चरण 8: मेट्रिक्स और फॉल्ट इंजेक्शन के साथ सीमाओं को साबित करना
कोर मेट्रिक्स में क्रिएट सफलता, पोस्ट-टू-फ़र्स्ट और पोस्ट-टू-95-प्रतिशत-सक्रिय-फ़ॉलोअर विजिबिलिटी, प्रति-शार्ड फ़ैन-आउट थ्रूपुट और सबसे पुराना लैग, हाई-फ़ैन-आउट पुल लेटेंसी, कैंडिडेट काउंट, डीडुप्लीकेशन दर, फ़िल्टर दर, रिट्रीवल और रैंकिंग p99, हाइड्रेशन बैच का आकार, कैश हिट दर, कर्सर समाप्ति, पेज डुप्लिकेट्स, खाली पेज, और डिलीट की गई या निरस्त सामग्री का रिसाव (leakage) शामिल हैं। अंतिम मीट्रिक शून्य रहना चाहिए और इसके लिए सक्रिय सिंथेटिक प्रोब्स की आवश्यकता होती है।
फॉल्ट इंजेक्शन में डुप्लिकेट और आउट-ऑफ-ऑर्डर पोस्ट इवेंट्स; 50-मिलियन-फ़ॉलोअर ऑथर द्वारा बार-बार पोस्ट; फ़ैन-आउट के बीच में पुश से पुल पर स्विच करने वाला ऑथर; समवर्ती फॉलो, अनफॉलो, और पोस्ट; पेजिंग के दौरान डिलीट या गोपनीयता परिवर्तन; खोया हुआ टॉम्बस्टोन कैश; एक धीमा फॉलोअर शार्ड; इवेंट-बस आउटेज और कैच-अप; रैंकिंग टाइमआउट; खोया हुआ फ़ीड-सेशन नोड; और क्षेत्रीय रेप्लिकेशन विलंब शामिल होना चाहिए। प्रत्येक परिदृश्य यह सुनिश्चित करता है कि कोई अनधिकृत सामग्री दिखाई न दे, रेफरेंसेस कन्वर्ज हों, लेटेंसी में गिरावट अवलोकनीय हो, और रिकवरी डुप्लिकेट राइट्स को बढ़ाए नहीं।
उच्च गुणवत्ता वाला नमूना उत्तर
“50 मिलियन DAU और प्रत्येक दिन 20 पेजों के साथ, मुझे प्रति सेकंड लगभग 11,600 औसत फ़ीड रीड्स और पांच गुना पीक पर 58,000 प्राप्त होते हैं। दस मिलियन दैनिक पोस्ट केवल लगभग 116 QPS हैं, लेकिन सामान्य ऑथर के 200 सक्रिय फॉलोअर्स इसे औसतन लगभग 23,100 कैंडिडेट इंसर्ट्स प्रति सेकंड तक विस्तारित करते हैं। 50 मिलियन फॉलोअर्स वाले एक पोस्ट में सिंक्रोनस फुल पुश का उपयोग नहीं किया जा सकता है।
मैं पोस्ट सोर्स ऑफ़ ट्रुथ, सोशल ग्राफ़, और कैंडिडेट इनबॉक्स को अलग करूंगा। क्रिएट ट्रांजैक्शन पोस्ट और आउटबॉक्स लिखता है। सामान्य-ऑथर इवेंट्स viewer_id + post_id इडेम्पोटेंसी के साथ फॉलोअर शार्ड द्वारा प्रति-उपयोगकर्ता इनबॉक्स में फ़ैन आउट होते हैं। हाई-फ़ैन-आउट ऑथर्स केवल एक रीसेंट-ऑथर इंडेक्स लिखते हैं और फ़ीड रीड्स के दौरान पुल और मर्ज किए जाते हैं। पुश-पुल सीमा सक्रिय फॉलोअर्स, पोस्टिंग दर, कतार बजट, और रीड लागत का उपयोग करती है। टाइमलाइन्स रेफरेंसेस स्टोर करती हैं; बॉडीज़ और मीडिया को केवल अंतिम आइटम्स के लिए बैच-हाइड्रेट किया जाता है।
एक रीड के लिए, एग्रीगेटर इनबॉक्स, हाई-फ़ैन-आउट, और सिफारिश स्रोतों से बाउंडेड कैंडिडेट्स प्राप्त करता है। यह सस्ते रिट्रीवल, भारी रैंकिंग, विविधता, और आवृत्ति नियंत्रण से पहले वर्तमान फॉलो, ब्लॉक, टॉम्बस्टोन, और विजिबिलिटी द्वारा फ़िल्टर और डीडुप्लिकेट करता है। पहला पेज 30-मिनट के फ़ीड सेशन में 500 कैंडिडेट्स तक फ़्रीज़ करता है, और कर्सर में सेशन प्लस स्थिति होती है। नए पोस्ट रीफ़्रेश की प्रतीक्षा करते हैं, जबकि डिलीट्स और विजिबिलिटी प्रतिबंधों को प्रत्येक पेज पर फ़िल्टर और बैकफ़िल किया जाता है।
डिलीट और गोपनीयता परिवर्तन एक आधिकारिक वर्शन के साथ एक उच्च-प्राथमिकता वाला इनवैलिडेशन कमिट करते हैं। कैश और इनबॉक्स क्लीनअप में देरी हो सकती है, लेकिन प्रत्येक प्रस्तुति स्थिति की दोबारा जांच करती है। कतार में देरी के दौरान, एक पुराना मटीरियलाइज़्ड फ़ीड लौटाएं और बाउंडेड सोर्स रीड्स निष्पादित करें; रैंकिंग टाइमआउट के दौरान, फ्रेशनेस पर वापस जाएं। ऑथराइजेशन कभी ख़राब नहीं होता। मैं पोस्ट-टू-विजिबल लेटेंसी, सबसे पुराने लैग, प्रत्येक रैंकिंग स्टेज के p99, डुप्लिकेट दर, और निरस्त-सामग्री रिसाव की निगरानी करूंगा, फिर सेलिब्रिटी बर्स्ट्स, डुप्लिकेट इवेंट्स, अनफॉलो रेस, डिलीट्स, कैश लॉस, और क्षेत्रीय दोषों को इंजेक्ट करूंगा।”
सामान्य गलतियाँ
- केवल रॉ रीड और राइट QPS की तुलना करना। पोस्टिंग औसतन लगभग 116 QPS है, लेकिन फॉलोअर फ़ैन-आउट राइट्स पर हावी है। एम्प्लीफिकेशन और हैवी-टेल्ड ग्राफ़ की गणना करें।
- प्रत्येक ऑथर के लिए फ़ैन-आउट-ऑन-राइट का उपयोग करना। 50-मिलियन-फ़ॉलोअर वाला ऑथर 50 मिलियन इंसर्ट्स का कारण बनता है। रीड्स के दौरान हाई-फ़ैन-आउट ऑथर्स को पुल करें।
- सेलिब्रिटी थ्रेशोल्ड को एक स्थायी स्थिरांक बनाना। फॉलोअर गतिविधि, पोस्टिंग दर, और कतार हेडरूम बदलते रहते हैं। लागत और SLOs से वर्गीकृत करें और संक्रमणों की रक्षा करें।
- टाइमलाइन्स में पूरी बॉडीज़ को कॉपी करना। संपादन, डिलीट, और विजिबिलिटी परिवर्तन एक विशाल इनवैलिडेशन सतह बनाते हैं। रेफरेंसेस स्टोर करें और हाइड्रेशन के दौरान वर्जन्स की दोबारा जांच करें।
- डायनेमिक रूप से रैंक किए गए पेजों के लिए
offsetका उपयोग करना। इंसर्ट्स और री-रैंकिंग डुप्लिकेट्स और अंतराल का कारण बनते हैं। एक अल्पकालिक फ़ीड सेशन या एक वर्जन्ड कंपाउंड कर्सर का उपयोग करें। - अनफॉलो और डिलीट को केवल बैकग्राउंड जॉब्स में फ़िल्टर करना। क्लीनअप लैग सामग्री को लीक करता है। रीड्स के दौरान आधिकारिक ग्राफ़, टॉम्बस्टोन, और विजिबिलिटी की जाँच करें।
- इवेंट बस से एंड-टू-एंड एक्ज़ैक्टली-वन्स का दावा करना। वर्कर्स, स्टोरेज, और रीट्रीज़ अभी भी डुप्लिकेट करते हैं। इवेंट IDs, पोस्ट वर्जन्स, और यूनिक कैंडिडेट कीज़ के साथ कन्वर्ज करें।
- डिग्रेडेशन के दौरान ऑथराइजेशन को छोड़ना। बासी क्रम और कम कैंडिडेट्स स्वीकार्य हो सकते हैं; अनधिकृत प्रदर्शन नहीं है। सुरक्षा फ़िल्टरिंग को अपना बजट और विफलता नीति दें।
- केवल सामान्य ट्रैफ़िक का परीक्षण करना। महत्वपूर्ण जोखिम हाई-फ़ैन-आउट ऑथर्स, लैग, रीऑर्डरिंग, और ऑथराइजेशन रेस हैं। फॉल्ट इंजेक्शन को उन सीमाओं को कवर करना चाहिए।
फॉलो-अप प्रश्न और प्रतिक्रियाएं
फॉलो-अप 1: जब कोई सामान्य ऑथर अचानक 50 मिलियन फॉलोअर्स प्राप्त कर लेता है तो दोनों पथ डुप्लिकेट्स से कैसे बचते हैं?
कंट्रोल प्लेन ऑथर को एक वर्शन के तहत पुल मोड में स्विच करता है। फ़ैन-आउट जॉब्स उस मोड वर्शन को पढ़ते हैं और पहले से क्लेम किए गए बैचों के केवल एक सीमित सेट को समाप्त करने की अनुमति देते हैं। कैंडिडेट्स (viewer_id, post_id) पर इडेम्पोटेंट होते हैं, इसलिए पुश और पुल की गई प्रतियां एक में मर्ज हो जाती हैं। कतार प्रत्येक ऑथर को एक कोटा देती है, और संक्रमण के दौरान नए पोस्ट सीधे हाई-फ़ैन-आउट इंडेक्स में जाते हैं।
फॉलो-अप 2: व्यूअर द्वारा किसी ऑथर को अनफॉलो करने के बाद पुराने फ़ीड सेशन का क्या होता है?
एक सेशन ऑर्डरिंग को फ़्रीज़ करता है, ऑथराइजेशन को नहीं। प्रत्येक पेज हाइड्रेशन बैच वर्तमान फॉलो और ब्लॉक ग्राफ़ की जांच करता है। अनफॉलो की गई सामग्री को फ़िल्टर किया जाता है और बाद के कैंडिडेट्स से बदल दिया जाता है। एसिंक्रोनस इनबॉक्स क्लीनअप स्पेस बचाता है लेकिन तत्काल ऑथराइजेशन सिमेंटिक्स प्रदान नहीं करता है।
फॉलो-अप 3: आप सख्त क्रोनोलॉजिकल क्रम का समर्थन कैसे करेंगे?
कैंडिडेट सोर्सेज और विजिबिलिटी फ़िल्टर का पुन: उपयोग करें, सॉर्ट की को (created_at, post_id) में बदलें, और ऊपरी-सीमा स्नैपशॉट समय के साथ कीसेट पेजिनेशन का उपयोग करें। नए पोस्ट रीफ़्रेश के बाद दिखाई देते हैं। हाई-फ़ैन-आउट और सामान्य इनबॉक्स स्रोतों को अभी भी एक मर्ज की आवश्यकता होती है, लेकिन भारी रैंकिंग सेशन अनावश्यक है।
फॉलो-अप 4: रैंकिंग-मॉडल रिलीज़ के बाद आप डुप्लिकेट-दर में वृद्धि को कैसे अलग (isolate) करते हैं?
मॉडल वर्शन द्वारा प्री- और पोस्ट-डीडुप कैंडिडेट काउंट्स, सेशन-जनरेशन IDs, कर्सर पोजीशन्स, और इम्प्रेशन रिकॉर्ड्स की तुलना करें। निर्धारित करें कि डुप्लिकेशन किसी स्रोत, रैंक आउटपुट, या खोए हुए सेशन के माध्यम से प्रवेश करता है या नहीं। सोर्स उपनामों को आधिकारिक post_id पर मैप करें। यदि सेशन स्टोरेज फ़्लैप हो रहा है, तो मॉडल को रोल बैक करने से मदद नहीं मिलेगी; सेशन स्टोर को पुनर्स्थापित करें और क्लाइंट्स को स्पष्ट रूप से रीफ़्रेश करने के लिए कहें।
फॉलो-अप 5: आपको कैसे पता चलेगा कि हाइब्रिड फ़ैन-आउट सीमा सही है?
वास्तविक फॉलोअर-काउंट और गतिविधि वितरण को ऑफ़लाइन रीप्ले करें। प्रत्येक ऑथर के प्री-कंप्यूट राइट्स, कतार प्रतीक्षा, रीड मर्जिंग, और कैश-हिट लागत का अनुमान लगाएं। पोस्ट-टू-विजिबल p99, फ़ीड-रीड p99, कुल स्टोरेज राइट्स, और डिग्रेडेशन दर का अवलोकन करते हुए सीमा को धीरे-धीरे ऑनलाइन स्थानांतरित करें। हिस्टैरिसीस (hysteresis) जोड़ें ताकि ऑथर्स पुश और पुल मोड के बीच बार-बार न बदलें (flap न करें)।