Slide 1

Slide 1 text

Introduction to DynamoMQ 株式会社ヌーラボ サービス開発部 Backlog課 Yuichi Watanabe Copyright Nulab Inc. All Rights Reserved. DAIMYO Meetup #4 〜 DynamoDBを活用したメッセージキューの実装 〜

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

DynamoDBの概要 Amazon DynamoDBは、高性能なNoSQLデータベースサービス。単純なKVSから複雑なドキュメント型のストアまで、幅広いデータモデ ルに対応している。 ・パフォーマンスとスケーラビリティ: ミリ秒単位で応答可能であり、必要に応じて自動的に読み書きのキャパシティをスケールアップ・ダウンできる。 ・高可用性と耐久性: データは自動的に複数のAZにレプリケーションされるため、高度な可用性と耐久性を実現する。 ・フルマネージドでサーバーレス: サーバーの管理や設定に関する手間がかからず、運用コストを削減できる。 高性能なNoSQLデータベースサービス

Slide 4

Slide 4 text

DynamoDBをメッセージキューとして活用する動機 ・オンデマンドモードを利用することで、需要の変動に応じて容易にリソースを調整し大量のメッセージを処理できる。 ・リソースのスケールアップ・ダウンを自動的に行えるのでの過剰な割当を低減できる。 オンデマンドなリソースの調整 ・使用量を予測できる場合にはプロビジョニングモードを選択することで、コストを削減できる。 プロビジョニングモードの選択肢 ・DynamoDBの高い耐久性と可用性がメッセージキューイングシステムの安定に繋がる。 高い耐久性と可用性 ・任意のタイミングでDynamoDBのレコードを編集できるので柔軟な操作が可能になる。 ・動的なメッセージの順序変更 ・属性の更新、メッセージのキャンセル ・キュー内のメッセージのReadOnlyな参照など... メッセージの柔軟な操作

Slide 5

Slide 5 text

DynamoMQが提供するもの ・Go言語でのコンシューマー、およびプロデューサー(Sender)の実装を支援するSDK ・管理ツールとして機能するコマンドラインツール GoのSDKとコマンドラインツール Refs: https://www.enterpriseintegrationpatterns.com/patterns/messaging/CompetingConsumers.html CLI Storage

Slide 6

Slide 6 text

DynamoMQが提供するもの ・再配信: メッセージが正常に処理されなかった場合に再配信 ・並行処理: 複数のゴルーチンでメッセージの処理を並行して行う ・デッドレターキュー: 再配信の最大回数を超えたメッセージをDLQに移動する ・グレースフルシャットダウン: コンシューマープロセスのシャットダウン前に処理中の メッセージの完了を待つ サポートする機能 ・FIFO: メッセージが送信された順序で処理されることを保証する ・可視性タイムアウト: タイムアウト付きのメッセージの可視時間を設けることで、 複数のコンシューマーによるメッセージの重複受信を防ぐ ・遅延キューイング: コンシューマーへのメッセージの配信を設定した秒数だけ 遅らせる

Slide 7

Slide 7 text

DynamoMQの使い方 【SDK】クライアントの作成 1. DynamoMQで使用するメッセージの構造体を定義する。 2. AWS SDK for Go v2とDynamoMQから必要なパッケージを インポートする。 3. AWSのConfigを読み込み、その設定をNewFromConfig関数に 渡して、DynamoMQクライアントを作成する。 ※型引数でクライアントが取り扱うメッセージの型を指定する ※DynamoDBをDynamoMQとして操作するために必要なメソッドが クライアントに実装されている 1 2 3

Slide 8

Slide 8 text

DynamoMQの使い方 【SDK】プロデューサーの作成 1. NewProducer関数の型引数に'ExampleData'型を指定して、 引数にclientを渡す。 2. producerのProduceメソッドにProduceInput構造体を渡して、 Dataフィールドに型引数で指定した型のデータを渡す。 1 2 Refs: https://www.enterpriseintegrationpatterns.com/patterns/messaging/CompetingConsumers.html

Slide 9

Slide 9 text

DynamoMQの使い方 【SDK】コンシューマーの作成 1. MessageProcessorインターフェイスを実装する。 2. NewConsumer関数の型引数に'ExampleData'型を指定して、 1.で実装した構造体を引数に渡す。 3. ConsumerのStartConsumingメソッドを呼び出して メッセージキューのConsumingを開始する。 4. TERMシグナルを受信してグレースフルにシャットダウンする。 1 2 3 4

Slide 10

Slide 10 text

DynamoMQの使い方 管理ツールとしてのコマンドラインツール

Slide 11

Slide 11 text

DynamoMQの設計 メッセージの属性とテーブル定義

Slide 12

Slide 12 text

DynamoMQの設計 メッセージの状態遷移 READY PROCESSING READY ReceiveMessage() ChangeMessageVisibility() DeleteMessage() MoveMessageToDLQ() SendMessage() Failed -> Retry Success Failed queue_type=STANDARD Redrive RedriveMessage() PROCESSING ReceiveMessage() queue_type=DLQ DeleteMessage() Success

Slide 13

Slide 13 text

まとめ DynamoMQは... ・DynamoDBの特性を活かしたメッセージキューイングライブラリです。 ・フルマネージドサービスの恩恵を受けた、高いスケーラビリティ、信頼性、およびコスト効率を実現します。 ・特に、メッセージの順序変更や属性を動的に編集できる点は、アプリケーションの要求を柔軟に対応することを可能にします。 ・メッセージキューが提供すべき主要な機能を提供します。 ・メッセージの再配信、並行処理、DLQ、グレースフルシャットダウン、FIFOキュー、可視性タイムアウト、遅延キューイング DynamoMQは、サーバーレスの信頼性の享受しつつ、キュー内のメッセージをReadOnlyで参照したいケースや 、メッセージの順序や属性を動的に変更したいケースの解決策の一つとして開発しました。 Notes:基本的には上記の制約がなければAmazon SQSの使用を推奨します。