𝗨𝗻𝗱𝗲𝗿𝘀𝘁𝗮𝗻𝗱𝗶𝗻𝗴 𝗥𝗘𝗦𝗣: 𝗧𝗵𝗲 𝗣𝗿𝗼𝘁𝗼𝗰𝗼𝗹 𝗕𝗲𝗵𝗶𝗻𝗱 𝗥𝗲𝗱𝗶𝘀
माझ्या मागील पोस्टमध्ये, मी Node.js वापरून तयार केलेल्या माझ्या Redis क्लोनचा आढावा दिला होता. आता, मला या प्रकल्पाचा एक महत्त्वाचा भाग स्पष्ट करायचा आहे: RESP, किंवा Redis Serialization Protocol.
Redis ला सुव्यवस्थित JavaScript arrays मिळत नाहीत. त्याला TCP socket द्वारे raw bytes मिळतात. काम करण्यासाठी, या bytes ला एका संरचनेची (structure) गरज असते. कमांड कुठे सुरू होते आणि कुठे संपते हे सर्व्हरला माहित असणे आवश्यक आहे. किती arguments आहेत आणि प्रत्येक argument किती लांब आहे, हे देखील त्याला माहित असणे आवश्यक आहे.
RESP ही संरचना प्रदान करते. क्लायंट आणि सर्व्हर एकमेकांशी संवाद साधण्यासाठी याच भाषेचा वापर करतात.
उदाहरणार्थ, RESP मध्ये GET name ही कमांड अशी दिसते:
*2\r\n$3\r\nGET\r\n$4\r\nname\r\n
याचे विश्लेषण खालीलप्रमाणे आहे:
*2म्हणजे 2 elements असलेला array.$3म्हणजे पुढचा भाग 3 bytes लांबीचा आहे:GET.$4म्हणजे पुढचा भाग 4 bytes लांबीचा आहे:name.
parser या bytes चे ["GET", "name"] मध्ये रूपांतर करतो. आता engine ही कमांड रन करू शकते.
फक्त spaces द्वारे strings का विभाजित (split) करायचे नाहीत?
साध्या splitting मुळे अशा values मध्ये अडचण येते ज्यामध्ये spaces आहेत, जसे की SET message "hello world". तसेच, हे binary data साठी देखील अपयशी ठरते. RESP प्रत्येक value ची लांबी (length) समाविष्ट करून ही समस्या सोडवते. सर्व्हर नेमके नमूद केलेले bytes वाचतो. यामुळे ते binary-safe आणि विश्वसनीय बनते.
सर्वात कठीण धडा म्हणजे TCP हे stream-based आहे, message-based नाही हे शिकणे. सर्व्हरला नेहमी एका वेळी एक पूर्ण कमांड मिळत नाही. एक कमांड दोन वेगवेगळ्या chunks मध्ये येऊ शकते. किंवा, एकाच chunk मध्ये अनेक कमांड्स येऊ शकतात.
याचा अर्थ असा की parser एक data event म्हणजे एक कमांड असे गृहीत धरू शकत नाही. parser ला अंतर्गत buffer वापरावा लागतो.
माझा RESP parser अशा प्रकारे काम करतो:
- socket कडून bytes प्राप्त करणे.
- bytes buffer मध्ये जोडणे.
- पूर्ण कमांड parse करण्याचा प्रयत्न करणे.
- जर कमांड अपूर्ण असेल, तर अधिक डेटाची प्रतीक्षा करणे.
- जर कमांड पूर्ण असेल, तर ती return करणे.
- जर अतिरिक्त डेटा शिल्लक असेल, तर पुढील parse साठी तो buffer मध्ये ठेवणे.
डेटाबेसची सुरुवात protocol layer पासून होते. Redis डेटा स्टोअर करण्यापूर्वी, त्याला कमांड समजणे आवश्यक आहे. व्हॅल्यू return करण्यापूर्वी, त्याला response encode करणे आवश्यक आहे.
RESP लागू केल्यामुळे एक साधा TCP server खऱ्या अर्थाने Redis-compatible सिस्टममध्ये बदलला. यामुळे बॅकएंड सिस्टम्सकडे बघण्याचा माझा दृष्टिकोन बदलला. प्रोटोकॉल म्हणजे केवळ एक format नाही. तो दोन सिस्टम्समधील एक करार (contract) आहे.
माझ्या पुढच्या पोस्टमध्ये, मी in-memory storage layer कव्हर करेन.
रेपो: https://github.com/Abhinov007/redis_clone लाईव्ह सँडबॉक्स: https://abhinov007.github.io/Redis_Clone/ स्रोत: https://dev.to/abhinov007/understanding-resp-the-protocol-behind-redis-50p4