इसके मूल में, DynamoDB एक NoSQL डेटाबेस है जो की-वैल्यू और डॉक्यूमेंट डेटा संरचनाएं प्रदान करता है। आइए इसे अनपैक करें। मुझे लगता है कि इसे पढ़ने वाले अधिकांश डेवलपर्स पारंपरिक रिलेशनल डेटाबेस सिस्टम से काफी परिचित हैं, जिनमें अच्छी तरह से परिभाषित स्कीमा और डेटा शामिल होते हैं जो टेबल्स, पंक्तियों और कॉलम में सामान्यीकृत होते हैं। इन टेबल्स के बीच, विदेशी कुंजियों का उपयोग करके "रिलेशनशिप्स" होती हैं। इसके विपरीत, DynamoDB स्कीमालेस है। जबकि हर टेबल में एक प्राइमरी कुंजी होनी चाहिए, अन्य गैर-कुंजी विशेषताओं पर कोई अन्य प्रतिबंध नहीं हैं। यह कब फायदेमंद होगा, आप पूछते हैं? आइए जानें कि Amazon ने DynamoDB क्यों बनाया।
Amazon ने 2012 में DynamoDB को सार्वजनिक उपयोग के लिए जारी करने की योजना की घोषणा की। Amazon ने मूल रूप से 2004 के छुट्टियों के मौसम के बाद Dynamo को आंतरिक रूप से विकसित किया था, जब उनके कई एप्लिकेशन उच्च मात्रा में ट्रैफिक के कारण विफल हो गए थे।
आपको DynamoDB का उपयोग कब करना चाहिए?
DynamoDB उन एप्लिकेशन के लिए एक ठोस विकल्प है जिन्हें बहुत बड़ी संख्या (हजारों में) समवर्ती उपयोगकर्ताओं का समर्थन करने की आवश्यकता होती है और इसलिए प्रति सेकंड दसियों हजार रीड्स/राइट्स की आवश्यकता होती है। उदाहरण के लिए, सोशल नेटवर्क, गेम्स, और IoT डिवाइस DynamoDB के लिए अच्छे उम्मीदवार हो सकते हैं; उदाहरण के लिए, Lyft, Airbnb, और Redfin Dynamo का उपयोग करते हैं। यहां तक कि अगर अपनाना शुरू में हल्का है, और प्रदर्शन की आवश्यकता तुरंत आवश्यक नहीं है, तो DynamoDB के साथ शुरू करना पारंपरिक SQL डेटाबेस, जैसे Postgres, की तुलना में फायदेमंद हो सकता है, यदि आप अंततः स्केल के लिए निर्माण करेंगे। हालांकि, यदि आप एक डेटा वेयरहाउस या OLAP एप्लिकेशन बना रहे हैं जिसे उपयोगकर्ता बार-बार क्वेरी करेंगे, तो एक स्कीमालेस डेटाबेस शायद सबसे अच्छा डिजाइन विकल्प नहीं है। इसके अलावा, जबकि RDBMS स्टोरेज के लिए अनुकूलित हैं, DynamoDB कंप्यूट के लिए अनुकूलित है। Amazon का दावा है कि DynamoDB किसी भी पैमाने पर सिंगल-डिजिट मिलीसेकंड प्रदर्शन प्रदान कर सकता है, साथ ही प्रति दिन 10 ट्रिलियन+ अनुरोधों को संभाल सकता है, जिसमें प्रति सेकंड 20 मिलियन+ अनुरोधों की चोटी होती है। वाह!
इसके अतिरिक्त, AWS अन्य सुविधाओं का एक सूट प्रदान करता है जो DynamoDB को डेटा प्रतिधारण और/या सुरक्षा की आवश्यकता वाले एप्लिकेशन के लिए एक शानदार फिट बना सकता है।
आराम पर एन्क्रिप्शन: DynamoDB आपके सभी डेटा को एक एन्क्रिप्टेड टेबल में सुरक्षित करता है, जिसमें प्राइमरी कुंजी भी शामिल है। उपयोगकर्ता तीन विकल्प चुन सकते हैं: एक AWS-स्वामित्व वाली कस्टमर मास्टर कुंजी (CMK), एक AWS-प्रबंधित CMK (यानी, कुंजी आपके खाते में संग्रहीत है और AWS Key Management Service द्वारा प्रबंधित), या एक कस्टमर-प्रबंधित CMK (यानी, कुंजी आपके खाते में संग्रहीत है और आपके द्वारा बनाई/स्वामित्व/प्रबंधित)। अच्छी बात यह है कि प्रत्येक टेबल एक अलग विकल्प का उपयोग कर सकती है। आराम पर एन्क्रिप्शन के बारे में अधिक पढ़ने के लिए, यहां आधिकारिक AWS डॉक्स हैं।
ऑन-डिमांड बैकअप/पॉइंट-इन-टाइम रिकवरी: DynamoDB आपको पिछले ~30 दिनों के दौरान किसी भी समय पर एक टेबल को पुनर्स्थापित करने की अनुमति देता है। आकस्मिक राइट्स या डिलीट्स के बारे में चिंता करने के दिन गए!
DynamoDB की मूल बातें
DynamoDB के तीन मुख्य घटक हैं: टेबल्स, आइटम्स, और एट्रिब्यूट्स। आइए इनमें से प्रत्येक को तोड़ दें।
- टेबल: आइटम्स का एक संग्रह
- आइटम: एट्रिब्यूट्स का एक संग्रह
- एट्रिब्यूट: एक मौलिक डेटा तत्व जिसे आगे विभाजित करने की आवश्यकता नहीं है।
उदाहरण के लिए, यदि मैं किराये की संपत्तियों को प्रबंधित करने के लिए एक एप्लिकेशन बना रहा हूं, तो मेरे पास "Houses" नामक एक टेबल हो सकती है जिसमें निम्न आइटम हों:
{
"HouseID": 1,
"AddressLine1": "123 Main St",
"City": "Atlanta",
"State": "GA",
"Zip": 30322,
"Rented": true,
"Tenant": "John Smith"
}
{
"HouseID": 2,
"AddressLine1": "456 Square St",
"City": "Nashville",
"State": "TN",
"Zip": 37211,
"Rented": true,
"Tenant": "Mary Jane"
}
HouseID, AddressLine1, City, State, Zip, Rented और Tenant सभी आइटम्स के एट्रिब्यूट्स हैं। आप एक आइटम की तुलना पारंपरिक SQL डेटाबेस में एक row से और एक एट्रिब्यूट की तुलना column से कर सकते हैं। हालांकि, मैं सुझाव देता हूं कि DynamoDB जैसे NoSQL डेटाबेस की तुलना पारंपरिक SQL डेटाबेस से करने से बचने की कोशिश करें, क्योंकि वे बहुत अलग जानवर हैं।
ध्यान दें कि प्रत्येक आइटम में एक अद्वितीय प्राइमरी कुंजी होती है (DynamoDB सिंगल पार्टीशन कुंजियों और कंपोजिट प्राइमरी कुंजियों दोनों का समर्थन करता है)। हालांकि, HouseID के अलावा, Houses टेबल स्कीमालेस है। इस प्रकार, एट्रिब्यूट्स और डेटा प्रकारों को समय से पहले परिभाषित करने की आवश्यकता नहीं है, एक पारंपरिक SQL डेटाबेस के विपरीत, जिसे Zip को स्कीमा में integer प्रकार निर्दिष्ट के साथ परिभाषित करने की आवश्यकता होगी।
आप सोच रहे होंगे कि DynamoDB के साथ इंडेक्स कैसे काम करते हैं। यदि हां, तो यह एक शानदार सवाल है! आइए दिखावा करें कि मैं अपने Houses टेबल के rented और zip एट्रिब्यूट्स पर एक इंडेक्स बनाना चाहता हूं (यानी, दिए गए ज़िप कोड के आधार पर, उस ज़िप कोड में सभी किराए की संपत्तियां प्राप्त करें)। यदि मैं SQL डेटाबेस का उपयोग कर रहा होता, तो मैं एक माइग्रेशन बना सकता था जो इस तरह दिखता:
CREATE INDEX RentedAndZipIndex ON Houses (rented, zip);
इसके विपरीत, यदि मैं DynamoDB का उपयोग कर रहा होता, तो मैं एक सेकेंडरी इंडेक्स सेटअप करना चाहूंगा। ऐसा करने के लिए, मुझे एक पार्टीशन कुंजी और एक सॉर्ट कुंजी निर्दिष्ट करनी होगी। इस उदाहरण में, zip पार्टीशन कुंजी है और rented सॉर्ट कुंजी है। DynamoDB के साथ इंडेक्स के बारे में जानने के लिए बहुत कुछ है, लेकिन इस लेख के लिए, हम इसे यहीं छोड़ देंगे। यदि आप अधिक सीखने में रुचि रखते हैं, तो आप यहां अधिक पढ़ सकते हैं।
Ruby और Ruby on Rails के साथ DynamoDB का उपयोग
AWS DynamoDB के लिए कई भाषाओं में SDKs प्रदान करता है (यानी, Java, JavaScript, Node.js, .NET, PHP, Python, और Ruby, वर्तमान में।) DynamoDB के साथ Ruby का उपयोग करने के लिए, आपके पास दो विकल्प हैं:
1) DynamoDB को स्थानीय रूप से डाउनलोड करें; यदि आप केवल एप्लिकेशन का टेस्ट करना चाहते हैं, तो यह एक बढ़िया विकल्प है! जब आप प्रोडक्शन पर जाने के लिए तैयार हों, तो आप स्थानीय एंडपॉइंट को हटा सकते हैं और वेब सर्विस की ओर इंगित कर सकते हैं। 2) DynamoDB वेब सर्विस का उपयोग करें, जिसके लिए AWS एक्सेस कुंजी और क्रेडेंशियल्स की आवश्यकता होगी।
DynamoDB के साथ इंटरैक्ट करने के लिए, आप संभवतः CLI डाउनलोड करना चाहेंगे। अन्यथा, आप कंसोल या सिर्फ API का उपयोग कर सकते हैं।
अंत में, इस श्रृंखला के उद्देश्य के लिए, आपको Ruby इंस्टॉल करने की आवश्यकता होगी, साथ ही Ruby के लिए AWS SDK।
Rails के लिए, एक निफ्टी जेम है जिसे आप अपने प्रोजेक्ट में जोड़ सकते हैं। इसे Dynamoid कहा जाता है। हालांकि, आपको अभी भी AWS क्रेडेंशियल्स की आवश्यकता होगी।
Rails उदाहरण
चरण 1: सेटअप
अपने Gemfile में, निम्नलिखित जेम्स जोड़ें और bundle install चलाएं:
gem 'dynamoid'
gem 'aws-sdk'
अगला, config/initializers डायरेक्टरी में aws.rb नामक एक नई फाइल बनाएं और निम्नलिखित जोड़ें:

नोट: आपको क्रेडेंशियल्स रखने के लिए पर्यावरण चर का उपयोग करना चाहिए। कभी भी इन्हें अपने प्रोजेक्ट में हार्ड-कोड न करें!
चरण 2: एक डॉक्यूमेंट को परिभाषित करना
इस उदाहरण के लिए, मैंने app/models डायरेक्टरी में house.rb फाइल बनाई जो इस तरह दिखती है:

आइए देखें कि हमारे पास यहां क्या है।
- जब आप अपने टेबल्स को परिभाषित करते हैं तो आपको हमेशा
include Dynamoid::Documentशामिल करना होगा। - लाइन 4 पर, मैं टेबल नाम, कुंजी, और क्षमता मोड को परिभाषित कर रहा हूं। Dynamoid जेम में समझदार डिफ़ॉल्ट हैं, इसलिए तकनीकी रूप से, आपको उपरोक्त में से किसी को भी शामिल करने की आवश्यकता नहीं है। हालांकि, उन्हें परिभाषित करने से डिफ़ॉल्ट ओवरराइड हो जाएंगे। आप
read_capacityऔरwrite_capacityभी परिभाषित कर सकते हैं। हालांकि, चूंकि मैंनेcapacity_modeकोon_demandके रूप में परिभाषित किया है, इसलिए इन विकल्पों को नजरअंदाज कर दिया जाएगा क्योंकिon_demandक्षमता मोड AWS को स्वचालित रूप से ऊपर या नीचे स्केल करने के लिए कह रहा है। - अगला, मैं अपनी टेबल के लिए फ़ील्ड्स को परिभाषित कर रहा हूं। आपको मॉडल पर सभी फ़ील्ड्स, साथ ही डेटा प्रकार को परिभाषित करना होगा, हालांकि यदि छोड़ दिया जाए तो इसे
stringमान लिया जाएगा।)
dynamoid जेम आपकी टेबल बनाने के लिए एक निफ्टी रेक टास्क के साथ आता है।
rake dynamoid:create_tables
चरण 3: ऑब्जेक्ट्स के साथ इंटरैक्ट करना
हालांकि इसमें से कुछ आपको विदेशी लग सकता है, मेरे पास अच्छी खबर है! dynamoid जेम का बढ़िया हिस्सा यह है कि बहुत सारी अन्य विशेषताएं जिनके आप Active Record के साथ आदी हैं, वे बहुत हद तक उसी तरह काम करती हैं।
एसोसिएशन्स
उदाहरण के लिए, Dynamoid कई एसोसिएशन्स का समर्थन करता है: has_many, has_one, has_and_belongs_to_many, and belongs_to सभी को वैसे ही परिभाषित किया जा सकता है जैसे आप सामान्य रूप से ActiveRecord के साथ करेंगे। आप मेरे किराये की संपत्तियों के ऐप में एक और डॉक्यूमेंट टेबल Lease होने की कल्पना कर सकते हैं, इसलिए House टेबल पर, मैं कुछ इस तरह परिभाषित कर सकता हूं:
has_one :lease
और Lease टेबल पर:
belongs_to :house
वैलिडेशन्स
Dynamoid ActiveModel वैलिडेशन्स में भी बेक करता है, इसलिए आप वहां पूरी तरह तैयार हैं! दस्तावेज़ यहां उपलब्ध है।
कॉलबैक्स
before_ या after_ कॉलबैक्स save, update, destroy एक्शन्स के लिए उपलब्ध हैं, इसलिए मैं अपने lease.rb में कुछ इस तरह परिभाषित कर सकता हूं:
before_save :validate_signature
निर्माण
फिर से, ऑब्जेक्ट्स बनाने के लिए उपयोग किया जाने वाला सिंटैक्स मूल रूप से वैसा ही दिखेगा जैसा आप ActiveRecord के साथ उपयोग करते हैं। मैं कुछ इस तरह कर सकता हूं:
h = House.new(address_line_1: "123 Main St", city: "Cool City", state: "Iowa", zip: 52302)
h.rented = true
h.save
या मैं बस .create विधि का उपयोग कर सकता हूं:
House.create(address_line_1: "123 Main St", city: "Cool City", state: "Iowa", zip: 52302)
क्वेरी करना
मुझे पता है कि मैं एक टूटे हुए रिकॉर्ड की तरह लग रहा हूं, लेकिन क्या आप अनुमान लगा सकते हैं कि क्वेरी कैसे काम करती है? आपने सही समझा, ActiveRecord की तरह ही।
.findएक ID लेगा.whereकिसी भी संख्या में मिलान मानदंड लेगा.find_by_xजहांxएक एट्रिब्यूट है।
और चाहिए?
Dynamoid जेम के बारे में जानने के लिए बहुत कुछ है, लेकिन उम्मीद है, यह आपको शुरू करने और खेलने के लिए पर्याप्त है। मैं आपको आधिकारिक GitHub पेज यहां देखे जाने के लिए प्रोत्साहित करता हूं ताकि आप अपने लिए उपलब्ध सुविधाओं के बारे में अधिक पढ़ सकें!
अगला
खैर, यहां पचाने के लिए बहुत कुछ है! उम्मीद है, आप इस बारे में थोड़ा अधिक जानकार महसूस करते हैं कि जब कोई 'NoSQL' कहता है तो इसका क्या मतलब होता है और क्यों DynamoDB स्कीमालेस डेटाबेस की आवश्यकता वाली परियोजनाओं के लिए एक अच्छा विकल्प हो सकता है। इसके अलावा, हमने dynamoid जेम का उपयोग करके अपने Rails प्रोजेक्ट के बुनियादी सेटअप के माध्यम से चले हैं।
इस श्रृंखला के अगले लेख में, हम DynamoDB को स्थानीय रूप से सेटअप करेंगे और Ruby SDK की कुछ विशेषताओं को आजमाएंगे।