Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

Rails 앱에서 DynamoDB 사용

핵심적으로 DynamoDB는 키-값 및 문서 데이터 구조를 제공하는 NoSQL 데이터베이스입니다. 이것을 풀어보자. 이 글을 읽는 대부분의 개발자는 잘 정의된 스키마와 테이블, 행 및 열로 정규화된 데이터를 포함하는 기존의 관계형 데이터베이스 시스템에 매우 익숙하다고 생각합니다. 이 테이블 사이에는 외래 키를 사용하는 "관계"가 있습니다. 대조적으로 DynamoDB는 스키마가 없습니다. 모든 테이블에는 기본 키가 있어야 하지만 키가 아닌 다른 속성에는 다른 제약 조건이 없습니다. 이것이 언제 유익할까요? Amazon이 DynamoDB를 만든 이유를 알아보겠습니다.

Amazon은 2012년에 DynamoDB를 공개할 계획을 발표했습니다. Amazon은 원래 2004년 휴가철 이후에 내부적으로 Dynamo를 개발했습니다. 당시 많은 양의 트래픽으로 인해 여러 애플리케이션에 장애가 발생했습니다.

DynamoDB 활용을 언제 고려해야 합니까?

DynamoDB는 매우 많은 수(수천 명 이상)의 동시 사용자를 지원해야 하고 따라서 초당 수만 건의 읽기/쓰기를 지원해야 하는 애플리케이션을 위한 확실한 옵션입니다. 예를 들어 소셜 네트워크, 게임 및 IoT 장치는 DynamoDB의 좋은 후보일 수 있습니다. 예를 들어 Lyft, Airbnb 및 Redfin은 Dynamo를 사용합니다. 처음에는 채택이 가볍고 성능에 대한 필요성이 즉시 필요하지 않더라도 결국 확장을 위해 구축하려는 경우 Postgres와 같은 기존 SQL 데이터베이스보다 DynamoDB로 시작하는 것이 유리할 수 있습니다. 그러나 사용자가 자주 쿼리하는 데이터 웨어하우스 또는 OLAP 응용 프로그램을 구축하는 경우 스키마 없는 데이터베이스가 최상의 디자인 선택이 아닐 수 있습니다. 또한 RDMS는 스토리지에 최적화되어 있는 반면 DynamoDB는 컴퓨팅에 최적화되어 있습니다. Amazon은 DynamoDB가 모든 규모에서 한 자릿수 밀리초 성능을 제공할 수 있을 뿐만 아니라 초당 최대 2천만 개 이상의 요청으로 하루 10조 개 이상의 요청을 처리할 수 있다고 선전합니다. 와!

또한 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는 모두 항목의 속성입니다. 항목을 row에 비유할 수 있습니다. 및 column에 대한 속성 기존 SQL 데이터베이스에서 그러나 DynamoDB와 같은 NoSQL 데이터베이스를 기존 SQL 데이터베이스와 비교하는 것은 매우 다르기 때문에 피하는 것이 좋습니다.

item 고유한 기본 키가 있습니다(DynamoDB는 단일 파티션 키와 복합 기본 키를 모두 지원함). 그러나 HouseID 이외의 , Houses 테이블은 스키마가 없습니다. 따라서 Zip가 필요한 기존 SQL 데이터베이스와 달리 속성 및 데이터 유형을 미리 정의할 필요가 없습니다. integer로 스키마에 정의 유형이 지정되었습니다.

인덱스가 DynamoDB에서 어떻게 작동하는지 궁금할 것입니다. 그렇다면 이것은 훌륭한 질문입니다! rented에 색인을 생성한다고 가정해 보겠습니다. 및 zipHouses의 속성 테이블(즉, 우편번호가 주어지면 해당 우편번호의 모든 임대 부동산을 가져옴). SQL 데이터베이스를 사용하는 경우 다음과 같은 마이그레이션을 생성할 수 있습니다.

CREATE INDEX RentedAndZipIndex
ON Houses (rented, zip);

반대로 DynamoDB를 사용하는 경우 보조 인덱스를 설정하고 싶습니다. 이렇게 하려면 파티션 키와 정렬 키를 지정해야 합니다. 이 예에서 zip은 파티션 키이고 임대는 정렬 키입니다. DynamoDB의 인덱스에 대해 배울 것이 훨씬 더 많지만 이 기사를 위해 여기에서 생략하겠습니다. 더 자세히 알아보고 싶다면 여기에서 더 많은 것을 읽을 수 있습니다.

Ruby 및 Ruby on Rails와 함께 DynamoDB 활용

AWS는 DynamoDB용 여러 언어(현재 Java, JavaScript, Node.js, .NET, PHP, Python, Ruby)로 SDK를 제공합니다. DynamoDB를 Ruby와 함께 사용하려면 다음 두 가지 옵션이 있습니다.

1) DynamoDB를 로컬로 다운로드합니다. 응용 프로그램을 테스트하려는 경우 훌륭한 옵션입니다! 프로덕션으로 이동할 준비가 되면 로컬 엔드포인트를 제거하고 웹 서비스를 가리킬 수 있습니다.2) AWS 액세스 키와 자격 증명이 필요한 DynamoDB 웹 서비스를 활용합니다.

DynamoDB와 상호 작용하려면 CLI를 다운로드하는 것이 좋습니다. 그렇지 않으면 콘솔이나 API만 활용할 수 있습니다.

마지막으로, 이 시리즈의 목적을 위해 Ruby와 Ruby용 AWS SDK가 설치되어 있어야 합니다.

Rails의 경우 프로젝트에 추가할 수 있는 멋진 보석이 있습니다. 다이너모이드라고 합니다. 그러나 여전히 AWS 자격 증명이 필요합니다.

레일 예

1단계:설정

Gemfile에서 , 다음 gem을 추가하고 bundle install 실행 :

gem 'dynamoid'
gem 'aws-sdk'

다음으로 새 파일 aws.rb를 생성합니다. config/initializers에서 디렉토리에 다음을 추가하십시오.

Rails 앱에서 DynamoDB 사용

참고:자격 증명을 보관하려면 환경 변수를 사용해야 합니다. 절대 프로젝트에 하드코딩하지 마세요!

2단계:문서 정의

이 예에서는 house.rb를 만들었습니다. app/models의 파일 다음과 같은 디렉토리:

Rails 앱에서 DynamoDB 사용

여기에 있는 내용을 살펴보겠습니다.

  • 당신은 반드시 항상 include Dynamoid::Document 포함 테이블을 정의할 때.
  • 4행에서는 테이블 이름, 키 및 용량 모드를 정의하고 있습니다. Dynamoid gem에는 합리적인 기본값이 있으므로 기술적으로 위의 항목을 포함할 필요가 없습니다. 그러나 이를 정의하면 기본값이 무시됩니다. read_capacity를 정의할 수도 있습니다. 및 write_capacity . 그러나 capacity_mode를 정의했기 때문에 on_demand로 , 이러한 옵션은 on_demand 이후 무시됩니다. 용량 모드는 AWS에 자동으로 확장 또는 축소하도록 지시합니다.
  • 다음으로 내 테이블의 필드를 정의합니다. string으로 가정되지만 모델의 모든 필드와 데이터 유형을 정의해야 합니다. 생략하면.)

dynamoid gem은 테이블을 만들기 위한 멋진 갈퀴 작업과 함께 제공됩니다.

rake dynamoid:create_tables

3단계:개체와 상호작용

이 중 일부가 낯설게 보일 수 있지만 좋은 소식이 있습니다! dynamoid의 중요한 부분 보석은 Active Record에 익숙한 다른 많은 기능이 거의 동일한 방식으로 작동한다는 것입니다.

협회

예를 들어, Dynamoid는 has_many, has_one, has_and_belongs_to_many, and belongs_to와 같은 여러 연결을 지원합니다. ActiveRecord에서 일반적으로 하는 것처럼 모두 정의할 수 있습니다. 내 임대 부동산 앱에 Lease라는 다른 문서 테이블이 있는 것을 상상할 수 있습니다. , 그래서 Houses 테이블에서 다음과 같이 정의할 수 있습니다.

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 프로젝트에 gem을 추가하세요.

이 시리즈의 다음 기사에서는 DynamoDB를 로컬에서 설정하고 Ruby SDK의 일부 기능을 사용해 보겠습니다.