Computer >> Máy Tính >  >> Lập trình >> Ruby

Sử dụng DynamoDB trong ứng dụng Rails của bạn

Về cốt lõi, DynamoDB là một cơ sở dữ liệu NoSQL cung cấp các cấu trúc dữ liệu tài liệu và khóa-giá trị. Hãy giải nén cái này. Tôi tưởng tượng rằng hầu hết các nhà phát triển đọc bài này đều khá quen thuộc với các hệ thống cơ sở dữ liệu quan hệ truyền thống, liên quan đến các lược đồ được xác định rõ và dữ liệu được chuẩn hóa thành các bảng, hàng và cột. Giữa các bảng này, có các "mối quan hệ" sử dụng khóa ngoại. Ngược lại, DynamoDB là vô hình. Trong khi mọi bảng phải có khóa chính, không có ràng buộc nào khác đối với các thuộc tính không phải khóa khác. Bạn hỏi khi nào thì điều này có lợi? Chà, hãy cùng tìm hiểu tại sao Amazon lại tạo ra DynamoDB.

Amazon đã công bố kế hoạch phát hành DynamoDB để sử dụng công khai vào năm 2012. Ban đầu Amazon đã phát triển Dynamo trong nội bộ sau kỳ nghỉ lễ năm 2004, khi một số ứng dụng của họ bị lỗi do lượng truy cập quá cao.

Khi nào bạn nên cân nhắc sử dụng DynamoDB?

DynamoDB là một lựa chọn tốt cho các ứng dụng cần hỗ trợ một số lượng rất lớn (trong hàng nghìn +) người dùng đồng thời và do đó, hàng chục nghìn lượt đọc / ghi mỗi giây. Ví dụ:mạng xã hội, trò chơi và thiết bị IoT có thể là những ứng cử viên sáng giá cho DynamoDB; ví dụ:Lyft, Airbnb và Redfin sử dụng Dynamo. Ngay cả khi việc áp dụng lúc đầu là nhẹ và nhu cầu về hiệu suất không cần thiết ngay lập tức, bắt đầu với DynamoDB có thể có lợi hơn so với cơ sở dữ liệu SQL truyền thống, chẳng hạn như Postgres, nếu cuối cùng bạn sẽ xây dựng theo quy mô. Tuy nhiên, nếu bạn đang xây dựng một kho dữ liệu hoặc ứng dụng OLAP mà người dùng sẽ thường xuyên truy vấn, thì cơ sở dữ liệu không toán học có lẽ không phải là lựa chọn thiết kế tốt nhất. Hơn nữa, trong khi RDMS được tối ưu hóa để lưu trữ, DynamoDB được tối ưu hóa cho tính toán. Amazon quảng cáo rằng DynamoDB có thể cung cấp hiệu suất mili giây một chữ số ở bất kỳ quy mô nào, cũng như xử lý 10 nghìn tỷ + yêu cầu mỗi ngày, với đỉnh điểm là 20 triệu + yêu cầu mỗi giây. Chà!

Ngoài ra, AWS cung cấp một bộ các tính năng khác có thể làm cho DynamoDB trở nên phù hợp tuyệt vời cho các ứng dụng yêu cầu lưu giữ dữ liệu và / hoặc bảo mật.

  • Mã hóa ở trạng thái nghỉ:DynamoDB bảo mật tất cả dữ liệu của bạn trong một bảng được mã hóa, bao gồm cả khóa chính. Người dùng có thể chọn ba tùy chọn:khóa chính của khách hàng do AWS sở hữu (CMK), CMK do AWS quản lý (tức là khóa được lưu trữ trong tài khoản của bạn và được quản lý bởi Dịch vụ quản lý khóa AWS) hoặc CMK do khách hàng quản lý (tức là , khóa được lưu trữ trong tài khoản của bạn và do bạn tạo / sở hữu / quản lý.) Điều thú vị là mỗi bảng có thể sử dụng một tùy chọn khác nhau. Để đọc thêm về mã hóa ở phần còn lại, đây là tài liệu AWS chính thức.

  • Sao lưu theo yêu cầu / phục hồi theo thời gian:DynamoDB cho phép bạn khôi phục bảng về bất kỳ thời điểm nào trong ~ 30 ngày qua. Đã quá lâu rồi những ngày lo lắng về việc vô tình viết hoặc xóa!

Khái niệm cơ bản về DynamoDB

DynamoDB có ba thành phần cốt lõi:bảng, mục và thuộc tính. Hãy chia nhỏ từng điều này.

  • Bảng:một bộ sưu tập các mục
  • Mục:một tập hợp các thuộc tính
  • Thuộc tính:một phần tử dữ liệu cơ bản không cần phải chia nhỏ thêm nữa.

Ví dụ:nếu tôi đang tạo ứng dụng để quản lý tài sản cho thuê, tôi có thể có một bảng có tên "Nhà" với các mục sau:

{
  "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 và Tenant là tất cả các thuộc tính của các mục. Bạn có thể ví một mục với một row và một thuộc tính cho một cột column trong cơ sở dữ liệu SQL truyền thống. Tuy nhiên, tôi khuyên bạn nên tránh so sánh cơ sở dữ liệu NoSQL, chẳng hạn như DynamoDB, với cơ sở dữ liệu SQL truyền thống, vì chúng rất khác nhau.

Lưu ý rằng mỗi item có một khóa chính duy nhất (DynamoDB hỗ trợ cả khóa phân vùng đơn và khóa chính tổng hợp). Tuy nhiên, khác với HouseID , Houses bảng là không có schemaless. Do đó, các thuộc tính và kiểu dữ liệu không cần được xác định trước, không giống như cơ sở dữ liệu SQL truyền thống, sẽ yêu cầu Zip được xác định trong lược đồ với integer loại được chỉ định.

Bạn có thể tự hỏi cách các chỉ mục hoạt động với DynamoDB. Nếu vậy, đây là một câu hỏi tuyệt vời! Giả sử tôi muốn tạo chỉ mục trên rentedzip thuộc tính của Houses của tôi bảng (tức là, được cung cấp mã zip, nhận tất cả tài sản đã thuê trong mã zip đó). Nếu tôi đang sử dụng cơ sở dữ liệu SQL, tôi có thể tạo một quá trình di chuyển trông giống như sau:

CREATE INDEX RentedAndZipIndex
ON Houses (rented, zip);

Ngược lại, nếu tôi đang sử dụng DynamoDB, tôi sẽ muốn thiết lập một chỉ mục phụ. Để làm điều này, tôi phải chỉ định một khóa phân vùng và một khóa sắp xếp. Trong ví dụ này, zip là khóa phân vùng và thuê là khóa sắp xếp. Có rất nhiều điều để tìm hiểu về các chỉ mục với DynamoDB, nhưng vì lợi ích của bài viết này, chúng tôi sẽ để nó ở đây. Nếu bạn muốn tìm hiểu thêm, bạn có thể đọc thêm tại đây.

Sử dụng DynamoDB với Ruby và Ruby on Rails

AWS cung cấp SDK bằng một số ngôn ngữ cho DynamoDB (tức là Java, JavaScript, Node.js, .NET, PHP, Python và Ruby, hiện tại.) Để sử dụng DynamoDB với Ruby, bạn có hai tùy chọn:

1) Tải xuống DynamoDB cục bộ; nếu bạn chỉ muốn thử nghiệm các ứng dụng, đây là một lựa chọn tuyệt vời! Khi bạn đã sẵn sàng chuyển sang sản xuất, bạn có thể xóa điểm cuối cục bộ và trỏ đến dịch vụ web. 2) Sử dụng dịch vụ web DynamoDB, dịch vụ này sẽ yêu cầu khóa truy cập AWS và tín dụng.

Để tương tác với DynamoDB, bạn có thể sẽ muốn tải xuống CLI. Nếu không, bạn có thể sử dụng bảng điều khiển hoặc chỉ API.

Cuối cùng, với mục đích của loạt bài này, bạn cần phải cài đặt Ruby, cũng như AWS SDK cho Ruby.

Đối với Rails, có một viên ngọc tiện lợi mà bạn có thể thêm vào dự án của mình. Nó được gọi là Dynamoid. Tuy nhiên, bạn vẫn cần thông tin đăng nhập AWS.

Ví dụ về đường ray

Bước 1:Thiết lập

Trong Gemfile của bạn , thêm các đá quý sau và chạy bundle install :

gem 'dynamoid'
gem 'aws-sdk'

Tiếp theo, tạo một tệp mới aws.rb trong config/initializers và thêm phần sau:

Sử dụng DynamoDB trong ứng dụng Rails của bạn

Lưu ý:Bạn nên sử dụng các biến môi trường để giữ thông tin xác thực. Đừng bao giờ viết khó những thứ này vào dự án của bạn!

Bước 2:Xác định tài liệu

Đối với ví dụ này, tôi đã tạo một house.rb tệp trong app/models thư mục trông giống như sau:

Sử dụng DynamoDB trong ứng dụng Rails của bạn

Hãy xem qua những gì chúng ta có ở đây.

  • Bạn phải luôn bao gồm include Dynamoid::Document khi xác định bảng của bạn.
  • Ở dòng 4, tôi đang xác định tên bảng, khóa và chế độ dung lượng. Đá quý Dynamoid có các giá trị mặc định hợp lý, vì vậy về mặt kỹ thuật, bạn không cần phải bao gồm bất kỳ điều nào ở trên. Tuy nhiên, việc xác định chúng sẽ ghi đè các giá trị mặc định. Bạn cũng có thể xác định read_capacitywrite_capacity . Tuy nhiên, vì tôi đã xác định capacity_mode dưới dạng on_demand , các tùy chọn này sẽ bị bỏ qua vì on_demand chế độ dung lượng đang yêu cầu AWS tự động tăng hoặc giảm quy mô.
  • Tiếp theo, tôi đang xác định các trường cho bảng của mình. Bạn phải xác định tất cả các trường trên mô hình, cũng như kiểu dữ liệu, mặc dù nó sẽ được giả định là string nếu bị bỏ qua.)

dynamoid gem đi kèm với một nhiệm vụ cào tiện lợi để tạo bảng của bạn.

rake dynamoid:create_tables

Bước 3:Tương tác với các đối tượng

Mặc dù một số điều này có thể trông xa lạ với bạn, nhưng tôi có tin tốt! Phần tuyệt vời về dynamoid gem là rất nhiều tính năng khác mà bạn đã quen với Active Record hoạt động theo cùng một cách.

Ví dụ:Dynamoid hỗ trợ một số liên kết:has_many, has_one, has_and_belongs_to_many, and belongs_to tất cả đều có thể được định nghĩa giống như bạn thường làm với ActiveRecord. Bạn có thể tưởng tượng ứng dụng tài sản cho thuê của tôi có một bảng tài liệu khác được gọi là Lease , trên House bảng, tôi có thể định nghĩa một cái gì đó như thế này:

has_one :lease

và trên Lease bảng:

belongs_to :house

Xác thực

Dynamoid cũng tham gia vào quá trình xác thực ActiveModel, vì vậy bạn đã sẵn sàng! Tài liệu có sẵn tại đây.

Gọi lại

before_ hoặc after_ gọi lại có sẵn để save, update, destroy các hành động, vì vậy tôi có thể xác định một cái gì đó như thế này trong lease.rb của mình :

before_save :validate_signature

Tạo

Một lần nữa, cú pháp được sử dụng để tạo các đối tượng về cơ bản sẽ giống với những gì bạn đã sử dụng với ActiveRecord. Tôi có thể làm điều gì đó như sau:

h = House.new(address_line_1: "123 Main St", city: "Cool City", state: "Iowa", zip: 52302)
h.rented = true
h.save

Hoặc tôi có thể chỉ cần sử dụng .create phương pháp:

House.create(address_line_1: "123 Main St", city: "Cool City", state: "Iowa", zip: 52302)

Truy vấn

Tôi biết rằng tôi đang nghe như một kỷ lục bị phá vỡ, nhưng bạn có thể đoán cách truy vấn hoạt động không? Bạn đã hiểu, giống như ActiveRecord.

  • .find sẽ lấy một ID
  • .where sẽ lấy bất kỳ số lượng tiêu chí phù hợp nào
  • .find_by_x ở đâu x là một thuộc tính.

Muốn thêm?

Có một để tìm hiểu thêm về viên ngọc Dynamoid, nhưng hy vọng, điều này là đủ để bạn bắt đầu chơi. Tôi khuyến khích bạn xem trang GitHub chính thức tại đây để đọc thêm về các tính năng có sẵn cho bạn!

Tiếp theo

Chà, có RẤT NHIỀU để tiêu hóa ở đây! Hy vọng rằng bạn cảm thấy hiểu biết hơn một chút về ý nghĩa của nó khi ai đó nói 'NoSQL' và tại sao DynamoDB có thể là một lựa chọn tốt cho các dự án cần cơ sở dữ liệu không toán học. Ngoài ra, chúng tôi đã đi qua thiết lập cơ bản của việc sử dụng dynamoid đá quý với dự án Rails của bạn.

Trong phần tiếp theo của loạt bài này, chúng ta sẽ thiết lập DynamoDB cục bộ và thử một số tính năng của Ruby SDK.