一架梯子,一头程序猿,仰望星空!
RabbitMQ教程 > 内容正文

Golang RabbitMQ主题模式(Topic)


Golang RabbitMQ主题(topic)模式,跟路由模式(Direct)类似,最大的区别就是主题模式的路由参数支持模糊匹配,主题模式的交换机类型为:topic。

主题模式架构如下:
RabbitMQ主题模式

提示:不了解RabbitMQ主题模式,请先阅读RabbitMQ主题模式章节。

1.前置教程

请先按顺序阅读下面章节

说明:因为Golang RabbitMQ发布订阅章节,已经包含完整的代码样例,其他RabbitMQ模式,仅仅是交换机的定义和路由参数不一样,所以仅展示关键代码。

2.声明Topic交换机

err = ch.ExchangeDeclare(
  "tizi365_topic", // 交换机名字,需要唯一
  "topic",      // 交换机类型
  true,          // 是否持久化
  false,         // auto-deleted
  false,         // internal
  false,         // no-wait
  nil,           // arguments
)

3.发送消息

    // 消息内容
    body := "Hello Tizi365.com!"

    // 推送消息
    err = ch.Publish(
        "tizi365_topic",     // exchange(交换机名字)
        "www.tizi365.com", // 路由参数,关键参数,决定你的消息会发送到那个队列。
        false,  // mandatory
        false,  // immediate
        amqp.Publishing {
            ContentType: "text/plain", // 消息内容类型,这里是普通文本
            Body:        []byte(body),  // 消息内容
        })

4.消费消息

4.1.绑定交换机

// 声明需要操作的队列
    q, err := ch.QueueDeclare(
        "",    // 队列名字,不填则随机生成一个
        false, // 是否持久化队列
        false, // delete when unused
        true,  // exclusive
        false, // no-wait
        nil,   // arguments
    )

    // 队列绑定指定的交换机
    err = ch.QueueBind(
        q.Name, // 队列名
        "*.tizi365.com",     // 路由参数,关键参数,使用了通配符 * 星号,匹配一个单词,如果使用 # 井号可以匹配多个单词.
        "tizi365_topic", // 交换机名字,需要跟消息发送端定义的交换器保持一致
        false,
        nil)

4.2.处理消息

// 创建消费者
    msgs, err := ch.Consume(
        q.Name, // 引用前面的队列名
        "",     // 消费者名字,不填自动生成一个
        true,   // 自动向队列确认消息已经处理
        false,  // exclusive
        false,  // no-local
        false,  // no-wait
        nil,    // args
    )

    // 循环消费队列中的消息
    for d := range msgs {
        log.Printf("接收消息=%s", d.Body)
    }

推荐教程