Slide 1

Slide 1 text

神戸大学大学院システム情報学研究科・ CS24 RabbitMQを用いた イベント駆動アーキテクチャの紹介 徳永 清輝(Seiki Tokunaga) 1

Slide 2

Slide 2 text

免責事項と自己紹介 ■ 本発表は、現在の所属組織とは関係なく、私個人の見解 を発表するものです。所属する組織の立場、意見、戦略 を代表するものではありません。 ■ 掲載しているRabbitMQの説明の図の1部については RabbitMQをクラウドサービスとして提供している CloudAMQPに了承をとりWebサイトより引用しています。 ■ 発表者について ● 徳永清輝 (Twitter, GitHub @otokunaga2) ● 業務:普段は研究所で高齢者支援ロボットシステムの設計・開 発・運用に従事 ● RabbitMQをシステム開発に利用(5年ぐらい?) 2

Slide 3

Slide 3 text

想定聴講者 ■ イベント駆動アーキテクチャをこれからトライしてみよ うと思っている方 ■ ソフトウェアアーキテクチャの基礎の14章イベント駆動 アーキテクチャを読んでもう少し実装イメージをつけた いと思われた方 ■ これまでRabbitMQは聞いたことがあるけど使ったことが なく、気になるという方 3

Slide 4

Slide 4 text

イベント駆動アーキテクチャ ■ 高度にスケーラブルで高パフォーマンスなアプリケーシ ョンを実現するために用いられる分散非同期型のアーキ テクチャスタイル。※1 ■ 適応性に優れており、小規模なアプリケーションにも大 規模で複雑なアプリケーションにも用いることが可能。 ■ 単体のアーキテクチャスタイルではなく、例えばリクエ スト・レスポンスのアーキテクチャと組み合わせてハイ ブリッドな構成にもできる ● 既存システムと疎結合にシステム連携する 4 ※ソフトウェアアーキテクチャの基礎 エンジニアリングより抜粋

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

RabbitMQの利用事例 ■ 広告配信などの一斉配信 ■ バックエンドで処理に時間を要する処理 ● PDFの生成 6

Slide 7

Slide 7 text

RabbitMQでの重要な用語 ■ コネクション ● アプリケーションとRabbitMQブローカーの通信経路(TCP) ■ チャンネル ● コネクション内で作成する仮想的な通信経路。データを送受信する際に はチャンネル経由でデータ通信を行う ● コード例: コネクションからチャンネルを作成 ■ エクスチェンジ ● メッセージのキューへの配送経路 ■ キュー ● メッセージを末尾に送り、先頭から取り出す ● FIFO(first in first out) ■ バインディング ● エクスチェンジとキューの紐づけを行う 7

Slide 8

Slide 8 text

Producer(プロデューサ)・Consumer(コンシューマ) ■ データを送受信するプロセスをそれぞれProducer(プロ デューサ/生産者)と Consumer(コンシューマ/消費者) と呼ばれる ■ プロデューサ ● メッセージを送信するプロセス ⮚ PDFを生成依頼するメッセージを送信 ■ コンシューマ ● メッセージを受信して何らかの処理を実施するプロセス ● データを処理して正常処理ならば ⮚ ack(応答)をRabbitMQサーバに対して返却する→キューからメッ セージを除去 8

Slide 9

Slide 9 text

Exchange(エクスチェンジ) ■ Exchangeはメッセージングの通信経路 ● 直接キューにメッセージを送信しない点が特徴的でかつ柔軟な ルーティングを実現 ● Exchangeとbindingしているキューに配送される ■ Direct Exchange ● 直接対象となるキューに配信 ■ Topic Exchange ● 特定のトピック別に配信先を分ける(スポーツニュース、天気) ■ Fanout: 一斉に通知 ● 広告配信 9

Slide 10

Slide 10 text

エクスチェンジ、キューの 関連付け(Binding) ■ エクスチェンジとキューはバインディングと呼ばれる仮 想的な関連付けによって配送先が決定する ● 特にトピックエクスチェンジでは、ルーティングキーを指定する ことでより詳細に配送ルールをコントロールできる ⮚ 例 良い天気の情報を良い天気を格納するためのキュー ● ルーティングキーは.(ドット)区切りで細かくルールを指定で きる ⮚ 例 weather.good, weather.bad 10

Slide 11

Slide 11 text

書籍購入イベントの処理例(一部省略) 11 書籍の購入 (Producer) Order Placement (Exchange) order-created Notification (Consumer) Payment (Consumer) Inventory (Consumer) order-created order-created Warehouse (Consumer) inventory-updated

Slide 12

Slide 12 text

デモ動画 12

Slide 13

Slide 13 text

デモ 13

Slide 14

Slide 14 text

イベント駆動設計のメリットおよびデメリット ■ メリット ● 配送経路(Exchange)などが比較的容易 ⮚ 配送経路を追加して拡張することも可能 ● パフォーマンスやスケールの面でメリットをもたらす ■ デメリット ● バインディングの管理が煩雑になりがち ⮚ 図などにまとめながら整理していくと良い ⮚ エクスチェンジとキューの命名なども含めて設計することが重要 • ユーザIDをキューの名前に含めてモニタリングをわかりやすく する等 ● 異常系の処理(データ同期、デバッグ)が複雑になる ⮚ “サービス間の通信スタイルは、標準的には同期通信を選択肢、必要 に応じて非同期通信を選ぼう” 14 ※ソフトウェアアーキテクチャの基礎 エンジニアリングより抜粋

Slide 15

Slide 15 text

まとめ ■ イベント駆動アーキテクチャについてRabbitMQを題材に 紹介しました。 ■ RabbitMQの基本機能を紹介 ● ※基本機能の紹介で力尽きてしまいました ■ イベント駆動アーキテクチャの実装例の一部を在庫管理 の例をもとに紹介 15

Slide 16

Slide 16 text

参考資料 ■ 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