GolangのRabbitMQのトピックモードは、ルーティングモード(Direct)と似ていますが、トピックモードの最大の違いは、トピックモード内のルーティングパラメータが曖昧な一致をサポートしていることです。トピックモードの交換タイプは 'topic' です。

トピックモードのアーキテクチャは以下の通りです: RabbitMQトピックモード

注: もしRabbitMQトピックモードについての詳細を知りたい場合は、ますはRabbitMQトピックモードセクションをお読みください。

1. 前提チュートリアル

以下のセクションを順番にお読みください:

注: 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)
    }