Upgrade to Pro — share decks privately, control downloads, hide ads and more …

RabbitMQを用いたイベント駆動アーキテクチャの紹介

 RabbitMQを用いたイベント駆動アーキテクチャの紹介

JJUG CCC 2022 Springの登壇時の資料になります。

otokunaga2

July 02, 2022
Tweet

Other Decks in Technology

Transcript

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  5. 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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  12. デモ動画
    12

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide