Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

การใช้ DynamoDB ในแอป Rails ของคุณ

หัวใจหลักของ DynamoDB คือฐานข้อมูล NoSQL ที่นำเสนอโครงสร้างข้อมูลของคีย์-ค่าและเอกสาร มาแกะสิ่งนี้กันเถอะ ฉันคิดว่านักพัฒนาส่วนใหญ่ที่อ่านข้อความนี้ค่อนข้างคุ้นเคยกับระบบฐานข้อมูลเชิงสัมพันธ์แบบดั้งเดิม ซึ่งเกี่ยวข้องกับสคีมาและข้อมูลที่กำหนดไว้อย่างดีซึ่งถูกทำให้เป็นมาตรฐานในตาราง แถว และคอลัมน์ ระหว่างตารางเหล่านี้ มี "ความสัมพันธ์" โดยใช้คีย์ต่างประเทศ ในทางตรงกันข้าม DynamoDB ไม่มีสคีมา แม้ว่าทุกตารางจะต้องมีคีย์หลัก แต่ไม่มีข้อจำกัดอื่นๆ ในแอตทริบิวต์ที่ไม่ใช่คีย์อื่นๆ เมื่อไหร่จะเป็นประโยชน์คุณถาม? มาเรียนรู้กันว่าเหตุใด Amazon จึงสร้าง DynamoDB

Amazon ประกาศแผนการที่จะเผยแพร่ DynamoDB สำหรับการใช้งานสาธารณะในปี 2555 เดิมที Amazon ได้พัฒนา Dynamo ภายในตัวหลังจากช่วงเทศกาลวันหยุดปี 2547 เมื่อแอปพลิเคชันหลายตัวล้มเหลวเนื่องจากมีปริมาณการใช้งานสูง

เมื่อใดที่คุณควรพิจารณาใช้ DynamoDB

DynamoDB เป็นตัวเลือกที่แข็งแกร่งสำหรับแอปพลิเคชันที่ต้องรองรับผู้ใช้พร้อมกันจำนวนมาก (ในหลักพัน+) ดังนั้น การอ่าน/เขียนหลายหมื่นครั้งต่อวินาที ตัวอย่างเช่น โซเชียลเน็ตเวิร์ก เกม และอุปกรณ์ IoT อาจเป็นตัวเลือกที่ดีสำหรับ DynamoDB ตัวอย่างเช่น Lyft, Airbnb และ Redfin ใช้ไดนาโม แม้ว่าการเริ่มต้นใช้งานจะเบาในตอนแรก และไม่จำเป็นต้องมีประสิทธิภาพในทันที การเริ่มต้นด้วย DynamoDB อาจเป็นประโยชน์เมื่อเทียบกับฐานข้อมูล SQL แบบเดิม เช่น Postgres หากคุณจะสร้างสำหรับขนาดในที่สุด อย่างไรก็ตาม หากคุณกำลังสร้างคลังข้อมูลหรือแอปพลิเคชัน OLAP ที่ผู้ใช้มักทำการสืบค้น ฐานข้อมูลแบบไม่มีสคีมาอาจไม่ใช่ตัวเลือกการออกแบบที่ดีที่สุด นอกจากนี้ ในขณะที่ RDMS ได้รับการปรับให้เหมาะสมสำหรับการจัดเก็บข้อมูล DynamoDB ได้รับการปรับให้เหมาะสมสำหรับการประมวลผล Amazon อ้างว่า DynamoDB สามารถส่งมอบประสิทธิภาพระดับมิลลิวินาทีหลักเดียวในทุกระดับ รวมทั้งจัดการคำขอ 10 ล้านล้าน+ คำขอต่อวัน ด้วยยอดคำขอ 20 ล้าน+ ต่อวินาที ว้าว!

นอกจากนี้ AWS ยังมีชุดคุณสมบัติอื่นๆ ที่ทำให้ DynamoDB เหมาะสมอย่างยิ่งกับแอปพลิเคชันที่ต้องการการเก็บรักษาข้อมูลและ/หรือความปลอดภัย

  • การเข้ารหัสเมื่อไม่ได้ใช้งาน:DynamoDB รักษาความปลอดภัยข้อมูลทั้งหมดของคุณในตารางที่เข้ารหัส รวมถึงคีย์หลัก ผู้ใช้สามารถเลือกได้สามตัวเลือก:คีย์หลักลูกค้าที่ AWS เป็นเจ้าของ (CMK), CMK ที่จัดการโดย AWS (เช่น คีย์จะถูกจัดเก็บไว้ในบัญชีของคุณและจัดการโดย AWS Key Management Service) หรือ CMK ที่จัดการโดยลูกค้า (เช่น คีย์จะถูกเก็บไว้ในบัญชีของคุณและคุณสร้าง/เป็นเจ้าของ/จัดการ) สิ่งที่ยอดเยี่ยมคือแต่ละตารางสามารถใช้ตัวเลือกที่แตกต่างกันได้ หากต้องการอ่านเพิ่มเติมเกี่ยวกับการเข้ารหัสเมื่อไม่ได้ใช้งาน โปรดดูเอกสาร AWS อย่างเป็นทางการ

  • การสำรองข้อมูลแบบออนดีมานด์/การกู้คืนแบบ point-in-time:DynamoDB ช่วยให้คุณสามารถกู้คืนตารางไปยังจุดใดก็ได้ในช่วง ~30 วันที่ผ่านมา วันที่ต้องกังวลเกี่ยวกับการเขียนหรือลบโดยไม่ตั้งใจนั้นช่างยาวนานนัก!

พื้นฐานของ DynamoDB

DynamoDB มีส่วนประกอบหลักสามส่วน ได้แก่ ตาราง รายการ และแอตทริบิวต์ มาทำลายสิ่งเหล่านี้กันเถอะ

  • ตาราง:ชุดของรายการ
  • ไอเทม:คอลเลกชั่นของคุณสมบัติ
  • แอตทริบิวต์:องค์ประกอบข้อมูลพื้นฐานที่ไม่จำเป็นต้องแยกย่อยอีกต่อไป

ตัวอย่างเช่น หากฉันกำลังสมัครเพื่อจัดการอสังหาริมทรัพย์ให้เช่า ฉันอาจมีตารางที่เรียกว่า "บ้าน" โดยมีรายการต่อไปนี้:

{
  "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 เป็นแอตทริบิวต์ทั้งหมดของรายการ คุณสามารถเปรียบรายการกับ row และแอตทริบิวต์ของ column ในฐานข้อมูล SQL แบบดั้งเดิม อย่างไรก็ตาม ฉันขอแนะนำให้พยายามหลีกเลี่ยงการเปรียบเทียบฐานข้อมูล NoSQL เช่น DynamoDB กับฐานข้อมูล SQL แบบเดิม เนื่องจากเป็นฐานข้อมูลที่แตกต่างกันมาก

สังเกตว่าแต่ละ item มีคีย์หลักที่ไม่ซ้ำกัน (DynamoDB รองรับทั้งคีย์พาร์ติชั่นเดี่ยวและคีย์หลักแบบรวม) อย่างไรก็ตาม นอกเหนือจาก HouseID , Houses ตารางไม่มีแผนผัง ดังนั้นจึงไม่จำเป็นต้องกำหนดแอตทริบิวต์และประเภทข้อมูลล่วงหน้า ซึ่งแตกต่างจากฐานข้อมูล SQL แบบเดิมซึ่งต้องใช้ Zip กำหนดในสคีมาด้วย integer ระบุประเภท

คุณอาจสงสัยว่าดัชนีทำงานกับ DynamoDB อย่างไร ถ้าใช่ นี่เป็นคำถามที่ดี! สมมุติว่าฉันต้องการสร้างดัชนีบน rented และ zip คุณสมบัติของ Houses . ของฉัน ตาราง (เช่น รับรหัสไปรษณีย์ รับทรัพย์สินที่เช่าทั้งหมดในรหัสไปรษณีย์นั้น) หากฉันใช้ฐานข้อมูล SQL ฉันอาจสร้างการย้ายข้อมูลที่มีลักษณะดังนี้:

CREATE INDEX RentedAndZipIndex
ON Houses (rented, zip);

ในทางตรงกันข้าม หากฉันใช้ DynamoDB ฉันต้องการตั้งค่าดัชนีรอง ในการดำเนินการนี้ ฉันต้องระบุคีย์พาร์ติชันและคีย์การจัดเรียง ในตัวอย่างนี้ zip เป็นคีย์ของพาร์ติชั่น และเช่าเป็นคีย์ sort มีอะไรอีกมากมายให้เรียนรู้เกี่ยวกับดัชนีด้วย DynamoDB แต่สำหรับบทความนี้ เราจะฝากไว้ที่นี่ หากคุณสนใจที่จะเรียนรู้เพิ่มเติม คุณสามารถอ่านเพิ่มเติมได้ที่นี่

การใช้ DynamoDB กับ Ruby และ Ruby on Rails

AWS นำเสนอ SDK ในหลายภาษาสำหรับ DynamoDB (เช่น Java, JavaScript, Node.js, .NET, PHP, Python และ Ruby ในปัจจุบัน) ในการใช้ DynamoDB กับ Ruby คุณมีสองตัวเลือก:

1) ดาวน์โหลด DynamoDB ในเครื่อง; ถ้าคุณแค่ต้องการทดสอบแอปพลิเคชัน นี่เป็นตัวเลือกที่ยอดเยี่ยม! เมื่อคุณพร้อมที่จะไปยังเวอร์ชันที่ใช้งานจริง คุณสามารถลบปลายทางในเครื่องและชี้ไปที่บริการเว็บได้2) ใช้บริการเว็บ DynamoDB ซึ่งจะต้องใช้คีย์การเข้าถึง AWS และ creds

ในการโต้ตอบกับ DynamoDB คุณอาจต้องการดาวน์โหลด CLI มิฉะนั้น คุณสามารถใช้คอนโซลหรือเพียงแค่ API ได้

สุดท้าย สำหรับจุดประสงค์ของซีรีส์นี้ คุณจะต้องติดตั้ง Ruby และ AWS SDK for Ruby

สำหรับ Rails มีอัญมณีล้ำค่าที่คุณสามารถเพิ่มลงในโครงการของคุณได้ เรียกว่าไดนามอยด์ อย่างไรก็ตาม คุณยังคงต้องใช้ข้อมูลประจำตัว AWS

ตัวอย่างราง

ขั้นตอนที่ 1:ตั้งค่า

ใน Gemfile . ของคุณ เพิ่มอัญมณีต่อไปนี้และเรียกใช้ bundle install :

gem 'dynamoid'
gem 'aws-sdk'

จากนั้น สร้างไฟล์ใหม่ aws.rb ใน config/initializers ไดเร็กทอรีและเพิ่มสิ่งต่อไปนี้:

การใช้ DynamoDB ในแอป Rails ของคุณ

หมายเหตุ:คุณควรใช้ตัวแปรสภาพแวดล้อมเพื่อเก็บข้อมูลรับรอง อย่าฮาร์ดโค้ดสิ่งเหล่านี้ลงในโครงการของคุณ!

ขั้นตอนที่ 2:การกำหนดเอกสาร

สำหรับตัวอย่างนี้ ฉันได้สร้าง house.rb ไฟล์ใน app/models ไดเร็กทอรีที่มีลักษณะดังนี้:

การใช้ DynamoDB ในแอป Rails ของคุณ

มาดูกันดีกว่าว่าเรามีอะไรบ้าง

  • คุณ ต้อง รวม include Dynamoid::Document . เสมอ เมื่อกำหนดตารางของคุณ
  • ในบรรทัดที่ 4 ฉันกำลังกำหนดชื่อตาราง คีย์ และโหมดความจุ Dynamoid gem มีค่าเริ่มต้นที่สมเหตุสมผล ดังนั้นในทางเทคนิคแล้ว คุณไม่จำเป็นต้องรวมสิ่งใดๆ ข้างต้น อย่างไรก็ตาม การกำหนดสิ่งเหล่านี้จะแทนที่ค่าเริ่มต้น คุณยังสามารถกำหนด 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 จะเอาไอดี
  • .where จะใช้เกณฑ์การจับคู่จำนวนเท่าใดก็ได้
  • .find_by_x โดยที่ x เป็นคุณลักษณะ

ต้องการมากกว่านี้ไหม

มี ล็อต เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับ Dynamoid gem แต่หวังว่านี่จะเพียงพอสำหรับให้คุณเริ่มเล่น ฉันแนะนำให้คุณตรวจสอบหน้า GitHub อย่างเป็นทางการที่นี่ เพื่ออ่านเพิ่มเติมเกี่ยวกับคุณสมบัติที่มีให้คุณ!

ตอนต่อไป

มีอะไรมากมายให้ย่อยที่นี่! หวังว่าคุณจะรู้สึกมีความรู้มากขึ้นเกี่ยวกับความหมายเมื่อมีคนพูดว่า 'NoSQL' และเหตุใด DynamoDB อาจเป็นตัวเลือกที่ดีสำหรับโครงการที่ต้องใช้ฐานข้อมูลแบบไม่มีสคีมา นอกจากนี้ เราได้ดำเนินการตั้งค่าพื้นฐานของการใช้ dynamoid อัญมณีกับโครงการ Rails ของคุณ

ในบทความถัดไปของซีรีส์นี้ เราจะทำการตั้งค่า DynamoDB ภายในเครื่องและลองใช้คุณลักษณะบางอย่างของ Ruby SDK