今回からは数回に渡り、Spring Cloud AWSを用いてメッセージキューサービス「Amazon SQS(Simple Queue Service)」へアクセスするSpringアプリケーションの実装方法について解説していきます。

解説にあたっては以下の前提知識がある開発者を想定しています。

対象読者 前提知識
エンタープライズ開発者 Java言語及びSpringFrameworkを使った開発に従事したことがある経験者。経験がなければ、こちらのチュートリアルを実施することを推奨します。TERASOLUNAはSpringのベストプラクティスをまとめた開発方法論で、このチュートリアルでは、JavaやSpring Frameworkを使った開発に必要な最低限の知識を得ることができます
GitHubなどのバージョン管理ツールやApache Mavenなどのライブラリ管理ツールを使った開発に従事したことがある経験者
AWS開発経験者 AWSアカウントを持ち、コンソール上で各サービスを実行したことがある経験者

また、動作環境は以下のバージョンで実施しています。

動作対象 バージョン
Java 1.8
Spring Boot 2.1.7.RELEASE
Spring Batch 4.1.2.RELEASE
Spring Cloud AWS 2.1.2.RELEASE

なお、将来的には、AWSコンソール上の画面イメージや操作、バージョンアップによりJavaのソースコード内で使用するクラスが変更される可能性があります。

Amazon SQSの概要

Amazon SQSはS3と同じく、リージョン単位で提供される完全マネージド分散型キュー配信方式のメッセージサービスです。複数のサーバに複数のメッセージのコピーを保存し、信頼性を確保しながら最低1度の配信を保証しています。大容量のデータを高スループットで転送可能であり、メッセージ送信の信頼性が高く、各コンポーネントを疎結合にして、アプリケーションを構成することが可能です。

メッセージキューは以下のようなURLフォーマット、メッセージID、受信ハンドル(ReceiptHandle)で識別され、操作用のAPIが提供されています。

http://sqs.<region>.amazonaws.com/<accout-id>
API 概要
CreateQueue 新しいキューを作成するか、既存のキューのURLを返す
SetQueueAttribute キューの属性を設定する。属性値は下記表を参照
GetQueueAttribute キューの属性を取得する。属性値は下記表を参照
GetQueueUrl キューのURLを取得する
ListQueues キューのリストを取得する
DeleteQueues キューを削除する

キューの属性は、以下の通りです。

属性名 概要
DelaySecounds メッセージの遅延配信時間
MaximumMessageSize メッセージに含まれる最大バイト数(デフォルト/最大値ともに256KB)
MessageRetentionPeriod メッセージが保持される秒数(デフォルト4日、最大14日)
RecieveMessageWaitTimeSeconds 呼び出しがメッセージ到着を待機する時間(デフォルト0秒、最大20秒)
Visibility Timeout 特定のアプリケーションコンポーネントからキューがメッセージを取得した後、その他からメッセージが不可視となる時間

SQSでは、通常メッセージの処理順序でシーケンス性が保証されません。メッセージ順序を保証する場合はFIFOキューを利用します。また、SQSには「可視性タイムアウト(Visibility Timeout)機能」があります。

「可視性タイムアウト」とは、あるキューが処理中に異常処理した場合、別のノードでキューを処理するために、キューをロックした状態で残しておく時間のことです。ロックをかけることで、複数のノードが同じキューを処理することを回避します。

また、処理できなかったキューを除外し、「デッドレターキュー」として、別のキューに蓄積しておくことも可能です。キューはほかのユーザーとも共有することができ、暗号化オプション、匿名でほかのAWSユーザーと共有するオプション、アクセス許可を利用して特定のユーザーとシェアするオプションがあります。なお、その場合、料金を負担するのはメッセージの所有者です。

SQSを使ったアプリケーションの処理パターン

上述のような特性を持つキューですが、アプリケーションの処理中にキュー操作を組み込むことにより、疎結合で耐障害性/パフォーマンスに優れたアプリケーションを構築することができます。キューを使った代表的な処理パターンは以下の通りです。

  1. Webアプリケーションが処理要求を受け付け、クライアントには受付要求が完了したことを返却する。
    ・後続の処理は別のイベントを契機として、後続の処理を1つのトランザクションとして非同期実行します(翌日付の振込などが代表的な例です)。
    ・Webアプリケーションの受付とは別に負荷が高い処理を別プロセスで実行します(ディレードバッチとも呼ばれます。帳票データを一括してPDF化する処理要求などが代表的な例です)。
  2. 他のアプリケーションからの処理要求を契機として、一括処理を起動する。
    ・マネジメントセグメントにある運用端末から、バックヤードでフロントから受け付けたデータの一連の業務処理実行を行います(銀行口座開設の受付に対する審査などが代表的な例です)。
  3. クラウドサービスへのイベントを契機として、一括処理を起動する。
    ・共有ストレージへの書き込み、メタ情報の永続化を1つのトランザクションとして実行します(画像データのサムネイル作成やそのファイルパスをデータストアに保存する処理などが代表的な例です)

キューを使った代表的な処理パターン

処理やワークロードに応じて、適切なユースケースでSQSを活用することで、一部のサーバに障害が起こった場合でも安定して処理を行うことができます。ただし、上記の非同期処理においては、同期型処理の場合に比べ、実行エラーの対処が複雑化しがちです。そのため、ユーザビリティを損なわない適切な例外ハンドリング設計が重要になります。

SQSキューの作成

それでは、早速AWSコンソールからキューを作成して使用してみましょう。サービスメニューから「SimpleQueueService」を選択し、「新しいキューの作成」ボタンを押下し、キュー名を入力してキューのタイプを選択します。

新しいキューの作成

前節で説明した、デフォルト可視性やデッドレターキューなどのオプション設定を行う場合は、「キューの設定」ボタンを押下します。オプションのパラメータを必要に応じて入力し、「キューの作成」ボタンを押下してください。

オプションのパラメータを必要に応じて入力し、「キューの作成」ボタンを押下

これでキューの設定が完了しました。次回以降は、このキューにメッセージを送信/ポーリングで取得するProducer、Consumerアプリケーションと、そこから実行されるSpringBatchアプリケーションを実装していきます。

著者紹介


川畑 光平(KAWABATA Kohei) - NTTデータ 課長代理

金融機関システム業務アプリケーション開発・システム基盤担当を経て、現在はソフトウェア開発自動化関連の研究開発・推進に従事。

Red Hat Certified Engineer、Pivotal Certified Spring Professional、AWS Certified Solutions Architect Professional等の資格を持ち、アプリケーション基盤・クラウドなどさまざまな開発プロジェクト支援にも携わる。2019 APN AWS Top Engineers & Ambassadors選出。

本連載の内容に対するご意見・ご質問は Facebook まで。