JJUG CCC 2022 Springの登壇時の資料になります。
神戸大学大学院システム情報学研究科・CS24RabbitMQを用いたイベント駆動アーキテクチャの紹介徳永 清輝(Seiki Tokunaga)1
View Slide
免責事項と自己紹介■ 本発表は、現在の所属組織とは関係なく、私個人の見解を発表するものです。所属する組織の立場、意見、戦略を代表するものではありません。■ 掲載しているRabbitMQの説明の図の1部についてはRabbitMQをクラウドサービスとして提供しているCloudAMQPに了承をとりWebサイトより引用しています。■ 発表者について● 徳永清輝 (Twitter, GitHub @otokunaga2)● 業務:普段は研究所で高齢者支援ロボットシステムの設計・開発・運用に従事● RabbitMQをシステム開発に利用(5年ぐらい?)2
想定聴講者■ イベント駆動アーキテクチャをこれからトライしてみようと思っている方■ ソフトウェアアーキテクチャの基礎の14章イベント駆動アーキテクチャを読んでもう少し実装イメージをつけたいと思われた方■ これまでRabbitMQは聞いたことがあるけど使ったことがなく、気になるという方3
イベント駆動アーキテクチャ■ 高度にスケーラブルで高パフォーマンスなアプリケーションを実現するために用いられる分散非同期型のアーキテクチャスタイル。※1■ 適応性に優れており、小規模なアプリケーションにも大規模で複雑なアプリケーションにも用いることが可能。■ 単体のアーキテクチャスタイルではなく、例えばリクエスト・レスポンスのアーキテクチャと組み合わせてハイブリッドな構成にもできる● 既存システムと疎結合にシステム連携する4※ソフトウェアアーキテクチャの基礎 エンジニアリングより抜粋
RabbitMQについて■ OSSとして開発されているメッセージキューイングソフトウェア(メッセージブローカーとも呼ばれる)■ AMQP-0-9-1というプロトコルをベースに一部独自拡張して実装■ Erlangという関数型プログラミング言語で開発されている■ クライアントライブラリとして多くのプログラミング言語をサポート(Java, Spring Boot, Python,Node.js)5※Reference: https://www.cloudamqp.com/blog/part1-rabbitmq-for-beginners-what-is-rabbitmq.html
RabbitMQの利用事例■ 広告配信などの一斉配信■ バックエンドで処理に時間を要する処理● PDFの生成6
RabbitMQでの重要な用語■ コネクション● アプリケーションとRabbitMQブローカーの通信経路(TCP)■ チャンネル● コネクション内で作成する仮想的な通信経路。データを送受信する際にはチャンネル経由でデータ通信を行う● コード例: コネクションからチャンネルを作成■ エクスチェンジ● メッセージのキューへの配送経路■ キュー● メッセージを末尾に送り、先頭から取り出す● FIFO(first in first out)■ バインディング● エクスチェンジとキューの紐づけを行う7
Producer(プロデューサ)・Consumer(コンシューマ)■ データを送受信するプロセスをそれぞれProducer(プロデューサ/生産者)と Consumer(コンシューマ/消費者)と呼ばれる■ プロデューサ● メッセージを送信するプロセス⮚ PDFを生成依頼するメッセージを送信■ コンシューマ● メッセージを受信して何らかの処理を実施するプロセス● データを処理して正常処理ならば⮚ ack(応答)をRabbitMQサーバに対して返却する→キューからメッセージを除去8
Exchange(エクスチェンジ)■ Exchangeはメッセージングの通信経路● 直接キューにメッセージを送信しない点が特徴的でかつ柔軟なルーティングを実現● Exchangeとbindingしているキューに配送される■ Direct Exchange● 直接対象となるキューに配信■ Topic Exchange● 特定のトピック別に配信先を分ける(スポーツニュース、天気)■ Fanout: 一斉に通知● 広告配信9
エクスチェンジ、キューの 関連付け(Binding)■ エクスチェンジとキューはバインディングと呼ばれる仮想的な関連付けによって配送先が決定する● 特にトピックエクスチェンジでは、ルーティングキーを指定することでより詳細に配送ルールをコントロールできる⮚ 例 良い天気の情報を良い天気を格納するためのキュー● ルーティングキーは.(ドット)区切りで細かくルールを指定できる⮚ 例 weather.good, weather.bad10
書籍購入イベントの処理例(一部省略)11書籍の購入(Producer)OrderPlacement (Exchange)order-createdNotification(Consumer)Payment(Consumer)Inventory(Consumer)order-created order-createdWarehouse(Consumer)inventory-updated
デモ動画12
デモ13
イベント駆動設計のメリットおよびデメリット■ メリット● 配送経路(Exchange)などが比較的容易⮚ 配送経路を追加して拡張することも可能● パフォーマンスやスケールの面でメリットをもたらす■ デメリット● バインディングの管理が煩雑になりがち⮚ 図などにまとめながら整理していくと良い⮚ エクスチェンジとキューの命名なども含めて設計することが重要• ユーザIDをキューの名前に含めてモニタリングをわかりやすくする等● 異常系の処理(データ同期、デバッグ)が複雑になる⮚ “サービス間の通信スタイルは、標準的には同期通信を選択肢、必要に応じて非同期通信を選ぼう”14※ソフトウェアアーキテクチャの基礎 エンジニアリングより抜粋
まとめ■ イベント駆動アーキテクチャについてRabbitMQを題材に紹介しました。■ RabbitMQの基本機能を紹介● ※基本機能の紹介で力尽きてしまいました■ イベント駆動アーキテクチャの実装例の一部を在庫管理の例をもとに紹介15
参考資料■ RabbitMQ● RabbitMQの使い方をハンズオン形式で学べるのでおすすめ⮚ https://www.rabbitmq.com/tutorials/tutorial-one-java.html● 以下の記事が網羅的でとても分かりやすいです⮚ https://blog.mookjp.io/memo/rabbitmq-learning/■ Springに関する導入・参考資料● RabbitMQ でメッセージング⮚ https://spring.pleiades.io/guides/gs/messaging-rabbitmq/● Spring integrationを用いた実装サンプル⮚ spring-projects/spring-integration-samples■ イベント駆動設計等アーキテクトについて● ソフトウェアアーキテクチャの基礎~エンジニアリングに基づく体系的アプローチ16