# AMQP
Advanced Message Queuing Protocol。アプリケーション・システム間でメッセージを内部設計に依存せず受け渡す開放標準として設計された非同期メッセージキューイングプロトコル。金融取引(trading・banking)用途を起源とし、**信頼性・スケーラビリティ・管理性**を最大化する設計選択を取る。Vinoski の IEEE Internet Computing 2006 解説が原典の一つ。(Source: [[@2017__arXiv__A Survey of Distributed Message Broker Queues]])
## アーキテクチャ(John+ 2017 §4, §C)
producer は queue に直接送らず **exchange** に送る。exchange は **binding key** が **routing key** と一致する queue にメッセージを送る。producer/consumer は状態を持たない。
- **コンポーネント**: Broker / Producer / Consumer / Exchange / Queue / Virtual host / Binding / Routing key
## 4 種 exchange
- **direct**: routing key に応じて異なる queue へ送信、consumer 間ロードバランス。
- **topic**: routing key に binding key がマッチする全 queue に送信(pub-sub 実装)。
- **fanout**: routing key を無視して全 binding queue に送信(broadcast)。
- **header**: routing key でなくメッセージヘッダで queue を選ぶ。
## レイテンシ優位の根拠(John+ 2017 §6)
1. **push モデル**(Kafka は pull モデル)。
2. broker 既定で**メッセージをディスク永続化しない**(Kafka は永続化)。
## 耐障害性(§C.3)
queue ごとの **durable** フラグで永続化を制御。delivery mode = 2 で persistent メッセージは broker 再起動後に復元。distributed broker は **cluster** / **federation** / **shovel** の 3 方式で HA・WAN 越え。
## 関連
- ソース: [[@2017__arXiv__A Survey of Distributed Message Broker Queues]]
- 概念: [[分散メッセージブローカ]]
- 比較対象: [[Apache Kafka]]
- 代表実装: [[RabbitMQ]]、Apache Qpid