iChain’s Engineer Blog

iChain株式会社の開発チームによるブログです

イベント駆動型アーキテクチャ / DynamoDBの実例

iChainの開発全般を担当しています。初記事になります。よろしくお願いします! 今回はDynamoDBをつかった、サーバレスアプリケーションの事例について書きたいと思います。こんな案件の時に、というシナリオをベースにしながら紹介していきますね。

開発の要件

以下の要件がベースになります。

  • 一般消費者からの注文を受けるサイトを構築する
  • 注文情報と注文の通知は、1日1回に集約して行う
  • 注文者に対しては、注文完了時にメールを送信する

DynamoDBとは

Amazonのサービスの一つです。公式の紹介はこちら。

Amazon DynamoDB(マネージド NoSQL データベース)| AWS

DynamoDBの特徴は下記の通りです。

  • フルマネージドサービス
  • NoSQLデータベース
  • サーバーレス、データ拡張性
  • 数ミリ秒台のレスポンスタイム

NoSQLデータベースに関してはAWSのホームページ(https://aws.amazon.com/jp/nosql/)に詳しく記載されているのでそこを参照すると概要が把握できると思います。 特に気に入っているのが1つのテーブルに1つのデータモデル(Schema)を定義する必要がない点で、実装しながら適宜柔軟にSchema変更していくことができます。これによってあれこれ試しながら開発をすすめることができるのでアジャイル開発にも向いているかもしれませんね。

ちなみに、DynamoDBはキーバリュー型です。キーと値によるシンプルな方法を使用してデータを格納しており、応答速度が早いのが特徴です。

上記のような特徴から、手軽にwebアプリケーションを構築したい、かつ顧客情報をうけとりサービスとして活用したいというケースでよく使われます。身近な例としては、web広告でのマーケティングデータ管理、ゲームやエンタメでのコンテンツ管理と顧客データ管理、ECサイト等での顧客データ管理です。

開発の内容

要件を踏まえ、イベント駆動型アーキテクチャで構成すること、DynamoDBを使用することとしましょう。

イベント駆動アーキテクチャ

独立した機能同士をイベントを通じてつなげることで、各機能間の結合度を下げ、各機能は自分の仕事に注力できるようになります。 今回の要件に「注文を保存し、注文完了メールを送信する」というものがありますが、これを - 注文を保存する機能 - メールを送信する機能 のように独立した機能として分離させ、この2つを「注文が保存された」というイベントを通じてつなげます。 具体的には

  1. 「注文を保存する機能」が注文データを保存する
  2. 「注文が保存された」というイベントが発行される
  3. 発行されたイベントに「メールを送信する機能」がキャッチし、イベント内容に基づいてメールを送信する

ということになります。これだけだと動くことはわかるけど何がうれしいのかわかりませんね。

メリットを享受できるのは機能の追加等改修が発生した場合です。
例えば保存された注文データを基に何らかの処理が必要になった場合、「注文が保存された」というイベントをトリガーに動くように独立した新機能を追加すれば既存の「注文を保存する機能」や「メールを送信する機能」には全く手を加える必要がありません。他の処理への影響を考えることなく新機能を追加できるようになります。

機能を変更したり、削除する場合も同様です。各機能が独立して他の機能に影響を与えないので改修がかなり楽になります。ではどうやってこの「注文が保存された」というイベントを発行するのでしょうか?今回はDBへのデータ保存をトリガーにイベントが発行されると都合が良いです。そんなときに使えるのがDynamoDB Streamです。

DynamoDB Stream

DynamoDBに付随する機能で、データ登録、更新、削除等データへの更新処理が発生したことを検出し、別サービスに通知することができます。これによりイベント駆動のアプリケーションを構成することが可能になります。使いたかった「注文が保存された」というイベントを実装できるわけです。

今回独立させた2つの機能「注文を保存する機能」と「メールを送信する機能」はそれぞれAWS Lambda で実装しています。最終的には以下のような形になりました。

  1. 「注文を保存する機能(Lambda)」がDynamoDBにデータを保存
  2. DynamoDBが DynamoDB Streamを使ってイベントを発行
  3. イベントを受け取った「メールを送信する機能(Lambda)」がメールを送信

Time to Live

DynamoDBに付随する機能で、データに有効期限を設定し、その期限を切れたものはDynamoDB側が削除してくれます。

顧客に申込データを通知したら、もうそのデータはそれ以降使用しない仕様となったため、ゴミとしてデータが残ります。ただ、このデータも補完すればストレージを使用するので課金対象となってしまいます。しかし、ゴミデータ削除バッチのようなものをこのために作るのも手間です。そんなときにこの機能を使うことで、運用コストを最適化できます!!!普通に便利です。

おわりに

ざっと概説しました。iChainではマイクロサービスアーキテクチャが大ブームなので、一つの事例としてDynamoDBを紹介してみました。
DynamoDBはちょっとしたDBをつくるときに便利なので(それ以外でも便利なんですが)、いろいろ触ってもらったらいいんじゃないかな〜と思っています。

※ iChainでは一緒に働く仲間を募集しています。よかったらHPとかwantedlyとかみて、是非応募ください!