GolangのRabbitMQのトピックモードは、ルーティングモード(Direct)と似ていますが、トピックモードの最大の違いは、トピックモード内のルーティングパラメータが曖昧な一致をサポートしていることです。トピックモードの交換タイプは 'topic' です。
トピックモードのアーキテクチャは以下の通りです:
注: もしRabbitMQトピックモードについての詳細を知りたい場合は、ますはRabbitMQトピックモードセクションをお読みください。
1. 前提チュートリアル
以下のセクションを順番にお読みください:
- RabbitMQ基本コンセプトセクション
- RabbitMQトピックモードセクション
- Golang RabbitMQパブリッシュ/サブスクライブパターンの実装セクション
注: Golang RabbitMQパブリッシュ/サブスクライブセクションにはすでに完全なコード例が含まれているため、他のRabbitMQモードと異なるのは交換の定義とルーティングパラメータのみです。そのため、キーコードのみを示します。
2. トピック交換を宣言する
err = ch.ExchangeDeclare(
"tizi365_topic", // 交換名、ユニークである必要があります
"topic", // 交換タイプ
true, // 永続化
false, // 自動削除
false, // 内部用途
false, // No-wait
nil, // 引数
)
3. メッセージの送信
// メッセージの内容
body := "こんにちは、Tizi365.com!"
// メッセージを送信
err = ch.Publish(
"tizi365_topic", // 交換名
"www.tizi365.com", // ルーティングパラメータ、あなたのメッセージが送信されるキューを決定する重要なパラメータ
false, // 強制
false, // 直ちに
amqp.Publishing {
ContentType: "text/plain", // メッセージのコンテンツタイプ、ここではプレーンテキスト
Body: []byte(body), // メッセージの内容
})
4. メッセージの消費
4.1. 交換をバインドする
// 操作するキューを宣言
q, err := ch.QueueDeclare(
"", // キュー名、指定されていない場合、ランダムに生成されます
false, // 永続化されるかどうか
false, // 未使用時に削除
true, // 排他的
false, // No-wait
nil, // 引数
)
// キューを指定の交換にバインド
err = ch.QueueBind(
q.Name, // キュー名
"*.tizi365.com", // ルーティングパラメータ、ワイルドカード*を使用して1つの単語に一致させ、#を使用すると複数の単語に一致させる
"tizi365_topic", // 送信者が定義した交換名と一致する必要があります
false,
nil)
4.2. メッセージの処理
// コンシューマを作成
msgs, err := ch.Consume(
q.Name, // 上記のキュー名の参照
"", // コンシューマ名、指定されていない場合は自動的に生成されます
true, // メッセージの処理を自動でキューに確認する
false, // 排他的
false, // No-local
false, // No-wait
nil, // 引数
)
// キュー内のメッセージをイテレート処理
for d := range msgs {
log.Printf("受信したメッセージ=%s", d.Body)
}