1 पॉइंट द्वारा GN⁺ 2024-07-28 | 1 टिप्पणियां | WhatsApp पर शेयर करें

650,000,000 checkboxes को check करना: अप्रत्याशित लोकप्रियता से निपटना

26 जून 2024 को One Million Checkboxes (OMCB) वेबसाइट लॉन्च की गई
  • 10 लाख global checkboxes वाली साइट, जहाँ किसी checkbox को check करने पर वह सभी users को तुरंत दिखता था
  • लॉन्च के सिर्फ 30 मिनट में, हज़ारों users ने लाखों checkboxes check कर दिए
  • Hacker News, /r/InternetIsBeautiful, Mastodon, Twitter आदि से ट्रैफिक आया
  • Washington Post और New York Times में भी इसका ज़िक्र हुआ
  • पहले दिन 5 करोड़ से अधिक checkboxes check किए गए
  • 2 हफ़्ते बाद साइट बंद होने से पहले 65 करोड़ से अधिक checkboxes check किए जा चुके थे

मूल architecture

  • checkbox state को 10 लाख bits (125KB) में store किया गया था
  • client bitset का उपयोग करके checkboxes render करता था और server को check state बताता था
  • server Redis का उपयोग करके bits update करता था और सभी clients को broadcast करता था
  • nginx के जरिए static content serve किया जाता था, और Flask server bitset state तथा WebSocket connections को handle करता था
  • Redis state storage और message queue, दोनों की भूमिका निभाता था

scaling के सिद्धांत

  • cost limit: serverless पर scale करने से दिवालिया न हो जाएँ, इसके लिए लागत का गणित पहले से निकाला गया
  • short-term solutions को स्वीकार करना: यह मानकर तेज़ समाधान चुने गए कि साइट की लोकप्रियता अस्थायी होगी
  • simple और self-hosted tech का उपयोग: केवल वही तकनीक जो खुद चला सकें और debug कर सकें
  • fun को प्राथमिकता: पैसे से ज़्यादा मज़े को महत्व दिया गया
  • global state बनाए रखना: ताकि सभी users बदलाव तुरंत देख सकें

पहला दिन: विस्फोटक लोकप्रियता

  • 30 मिनट में server load तेज़ी से बढ़ गया
  • load बाँटने के लिए अतिरिक्त servers spin up किए गए
  • Redis connection issues हल करने के लिए batch updates लागू किए गए
  • Digital Ocean के managed Redis instance को upgrade किया गया

रातभर कोई योजना नहीं थी

  • ITP camp में face recognition Pacman game दिखाने के लिए योजना बनाई गई
  • iPad साथ लाकर वहीं से servers spin up किए गए
  • server naming convention को विकसित करते हुए 8 worker VMs चलाई गईं
  • load कम करने के लिए Flask processes की संख्या घटाई गई और update batch size बढ़ाया गया

bandwidth समस्या

  • Digital Ocean की bandwidth pricing का ध्यान नहीं रखा गया था
  • state snapshot की frequency घटाई गई और update size कम किया गया
  • tc utility का उपयोग करके प्रति सेकंड भेजे जाने वाले data की मात्रा सीमित की गई

दूसरा दिन: वृद्धि जारी रही

  • input validation ठीक से न होने के कारण साइट डाउन हो गई
  • load बाँटने के लिए Redis replicas जोड़े गए
  • Flask processes बार-बार crash हो रहे थे, इसलिए auto-restart script लिखी गई

पुराने updates की समस्या

  • clients पुराने updates apply कर रहे थे, जिससे state गलत दिख रही थी
  • update order सुनिश्चित करने के लिए timestamps जोड़े गए

Go में rewrite

  • एक performance engineer दोस्त के साथ backend को Go में rewrite किया गया
  • performance में बड़ा सुधार हुआ
  • CloudFlare के माध्यम से DDOS attacks को रोका गया

साइट बंद करना

  • ऐसा बदला गया कि अगर checkboxes को तेज़ी से uncheck न किया जाए तो वे freeze हो जाएँ
  • freeze state को manage करने के लिए Redis का उपयोग किया गया
  • 2 हफ़्ते बाद साइट बंद कर दी गई

सीखी गई बातें

  • यह दूसरी बार था जब किसी 'असल' backend वाले server को public internet पर deploy किया गया
  • short-term solutions चुनना सही फैसला साबित हुआ
  • Redis और nginx की ताकत फिर से साबित हुई
  • यह भी स्पष्ट हुआ कि लोग anonymous interaction वाली साइटों के लिए उत्सुक हैं

GN⁺ का सार

  • यह लेख वेबसाइट की अप्रत्याशित लोकप्रियता के कारण पैदा हुई technical समस्याओं और उनके समाधानों पर है
  • यह दिखाता है कि Redis और nginx पर आधारित साधारण architecture भी बड़े पैमाने के traffic को संभाल सकता है
  • इसमें बताया गया है कि short-term solutions के जरिए समस्याओं को तेज़ी से हल करके साइट को stable कैसे रखा गया
  • Go में rewrite और CloudFlare के जरिए DDOS defense जैसे कई technical challenges भी शामिल हैं
  • इसी तरह की functionality वाले projects में Reddit का /r/Place जैसा large-scale collaborative project शामिल है

1 टिप्पणियां

 
GN⁺ 2024-07-28
Hacker News राय
  • इससे बहुत-सी सीख और ऐतिहासिक जानकारी मिली

    • हर तरह की रुकावटों और failure points को संभाला गया, लेकिन storage space की समस्या का ज़िक्र नहीं था
    • यह नहीं पता था कि Redis, Lua का इस्तेमाल कर सकता है, और इसे alternative state के रूप में इस्तेमाल करने में रुचि जगी
    • cloud services में bandwidth की समस्या सबसे बड़ी शिकायतों में से एक है, क्योंकि overbilling से बचने के लिए hard limit नहीं होती
  • शानदार लेख था! वेबसाइट के लिए भी बधाई, लेकिन लेख खुद ही वह हिस्सा है जिस पर सबसे ज़्यादा गर्व होना चाहिए

  • साइट को दो दिनों में बनाना एक अच्छा फैसला था

    • यह शुरुआती करियर वाले engineers के लिए सीखने लायक अहम सबक है
    • scaling problems तब तक समस्या नहीं होतीं जब तक वे सचमुच समस्या न बन जाएँ
    • उस समय यह एक अच्छी समस्या होती है, और इसे हल करना सोच से उतना मुश्किल नहीं होता
  • हाल का संबंधित प्रोजेक्ट:

    • "One Million Checkboxes" - लिंक - जून 2024 (305 टिप्पणियाँ)
  • मज़ेदार प्रोजेक्ट है

    • 6 साल पहले Android पर Pixmap नाम का collaborative pixel editing app लॉन्च किया था
    • queue का इस्तेमाल करके हर event को PNG image पर apply किया गया, और client कनेक्ट होने पर शुरुआती PNG लोड करता है
    • हर pixel draw event client को एक छोटे object के रूप में भेजा जाता है
    • शुरुआती लोड में image compression का लाभ मिलता है, और change sets बहुत छोटे होते हैं
    • हर event log में सेव होता है, इसलिए image को "rewind" किया जा सकता है
    • डेमो लिंक
  • शानदार लेख था - यह जानने की जिज्ञासा है कि इसकी लागत कितनी आई

  • यह विश्वास पक्का हुआ कि लोग सीमित anonymous interaction की चाह रखते हैं

  • backend में नए व्यक्ति के रूप में यह जानने की जिज्ञासा है कि इस प्रोजेक्ट के लिए कोई सरल alternative architecture है या नहीं

    • उम्मीद है कि दस लाख states को host करने और clients के साथ sync करने का कोई आसान तरीका होगा
    • लेख में दिए गए कुछ solutions समझने में मुश्किल थे
    • लेखक को बधाई - प्रोजेक्ट शानदार है
  • बढ़िया!

    • जिज्ञासा है कि अगला लेख checkboxes के statistical analysis पर होगा या नहीं
    • याद है कि मेरा चुना हुआ checkbox लगभग तुरंत uncheck हो गया था, और उससे दुख हुआ था
  • जिज्ञासा है कि क्या गेम अभी भी live है

    • जब One Million Checkboxes पर गया, तो कुछ भी checked नहीं था, और JS console में सिर्फ़ यह संदेश दिखा
    • {"total":0,"totalGold":0,"totalRed":0,"totalGreen":0,"totalPurple":0,"totalOrange":0,"recentlyChecked":false}