10 बार के सुधार के बाद तैयार हुआ URL Shortener (Rust ver.) ओपन सोर्स
(github.com/lee-lou2)URL Shortener प्रोजेक्ट को बनाकर, सुधारकर, फिर बनाकर, फिर सुधारकर... यह दोहराते-दोहराते आखिरकार अंतिम-अंतिम-अंतिम v9 ओपन सोर्स प्रोजेक्ट बना पाया।
🚀 Github : https://github.com/lee-lou2/rust-url-shortener
प्रोजेक्ट तैयार करते समय मैंने नीचे दी गई आवश्यकताओं को ज़रूर पूरा करने की कोशिश की।
आवश्यकताएँ
- Short URL बहुत तेज़ी से generate होना चाहिए
- डेटा बढ़ने पर यह धीमा नहीं होना चाहिए
- किसी भी समय, किसी भी स्थिति में, किसी भी डेटा के साथ request आने पर भी यह तेज़ होना चाहिए
- Short URL को Original URL पर redirect करते समय भी यह तेज़ होना चाहिए
- सच कहूँ तो यह तो स्वाभाविक बात है... 😅
- अलग-अलग उपयोगकर्ताओं को संतुष्ट करने वाली अतिरिक्त सुविधाएँ शामिल होनी चाहिए
- आवश्यकता होने पर platform के हिसाब से अलग URL पर redirect किया जा सके
- आवश्यकता होने पर उपयोगकर्ता अपने बनाए गए URL पर आने वाले डेटा को देख सके
इन आवश्यकताओं को पूरा करने के लिए मैंने नीचे बताए गए तरीके से विकास किया।
लागू किए गए बिंदु
Q. Short Key को डेटा की मात्रा से स्वतंत्र रूप से तेज़ी से कैसे generate किया जाए?
A.
आम तौर पर Short Key generate करने के कई तरीके होते हैं।
पहला, एक random value generate करके यह जाँचना कि वह database में मौजूद है या नहीं, और यदि नहीं है तो उसी का उपयोग करना। लेकिन इस तरीके में database में जाँच करनी पड़ती है और फिर दोबारा generate करने की झंझट भी हो सकती है। साथ ही, जब डेटा बहुत ज़्यादा हो जाए या Short Key की लंबाई बदलनी पड़े, तब काफ़ी delay हो सकता है।
दूसरा, पहले से random Short Key बनाकर रखना और बाद में उन्हें match करना। इस तरीके में पहले से बने Short Key को सिर्फ match करना होता है, इसलिए Short URL हमेशा तेज़ी से generate किया जा सकता है। लेकिन यह भी पूर्ण समाधान नहीं है। पहले से बनाने की भी एक सीमा होती है, और अगर कभी पहले से तैयार किए गए Short Key से ज़्यादा Short URL बन गए तो अतिरिक्त बातों पर विचार करना पड़ेगा।
तो क्या इससे भी बेहतर कोई तरीका नहीं हो सकता?
बहुत सोच-विचार के बाद मैंने नीचे दिया गया तरीका अपनाया। इसमें random 4-अक्षरी string और PK का उपयोग करके बनाई गई string को मिलाकर इस्तेमाल किया जाता है। हर value का विवरण नीचे दिया गया है। क्रम इस प्रकार है: जब उपयोगकर्ता Short URL generate करने का अनुरोध करता है, तो एक random 4-अक्षरी string बनाई जाती है और उसे वैसे ही database में सहेज दिया जाता है। सहेजते समय जारी होने वाले PK को नीचे समझाए गए तरीके से string में बदला जाता है। फिर शुरू में बनाई गई random string और PK string को मिलाकर Short Key बनाया जाता है। इस तरह, चाहे कितना भी डेटा जमा हो जाए, यह बिना duplication के तेज़ और सुरक्षित रूप से generate होता है।
- random 4-अक्षर?
यहाँ random 4-अक्षर से मतलब lowercase/uppercase English letters और numbers से बनी एक सचमुच random string है। इस string में duplication हो जाए तो भी कोई समस्या नहीं है। - PK को string में?
अब दूसरे value, यानी PK string की बात। मान लीजिए कि lowercase/uppercase English letters और numbers को मिलाकर strings क्रम से बनाई जाती हैं। क्रम होगा lowercase a -> z, uppercase A -> Z, और numbers 0 -> 9। तब a पहला बना हुआ value होगा, b दूसरा, c तीसरा, ... इस तरह क्रम से values बनती जाएँगी। 9 तक पहुँचने के बाद aa, ab, ac की तरह लंबाई भी बढ़ाई जा सकती है। इस तरह क्रम से strings बनाने पर हर string के लिए एक index बन जाता है। जैसे a का index 1 होगा। यही इस तरीके का मूल है। PK उस index की भूमिका निभाता है, और बस उस PK के अनुरूप string ढूँढनी होती है।
Q. Short URL को Original URL पर redirect करते समय तेज़ कैसे बनाया जाए?
A.
यह काफ़ी सरल था: cache का उपयोग किया। कई तरह की सेवाएँ उपलब्ध हैं, लेकिन इस प्रोजेक्ट में तेज़ data lookup के लिए memory cache लागू किया गया। इसके अलावा, सिर्फ data lookup और redirect से इतर जो अतिरिक्त सुविधाएँ हैं, उन्हें lightweight thread बनाकर process किया गया।
Q. आपने कौन-कौन सी अतिरिक्त सुविधाएँ लागू कीं?
A.
सबसे पहले, platform के अनुसार अलग URL पर redirect होने की सुविधा लागू की। iOS और Android के लिए अलग-अलग default DeepLink लेकर सहेजा जाता है, और DeepLink पर redirect न हो पाए तो उसके लिए FallbackUrl भी अलग से लिया जाता है। इसके अलावा, desktop से access होने पर redirect होने वाला URL भी लिया जाता है ताकि हर case को cover किया जा सके।
दूसरा, Original URL पर redirect होने के समय उपयोगकर्ता access log देख सके, इसके लिए webhook URL लेने और हर बार Original URL पर redirect होने पर उस webhook URL को call करने की सुविधा जोड़ी गई। अभी इसे इस तरह लागू किया गया है कि सिर्फ User Agent और Short URL जानकारी भेजी जाती है।
तीसरा, Short URL generate करते समय Head tag की जानकारी अतिरिक्त रूप से दर्ज करने की सुविधा दी गई। इसका उद्देश्य og tag को customize करना है। यदि यह tag न दिया जाए, तो Default URL की head जानकारी सहेजने के लिए सेट किया गया है।
यह प्रोजेक्ट Rust का उपयोग करके बनाया गया है। सच कहूँ तो Rust सीखे हुए अभी सिर्फ 2 महीने ही हुए हैं। URL Shortener प्रोजेक्ट को शुरू में FastAPI से विकसित किया था, फिर उसके बाद Golang में भी बनाया था। और फिर Rust सीखते-सीखते मैं इसकी खूबियों से इतना प्रभावित हुआ कि पूरी तरह उन्नत URL Shortener प्रोजेक्ट को एक बार फिर से बनाया।
अभी syntax, ownership, lifetime आदि में पूरी सहजता नहीं आई है, इसलिए code में कुछ कमियाँ हो सकती हैं। इसलिए आपसे रुचि, समर्थन और feedback की अपेक्षा है 🙏
अंत तक पढ़ने के लिए धन्यवाद
17 टिप्पणियां
मैंने दूसरे प्रोजेक्ट भी अपलोड किए हैं, कृपया उनमें भी दिलचस्पी दिखाइए 🎉
https://hi.news.hada.io/topic?id=18647
यह बहुत शानदार प्रोजेक्ट है।
जैसा आपने लिखा है, अगर Docker सपोर्ट मिले तो बहुत अच्छा होगा!
धन्यवाद 👏 Docker मैं इसी हफ्ते जोड़कर अपलोड कर दूँगा 🙇♂️
क्या ईमेल दर्ज करना अनिवार्य है? मुझे पता नहीं था कि अगर ईमेल verification न हो, तो webhook या address creation नहीं हो पाएगा।
अगर आपको इसे सिर्फ़ आंतरिक उपयोग के लिए चाहिए और कस्टमाइज़ेशन की ज़रूरत है, तो मैं इस प्रोजेक्ट से अलग इसे अलग से कस्टमाइज़ करके दे दूँगा!
हाँ, इसे public service के रूप में इस्तेमाल करने के लिए मैंने email को अनिवार्य रूप से लेना लागू किया है (बिना सदस्यता पंजीकरण के email verification का उपयोग)।
JWT इनपुट करते समय email न होने पर भी काम करे, ऐसा संशोधन करने के तरीके पर भी मैं एक बार विचार करूँगा 🙏
वाह, मैंने Ubuntu Lightsail इंस्टॉल करके इसे फॉलो करने की कोशिश की, लेकिन SSL,
pkg-config, sqlite, cargo वगैरह जैसी इंस्टॉल करने वाली चीज़ें काफ़ी ज़्यादा हैं :) मैंhttpsवाले हिस्से के लिए NPM की जगह Cloudflare tunnel इस्तेमाल करना चाहता था, लेकिन फिर भी मुझे यह काफ़ी मुश्किल लग रहा है heh.. Docker वर्ज़न का इंतज़ार रहेगा! वैसे भी dynamic link बंद हो जाने की वजह से मैं पहले से ही सोच में था, इसलिए यह बहुत अच्छा लगा।Dockerfile और चलाने योग्य कमांड (
deploy.sh) जोड़ दिए हैं 🎉मैं जितनी जल्दी हो सके Docker जोड़ दूंगा lol
ओह, लेकिन मैंने इसे चलाया था! कैसे किया था? अरे?
मुझे लगता है कि GitHub repo में README के अलावा website पर भी demo URL जोड़ देना अच्छा रहेगा!
आमतौर पर homepage या playground है या नहीं, यह देखने के लिए लोग पहले repo के दाईं ओर वाली जानकारी देखते हैं, इसलिए मुझे लगा कि demo site नहीं है haha
अच्छा project है, देखकर जा रहा हूँ!
अरे, यह मेरी नज़र से छूट गया था, मैं इसे अभी सेट करता हूँ। धन्यवाद 🤩
यह सचमुच मेहनत से बनाया गया प्रोजेक्ट लगता है!
मैं भी अपनी कंपनी में ऐसा ही कुछ बनाकर इस्तेमाल कर रहा हूँ, और मेरे मामले में इसे प्रिंट मीडिया में जाना होता है, इसलिए मैंने character set इस तरह सेट किया कि अस्पष्ट अक्षरों से बचा जा सके।
इससे जुड़ी सामग्री GeekNews पर भी थी।
https://hi.news.hada.io/topic?id=14479
अच्छा है!! जब id या लिंक जनरेट करते हैं, तब अगर उस बात को भी ध्यान में रखा जाए तो काफ़ी अच्छा लगता है।
वाह, धन्यवाद 👍
Rust इंस्टॉल करके और सिर्फ environment variables सेट करके इसे तुरंत इस्तेमाल किया जा सकता है!
Google URL सेवा इस साल बंद हो रही है, इसलिए इसे एक विकल्प के रूप में इस्तेमाल करें। यदि आपके कोई सवाल हों, सुधार की ज़रूरत वाले हिस्से हों, या इंस्टॉलेशन के तरीके आदि पर चर्चा करनी हो, तो सभी ईमेल का स्वागत है 👏
इसे https://f-it.kr/ पर आसानी से आज़मा सकते हैं 🙇♂️