01प्रोजेक्ट का अवलोकन
अलर्ट्स मानचित्रयह दिखाता है कि वर्तमान में हवाई हमले की चेतावनी कहाँ है: क्षेत्र और जिले के अनुसार, मानचित्र पर चलती हुई लक्ष्यों के साथ, अग्रिम पंक्ति, उपग्रहों से थर्मल बिंदु और नीचे निगरानी चैनलों का फीड। इसे वे लोग पढ़ते हैं जिन्हें सेकंड में उत्तर चाहिए, और इसे फोन पर, रात में, खराब मोबाइल इंटरनेट पर पढ़ा जाता है।
हालांकि, यह पृष्ठ केवल उत्पाद का एक हिस्सा है। वही डेटा एक खुले JSON API के माध्यम से कुंजी और दर सीमाओं के साथ बाहर जाता है, और एक विजेट के माध्यम से जिसे अन्य वेबसाइटें अपने फ्रेम में एम्बेड करती हैं। हमने इसका सभी डिज़ाइन और निर्माण किया: संग्रहकर्ता, भंडारण, API, मानचित्र और विजेट।
02संदर्भ और समस्या
जो डेटा «क्या यहाँ कोई चेतावनी है» का उत्तर देता है, वह एक ही स्थान पर नहीं है। आधिकारिक चेतावनियाँ क्षेत्र के अनुसार आती हैं। समुदायों के लिए स्थानीय चेतावनियाँ एक अलग सेवा से आती हैं। लक्ष्यों के स्थान को निगरानी चैनलों द्वारा शब्दों में लिखा जाता है। अग्रिम पंक्ति एक मानचित्रण परियोजना द्वारा प्रकाशित की जाती है। आग उपग्रहों द्वारा देखी जाती है। पाँच स्रोत, पाँच प्रारूप, «अब» का पाँच अलग-अलग विचार।
दूसरी समस्या चुप्पी है। इनमें से कोई भी स्रोत रुक सकता है - एक चैनल चुप हो जाता है, एक API समय समाप्त करना शुरू कर देता है - और ईमानदार विफलता मोड यह कहना है, न कि कल की तस्वीर खींचते रहना। एक मानचित्र जो शांत दिखता है क्योंकि इसका स्रोत मर गया है, बिना मानचित्र के होने से बदतर है।
03प्रोजेक्ट के लक्ष्य
- पाँच स्वतंत्र स्रोतों से एक चित्र, प्रत्येक अपने स्वयं के रिफ्रेश घड़ी पर;
- फोन पर, कमजोर कनेक्शन पर, रात में सेकंड में एक उत्तर;
- डेटा जो साइट छोड़ सकता है: कुंजी, सीमाएँ और टैरिफ के साथ एक खुला API, और एक एम्बेड करने योग्य विजेट;
- तीन भाषाएँ, क्योंकि दर्शक केवल स्थानीय नहीं है;
- एक स्रोत जो चुप हो गया है, उसे शांत के रूप में नहीं, बल्कि चुप के रूप में दिखाई देना चाहिए;
- सर्वर का अपना पता कभी भी उन स्रोतों तक नहीं पहुंचना चाहिए जिन्हें यह पढ़ता है।
04पाँच स्रोत, एक चित्र
- आधिकारिक अलर्ट क्षेत्र के अनुसार — मानचित्र की रीढ़;
- स्थानीय अलर्ट समुदायों और जिलों के लिए, एक अलग सेवा से;
- निगरानी चैनल टेलीग्राम में — सार्वजनिक पूर्वावलोकनों से और, बंद चैनलों के लिए, संदेश प्रोटोकॉल के माध्यम से;
- सामने की रेखा, एक मानचित्र परियोजना से जो इसे प्रकाशित करता है;
- थर्मल बिंदु NASA उपग्रहों से — कक्ष से देखे गए आग।
कलेक्टर्स सिस्टम पर्यवेक्षक के तहत दो दीर्घकालिक श्रमिकों के रूप में चलते हैं, प्रत्येक अपने आप में पुनः प्रारंभ होता है, और स्थानीय भंडारण में लिखते हैं। वेबसाइट कभी भी सीधे स्रोत से बात नहीं करती: यह पढ़ती है कि कलेक्टर्स ने पहले से क्या लिखा है, यही कारण है कि एक धीमा स्रोत मानचित्र को पुराना बनाता है न कि अनुपलब्ध।
05एक डेटाबेस के बजाय चार फ़ाइलें
डेटा चार अलग-अलग SQLite फ़ाइलों में रहता है: अलर्ट लॉग, पुश सदस्यताएँ और उनके क्षेत्र-विशिष्ट राज्य, फ़ीड के साथ मानचित्र घटनाएँ, और उनकी दर काउंटर के साथ API कुंजी। जानबूझकर कोई साझा डेटाबेस नहीं है — एक फ़ाइल की विफलता को अन्य फ़ाइलों को नीचे नहीं ले जाना चाहिए। यदि पुश सदस्यताएँ अनुपलब्ध हैं, तो मानचित्र फिर भी बनता है; यदि कुंजी भंडार व्यस्त है, तो पृष्ठ फिर भी उत्तर देता है।
सभी समूह के नियंत्रण पैनल द्वारा समान फ़ाइलें लिखी जाती हैं — एक कुंजी जारी करना, एक अलर्ट स्थिति को रीसेट करना — इसलिए हर कनेक्शन एक प्रतीक्षा समय के साथ खुलता है। SQLite डिफ़ॉल्ट रूप से व्यस्त डेटाबेस पर तुरंत हार मान लेता है, और यहाँ «तुरंत» का अर्थ होगा एक त्रुटि पृष्ठ जबकि एक श्रमिक केवल एक पंक्ति लिख रहा था।
06एक पृष्ठ पर तीन घड़ियाँ
विभिन्न डेटा विभिन्न गति से पुराना होता है, इसलिए यह विभिन्न गति से ताज़ा होता है: हर 15 सेकंड में अलर्ट, हर 10 में चलती लक्ष्यों, हर 20 में फ़ीड। एक सामान्य अंतराल दोनों दिशाओं में गलत होगा — लक्ष्यों के लिए बहुत धीमा, फ़ीड के लिए बर्बादी, और हजारों खुले टैब के लिए हर कुछ सेकंड में एक अनावश्यक अनुरोध।
प्रत्येक ब्लॉक अपने «अंतिम अपडेट» को भी ले जाता है। एक पृष्ठ जो चुपचाप फिर से बनता है, आपको ठीक उसी समय विश्वास करना सिखाता है जब इसे विश्वास नहीं किया जाना चाहिए; एक टाइमस्टैम्प जो चलना बंद कर देता है, यह कहने का सबसे तेज़ तरीका है «यह भाग पुराना है»।
07की और टैरिफ के साथ एक ओपन API
मानचित्र वह प्रकाशित करता है जो उसे पता है: वर्तमान अलर्ट, घटनाएँ, «oblast × time bucket» का हीट मैप के साथ एक एनालिटिक्स एंडपॉइंट, दिन का रिदम, लक्ष्य प्रकार और दिशाएँ। गुमनाम कॉल करने वालों को प्रति मिनट एक मामूली सीमा मिलती है; एक कुंजी इसे बढ़ाती है, और उन लोगों के लिए टैरिफ चरणों में बढ़ते हैं जो इस पर निर्माण करते हैं।
कुंजियाँ साझा नियंत्रण पैनल से जारी की जाती हैं, कभी भी हाथ से टाइप नहीं की जातीं, और उपयोग प्रति कुंजी प्रति दिन गिना जाता है। एक एंडपॉइंट जानबूझकर केवल कुंजी के मालिक के लिए बंद है - वह जो एक कुंजी को उसके अपने टैरिफ, सीमा और खपत के बारे में बताता है। बाकी सब खुला है, क्योंकि एक सार्वजनिक सेवा मानचित्र जो अपने डेटा को छुपाता है, केवल आधी सार्वजनिक सेवा है।
08एक विजेट जो दूसरों की साइटों पर रहता है
विजेट उत्पाद का वह हिस्सा है जो घर से बाहर जाता है। दो निश्चित आकार - एक स्थिति पट्टी और एक वर्ग पैनल - तीन भाषाएँ, दो थीम, और एक फ्रेम नीति जो विशेष रूप से यहाँ एम्बेडिंग की अनुमति देने के लिए लिखी गई है और साइट पर कहीं और नहीं: मानचित्र और विजेट को फ्रेम किया जा सकता है, खाता और समर्थन पृष्ठों को नहीं।
क्योंकि यह एक फ्रेम में रहता है, विजेट के पास अपनी कोई कुकीज़ नहीं होतीं और यह इंटरफेस पीढ़ी का चयन नहीं करता: यह सभी के लिए समान दिखता है। यह एक निर्णय है, न कि एक सीमा - एक विजेट जो आगंतुक के पिछले विकल्पों के आधार पर अलग-अलग प्रदर्शित होता है, किसी और के पृष्ठ पर समर्थन करना असंभव होगा।
09पुश जो आपके क्षेत्र को जानता है
एक सदस्यता एक क्षेत्र से जुड़ी होती है, और हर क्षेत्र की स्थिति सदस्यताओं के बगल में रखी जाती है। यही कारण है कि एक सूचना किनारे पर आती है - जब आपके oblast में अलर्ट शुरू या समाप्त होता है - स्रोत के हर रिफ्रेश के बजाय। अंतर पूरा उत्पाद है: एक एक संकेत है, दूसरा शोर है जिसे लोग एक दिन के भीतर बंद कर देते हैं।
एक मूल एप्लिकेशन उसी डेटा के शीर्ष पर है, और यह वेब पृष्ठों के बजाय एक ऐप API से बात करता है। इसका एक स्वास्थ्य एंडपॉइंट फ्लीट रजिस्ट्र्री का उत्तर देता है, क्योंकि एक जीवितता जांच की लागत उस काम से अधिक नहीं होनी चाहिए जिसे यह जांचता है।
10तीन भाषाएँ, विजेट सहित
नक्शा यूक्रेनी, अंग्रेजी और रूसी बोलता है, और एपीआई संदर्भ, खाता पृष्ठ और विजेट भी। एक नया इंटरफ़ेस स्ट्रिंग तीनों में एक साथ जोड़ा जाता है और एक जांच गायब लोगों की गिनती करती है: गिनती शून्य होनी चाहिए। आधा-अनुवादित इंटरफेस खुद को नहीं बताते - वे चुपचाप एक भाषा को दूसरी के अंदर दिखाते हैं और जो भी उन्हें लिखता है, उनके लिए ठीक लगते हैं।
क्षेत्र के नाम एक अलग कहानी हैं: वे अपने स्वयं के वर्तनी में स्रोतों से आते हैं, इसलिए नक्शा अपने स्वयं के शब्दकोश को रखता है बजाय इसके कि जो भी फीड में आया है उस पर भरोसा करे।
11आपका पता दिखाए बिना स्रोत पढ़ना
संग्रहकर्ताओं द्वारा लाया गया सब कुछ SOCKS5 प्रॉक्सी के माध्यम से बाहर जाता है, जिसमें बंद चैनलों के लिए उपयोग किया जाने वाला संदेश प्रोटोकॉल भी शामिल है - वहां प्रॉक्सीिंग कोड में की जाती है, बिना किसी अतिरिक्त निर्भरता के। सर्वर का अपना पता कभी भी स्रोत तक नहीं पहुंचता, और एक स्रोत जो किसी को ब्लॉक करने का निर्णय लेता है, वह प्रॉक्सी को ब्लॉक करता है, न कि उस मशीन को जो नक्शा प्रदान करती है।
रेट लिमिटर एपीआई के सामने उसी कारण से बैठता है: एक सार्वजनिक एंडपॉइंट जिसमें लाइव डेटा होता है, स्क्रैपर्स को आकर्षित करता है, और प्रति कुंजी प्रति मिनट एक सीमा वह है जो एक सार्वजनिक सेवा को उन लोगों के लिए उपयोगी रखती है जिनके लिए इसे लिखा गया था।
12प्रौद्योगिकी स्टैक
- PHP 8.3बिना किसी ढांचे के: एक छोटा राउटर, एंडपॉइंट और रेंडरर्स;
- पायथन श्रमिकसिस्टम पर्यवेक्षक के तहत - एक केवल मानक पुस्तकालय पर, एक संदेश प्रोटोकॉल बोलने वाला;
- SQLite, चार अलग-अलग फ़ाइलें, प्रत्येक के पास अस्तित्व का अपना कारण है;
- लीफलेटनक्शे के लिए, हैश किए गए संसाधन, निश्चित आकार के साथ एक विजेट;
- क्षेत्र-वार स्थिति के साथ वेब पुश, समान डेटा पर एक मूल ऐप;
- हर आउटबाउंड अनुरोध के लिए SOCKS5 निकासी, API के सामने प्रति-कुंजी दर सीमाएँ।
13परिणाम
एक नक्शा जो सेकंडों में उत्तर देता है और जब इसके पांच स्रोतों में से एक रुकता है तो उत्तर देना जारी रखता है। डेटा जो अन्य साइटें ले सकती हैं: कुंजी और टैरिफ के साथ एक ओपन API, और तीन भाषाओं और दो विषयों में एक विजेट। सूचनाएँ जो किसी घटना के किनारे पर सक्रिय होती हैं न कि हर पोल पर। समान डेटा पर एक मूल एप्लिकेशन, और एक नियंत्रण पैनल जहाँ कुंजी जारी की जाती हैं और स्थितियाँ रीसेट की जाती हैं।
14सीखने योग्य बातें
तीन चीजें जो हम किसी भी लाइव डेटा प्रोजेक्ट में ले जाएंगे।पृष्ठ से संग्रहकर्ता को अलग करें: एक वेबसाइट जो स्रोत को लाती है जबकि एक आगंतुक प्रतीक्षा करता है, वह वेबसाइट है जो तब नीचे जाती है जब स्रोत नीचे जाता है।हर ब्लॉक को अपनी घड़ी और अपना टाइमस्टैम्प दें: एकल अंतर दोनों दिशाओं में गलत है, और एक मौन पुनःचित्रण पुरानी जानकारी को छिपा देता है।जब आप नहीं जानते तो कहें: एक खाली ब्लॉक जो इसे स्वीकार करता है, वह कल के डेटा के साथ शांत दिखने वाले मानचित्र से अधिक मूल्यवान है।
और एक उत्पाद पाठ: जिस क्षण डेटा को कहीं और एम्बेड किया जा सकता है, वह विजेट उत्पाद बन जाता है। इसे निश्चित आकार, अपनी फ्रेम नीति और अनुवादों की आवश्यकता होती है - मुख्य पृष्ठ की तरह ही देखभाल, न कि इसका अवशेष।
यदि आपके पास लाइव डेटा है और आपको एक मानचित्र, एक एपीआई और एक विजेट की आवश्यकता है जिसे अन्य साइटें ले सकती हैं, तो यह वह प्रकार का काम है जो हम अंत से अंत तक करते हैं।



