Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

RailsアプリでのDynamoDBの使用

DynamoDBは、その中核となるNoSQLデータベースであり、キー値とドキュメントのデータ構造を提供します。これを開梱しましょう。これを読んでいる開発者のほとんどは、テーブル、行、列に正規化された明確に定義されたスキーマとデータを含む従来のリレーショナルデータベースシステムに精通していると思います。これらのテーブルの間には、外部キーを利用する「関係」があります。対照的に、DynamoDBはスキーマレスです。すべてのテーブルに主キーが必要ですが、他の非キー属性に他の制約はありません。これはいつ有益でしょうか?さて、AmazonがDynamoDBを作成した理由を学びましょう。

Amazonは、2012年にDynamoDBを公開する計画を発表しました。Amazonは元々、トラフィック量が多いためにいくつかのアプリケーションが失敗した2004年のホリデーシーズン後に社内でDynamoを開発していました。

DynamoDBの利用をいつ検討する必要がありますか?

DynamoDBは、非常に多数(数千以上)の同時ユーザーをサポートする必要があるアプリケーション向けの確かなオプションであり、したがって、1秒あたり数万の読み取り/書き込みをサポートします。たとえば、ソーシャルネットワーク、ゲーム、IoTデバイスはDynamoDBの有力な候補となる可能性があります。たとえば、Lyft、Airbnb、RedfinはDynamoを利用しています。最初は採用が少なく、パフォーマンスの必要性がすぐに必要ではない場合でも、最終的に規模を拡大するために構築する場合は、DynamoDBから始める方がPostgresなどの従来のSQLデータベースよりも有利な場合があります。ただし、ユーザーが頻繁にクエリを実行するデータウェアハウスまたはOLAPアプリケーションを構築する場合は、スキーマレスデータベースが設計上の最良の選択ではない可能性があります。さらに、RDMSはストレージ用に最適化されていますが、DynamoDBはコンピューティング用に最適化されています。 Amazonは、DynamoDBがあらゆる規模で1桁のミリ秒のパフォーマンスを提供し、1日あたり10兆以上のリクエストを処理でき、ピーク時には1秒あたり2,000万以上のリクエストを処理できると宣伝しています。うわー!

さらに、AWSは、DynamoDBをデータ保持やセキュリティを必要とするアプリケーションに最適にすることができる他の一連の機能を提供します。

  • 保管時の暗号化:DynamoDBは、主キーを含むすべてのデータを暗号化されたテーブルに保護します。ユーザーは、AWSが所有するカスタマーマスターキー(CMK)、AWSが管理するCMK(つまり、キーがアカウントに保存され、AWS Key Management Serviceによって管理される)、または顧客が管理するCMK(つまり、 、キーはアカウントに保存され、ユーザーが作成/所有/管理します。)すばらしいのは、各テーブルが異なるオプションを利用できることです。保管時の暗号化の詳細については、AWSの公式ドキュメントをご覧ください。

  • オンデマンドバックアップ/ポイントインタイムリカバリ:DynamoDBを使用すると、過去30日間の任意の時点にテーブルを復元できます。誤って書き込んだり削除したりすることを心配する日は長いです!

DynamoDBの基本

DynamoDBには、テーブル、アイテム、属性の3つのコアコンポーネントがあります。これらをそれぞれ分解してみましょう。

  • 表:アイテムのコレクション
  • アイテム:属性のコレクション
  • 属性:これ以上分解する必要のない基本的なデータ要素。

たとえば、賃貸物件を管理するためのアプリケーションを作成している場合、次の項目を含む「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にインデックスを作成したいふりをしましょう およびzip 私のHousesの属性 テーブル(つまり、郵便番号を指定して、その郵便番号ですべての賃貸物件を取得します)。 SQLデータベースを使用している場合は、次のような移行を作成する可能性があります。

CREATE INDEX RentedAndZipIndex
ON Houses (rented, zip);

対照的に、DynamoDBを使用している場合は、セカンダリインデックスを設定する必要があります。これを行うには、パーティションキーとソートキーを指定する必要があります。この例では、zipがパーティションキーであり、rentedがソートキーです。 DynamoDBのインデックスについて学ぶことはまだたくさんありますが、この記事のために、ここに残しておきます。詳細については、こちらをご覧ください。

RubyおよびRubyonRailsでのDynamoDBの利用

AWSは、DynamoDB用にさまざまな言語でSDKを提供しています(現在、Java、JavaScript、Node.js、.NET、PHP、Python、Ruby)。RubyでDynamoDBを使用するには、次の2つのオプションがあります。

1)DynamoDBをローカルにダウンロードします。アプリケーションをテストしたいだけなら、これは素晴らしいオプションです!本番環境に移行する準備ができたら、ローカルエンドポイントを削除してWebサービスをポイントできます。2)DynamoDB Webサービスを利用します。これには、AWSアクセスキーとクレジットが必要です。

DynamoDBを操作するには、CLIをダウンロードすることをお勧めします。それ以外の場合は、コンソールまたはAPIのみを利用できます。

最後に、このシリーズの目的のために、RubyとAWS SDKforRubyをインストールしておく必要があります。

Railsには、プロジェクトに追加できる気の利いた宝石があります。それはダイナモイドと呼ばれます。ただし、AWSクレデンシャルは引き続き必要です。

Railsの例

ステップ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の大きな部分 宝石は、ActiveRecordで慣れている他の多くの機能がほとんど同じように機能することです。

関連付け

たとえば、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 は属性です。

もっと欲しいですか?

たくさんがあります ダイナモイドの宝石についてもっと学ぶために、しかしうまくいけば、これはあなたが遊んで始めるのに十分です。利用可能な機能の詳細については、GitHubの公式ページをご覧になることをお勧めします。

次のアップ

さて、ここで消化することがたくさんあります!うまくいけば、誰かが「NoSQL」と言ったときの意味と、スキーマレスデータベースを必要とするプロジェクトにDynamoDBが適している理由についてもう少し知識を深めることができます。さらに、dynamoidを利用する基本的な設定についても説明しました。 Railsプロジェクトの宝石。

このシリーズの次の記事では、DynamoDBをローカルでセットアップし、RubySDKのいくつかの機能を試してみます。


  1. React on Rails:シンプルなアプリの構築

    アプリケーションのフロントエンド側全体を構築する企業は、多くの場合、バックエンドを構築するためにRailsなどの同じフレームワークを選択します。長年にわたり、これは最良かつ最も信頼できるオプションでした。 今日、絶えず進化するフロントエンドユニバースにある多数のライブラリとフレームワークにより、開発者はバックエンドとフロントエンドの両方に異なるプラットフォームを選択し、それらを簡単に統合できます。 Reactはフロントエンドのパンゲアの巨人になりました。 Ruby on Railsを使用している場合は、デフォルトのRailsページをReactコード(またはその他のフロントフレームワーク)に

  2. Rails5でのAngularの使用

    あなたは前にその話を聞いたことがあります。分散型で完全に機能するバックエンドAPIと、通常のツールセットで作成されたフロントエンドで実行されているアプリケーションがすでにあります。 次に、Angularに移動します。または、AngularをRailsプロジェクトと統合する方法を探しているだけかもしれません。これは、この方法を好むためです。私たちはあなたを責めません。 このようなアプローチを使用すると、両方の世界を活用して、たとえばRailsとAngularのどちらの機能を使用してフォーマットするかを決定できます。 構築するもの 心配する必要はありません。このチュートリアルは、この目的のた