Sansan Tech Blog

Sansanのものづくりを支えるメンバーの技術やデザイン、プロダクトマネジメントの情報を発信

【仕様を読み解く】第2回 Advanced Message Queuing Protocol (2) ~Transport~

こんにちは、プロダクト開発部 Data Hub プロダクトグループの秋田です。気付けばもう12月。随分肌寒くなってきましたね。こたつに入りながらリモートワークをしたいところですが、そういえば我が家にはこたつがないことに今気付きました。

本連載では様々なプロトコルやシステムの仕様を読み解いていくことで、それらに込められた意思と意図を考えていこうと思います。

第2回は Data Hub で使用している Azure Service Bus で採用されている Advanced Message Queuing Protocol 1.0 (AMQP 1.0) の仕様のうち、Transportについて読み解いていきたいと思います。


今回の記事は下記の記事の続きです。
buildersbox.corp-sansan.com
AMQP に関する情報は下記から確認できます。
www.amqp.org

概念モデル

AMQP ではメッセージのやり取りはノード間で行われます。ノードには、メッセージの生成や処理を行う Producer や Consumer 、メッセージの保存と転送を行う Queue の3種類があります。メッセージを送信する Broker やメッセージを受信して処理を行う Client はコンテナと呼ばれ、コンテナは複数のノードを持つことが出来ます。

f:id:s_akita:20201202092640p:plain
Class Diagram of Concrete Containers and Nodes (仕様書より引用)

通信エンドポイント

AMQP Connection は全二重通信で、信頼性のある順序付きのフレームのシーケンスがやり取りされます。フレームは必ず正しい順序で送信される必要があります。
通信エンドポイントには Connection、Session、Link があり、1つの Connection は複数の Session を、1つの Session は複数の Link を張ることが出来ます。
ノード間のメッセージのやり取りは Link で行われます。各 Link は単方向で、複数の Link を張ることで双方向の通信を実現します。

f:id:s_akita:20201202080554p:plain
Class Diagram of Communication Endpoints (仕様書より引用)

各セッションには送信/受信それぞれにチャネル番号が割り当てられます。セッションに割り当てるチャネル番号はモニタリングを容易にするため、未使用の番号を小さい方から割り当てることが推奨されています。やり取りされる各フレームには親チャネルの番号が付与されるため、受信側はどのセッションで受信したメッセージを処理すれば良いか判別することが出来ます。(なお、コネクションを開始する際のチャネル番号は必ず 0 が使用されます。)

f:id:s_akita:20201202090927p:plain
Session & Connection Endpoints (仕様書より引用)

フレーミング

AMQP で扱われるフレームには全部で9種類の Frame Body Type があります。どのタイプがどのエンドポイントで扱われるかは下図のように決まっています。

f:id:s_akita:20201202084601p:plain
Frame Dispatch Table (仕様書より引用)

AMQP フレームは下図のようなレイアウトになっています。フレームは Frame Header、Extended Header、Frame Body からなります。Frame Header にはフレームのサイズ (SIZE)、ワード (この場合 1word = 4byte) 単位でカウントした Frame Body の開始位置 (DOFF)、フレームのフォーマットと目的表すタイプ (TYPE) 、親チャネル番号を示す値 (CHANNEL) が含まれます。Extended Headerは将来的な拡張を目的としたものなので基本的には使用しません。Frame Body には先程述べた Frame Body Type と Payload が含まれます。

f:id:s_akita:20201202084713p:plain
AMQP Frame Layout (仕様書より引用)

まとめ

今回の記事では AMQP 1.0 の Transport についてまとめました。紙面の都合で通信の具体的な手続きや状態遷移等は省略したため、気になった方は是非、参考文献に載せた仕様書の原文を読んでみてください。

次回の記事では引き続き AMQP 1.0 の仕様書に触れていきたいと思います。お楽しみに!

© Sansan, Inc.