国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【RabbitMQ】golang客戶端教程5——使用topic交換器

這篇具有很好參考價(jià)值的文章主要介紹了【RabbitMQ】golang客戶端教程5——使用topic交換器。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

topic交換器(主題交換器)

發(fā)送到topic交換器的消息不能具有隨意的routing_key——它必須是單詞列表,以點(diǎn)分隔。這些詞可以是任何東西,但通常它們指定與消息相關(guān)的某些功能。一些有效的routing_key示例:“stock.usd.nyse”“nyse.vmw”,“quick.orange.rabbit”routing_key中可以包含任意多個(gè)單詞,最多255個(gè)字節(jié)。

綁定鍵也必須采用相同的形式。topic交換器背后的邏輯類似于direct交換器——用特定路由鍵發(fā)送的消息將傳遞到所有匹配綁定鍵綁定的隊(duì)列。但是,綁定鍵有兩個(gè)重要的特殊情況: - *(星號(hào))可以代替一個(gè)單詞。 - #(井號(hào))可以替代零個(gè)或多個(gè)單詞。

通過(guò)下面這個(gè)示例可以很容易看明白這一點(diǎn):

【RabbitMQ】golang客戶端教程5——使用topic交換器,RabbitMQ,rabbitmq,golang,中間件,后端
在這個(gè)例子中,我們將發(fā)送一些都是描述動(dòng)物的信息。將使用包含三個(gè)詞(兩個(gè)點(diǎn))的路由密鑰發(fā)送消息。路由鍵中的第一個(gè)單詞將描述速度,第二個(gè)是顏色,第三個(gè)是種類:“<speed>.<colour>.<species>”

我們創(chuàng)建了三個(gè)綁定關(guān)系:Q1與綁定鍵“ * .orange. * ”綁定,Q2與“* .* .rabbit”和“l(fā)azy.#”綁定。

這些綁定可以總結(jié)為:

  • Q1對(duì)所有橙色動(dòng)物都感興趣
  • Q2想接收有關(guān)兔子(rabbit)的一切消息,以及有關(guān)懶惰(lazy)動(dòng)物的一切消息。

路由鍵設(shè)置為“quick.orange.rabbit”的消息將傳遞到兩個(gè)隊(duì)列。消息“l(fā)azy.orange.elephant”也將發(fā)送給他們兩個(gè)。另一方面,“quick.orange.fox”將僅進(jìn)入第一個(gè)隊(duì)列,而“l(fā)azy.brown.fox”將僅進(jìn)入第二個(gè)隊(duì)列。即使“l(fā)azy.pink.rabbit”與兩個(gè)綁定匹配(匹配Q2的兩個(gè)綁定),也只會(huì)傳遞到第二個(gè)隊(duì)列一次。 “quick.brown.fox”與任何綁定都不匹配,因此將被丟棄。

如果我們打破約定并發(fā)送一個(gè)或四個(gè)單詞的消息,例如“orange”“quick.orange.male.rabbit”,會(huì)發(fā)生什么?好吧,這些消息將不匹配任何綁定,并且將會(huì)丟失。

另外,“l(fā)azy.orange.male.rabbit”即使有四個(gè)單詞,也將匹配最后一個(gè)綁定,并將其傳送到第二個(gè)隊(duì)列。

topic交換器

topic交換器功能強(qiáng)大,可以像其他交換器一樣運(yùn)行。

當(dāng)隊(duì)列用“#”(井號(hào))綁定鍵綁定時(shí),它將接收所有消息,而與路由鍵無(wú)關(guān),就像在fanout交換器中一樣。

當(dāng)在綁定中不使用特殊字符“*”(星號(hào))和“#”(井號(hào))時(shí),topic交換器的行為就像direct交換器一樣。

完整示例

我們將在日志記錄系統(tǒng)中使用topic交換器。我們將從一個(gè)可行的假設(shè)開(kāi)始,即日志的路由鍵將包含兩個(gè)詞:“<facility>.<severity>”。

emit_log_topic.go的代碼:

package main

import (
        "log"
        "os"
        "strings"

        "github.com/streadway/amqp"
)

func failOnError(err error, msg string) {
        if err != nil {
                log.Fatalf("%s: %s", msg, err)
        }
}

func main() {
        conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
        failOnError(err, "Failed to connect to RabbitMQ")
        defer conn.Close()

        ch, err := conn.Channel()
        failOnError(err, "Failed to open a channel")
        defer ch.Close()

        err = ch.ExchangeDeclare(
                "logs_topic", // name
                "topic",      // type
                true,         // durable
                false,        // auto-deleted
                false,        // internal
                false,        // no-wait
                nil,          // arguments
        )
        failOnError(err, "Failed to declare an exchange")

        body := bodyFrom(os.Args)
        err = ch.Publish(
                "logs_topic",          // exchange
                severityFrom(os.Args), // routing key
                false, // mandatory
                false, // immediate
                amqp.Publishing{
                        ContentType: "text/plain",
                        Body:        []byte(body),
                })
        failOnError(err, "Failed to publish a message")

        log.Printf(" [x] Sent %s", body)
}

func bodyFrom(args []string) string {
        var s string
        if (len(args) < 3) || os.Args[2] == "" {
                s = "hello"
        } else {
                s = strings.Join(args[2:], " ")
        }
        return s
}

func severityFrom(args []string) string {
        var s string
        if (len(args) < 2) || os.Args[1] == "" {
                s = "anonymous.info"
        } else {
                s = os.Args[1]
        }
        return s
}

receive_logs_topic.go 的代碼:

package main

import (
        "log"
        "os"

        "github.com/streadway/amqp"
)

func failOnError(err error, msg string) {
        if err != nil {
                log.Fatalf("%s: %s", msg, err)
        }
}

func main() {
        conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
        failOnError(err, "Failed to connect to RabbitMQ")
        defer conn.Close()

        ch, err := conn.Channel()
        failOnError(err, "Failed to open a channel")
        defer ch.Close()

        err = ch.ExchangeDeclare(
                "logs_topic", // name
                "topic",      // type
                true,         // durable
                false,        // auto-deleted
                false,        // internal
                false,        // no-wait
                nil,          // arguments
        )
        failOnError(err, "Failed to declare an exchange")

        q, err := ch.QueueDeclare(
                "",    // name
                false, // durable
                false, // delete when unused
                true,  // exclusive
                false, // no-wait
                nil,   // arguments
        )
        failOnError(err, "Failed to declare a queue")

        if len(os.Args) < 2 {
                log.Printf("Usage: %s [binding_key]...", os.Args[0])
                os.Exit(0)
        }
  			// 綁定topic
        for _, s := range os.Args[1:] {
                log.Printf("Binding queue %s to exchange %s with routing key %s",
                        q.Name, "logs_topic", s)
                err = ch.QueueBind(
                        q.Name,       // queue name
                        s,            // routing key
                        "logs_topic", // exchange
                        false,
                        nil)
                failOnError(err, "Failed to bind a queue")
        }

        msgs, err := ch.Consume(
                q.Name, // queue
                "",     // consumer
                true,   // auto ack
                false,  // exclusive
                false,  // no local
                false,  // no wait
                nil,    // args
        )
        failOnError(err, "Failed to register a consumer")

        forever := make(chan bool)

        go func() {
                for d := range msgs {
                        log.Printf(" [x] %s", d.Body)
                }
        }()

        log.Printf(" [*] Waiting for logs. To exit press CTRL+C")
        <-forever
}

想要接收所有的日志:

go run receive_logs_topic.go "#"

要從“kern”接收所有日志:

go run receive_logs_topic.go "kern.*"

或者,如果你只想接收“critical”日志:

go run receive_logs_topic.go "*.critical"

你可以創(chuàng)建多個(gè)綁定:

go run receive_logs_topic.go "kern.*" "*.critical"

并發(fā)出帶有路由鍵“kern.critical”的日志:

go run emit_log_topic.go "kern.critical" "A critical kernel error"

你可以自己嘗試玩一下這個(gè)程序。請(qǐng)注意,代碼沒(méi)有對(duì)路由鍵或綁定鍵進(jìn)行任何假設(shè),你可能希望使用兩個(gè)以上的路由鍵參數(shù)。

源自:https://www.rabbitmq.com/getstarted.html文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-634730.html

到了這里,關(guān)于【RabbitMQ】golang客戶端教程5——使用topic交換器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 使用Kafka客戶端(spring-kafka)的Java API操作Kafka的Topic

    記錄 :458 場(chǎng)景 :在Spring Boot微服務(wù)集成Kafka客戶端spring-kafka-2.8.2操作Kafka的Topic的創(chuàng)建和刪除。 版本 :JDK 1.8,Spring?Boot 2.6.3,kafka_2.12-2.8.0,spring-kafka-2.8.2。 Kafka安裝 :https://blog.csdn.net/zhangbeizhen18/article/details/129071395 1.微服務(wù)中 配置Kafka信息 1.1在pom.xml添加依賴 pom.xml文件: 解析

    2024年02月09日
    瀏覽(21)
  • rabbitmq筆記-rabbitmq客戶端開(kāi)發(fā)使用

    1.創(chuàng)建ConnectionFactory,給定參數(shù)ip地址,端口號(hào),用戶名和密碼等 2.創(chuàng)建ConnectionFactory,使用uri方式實(shí)現(xiàn),創(chuàng)建channel。 注意: Connection可以用來(lái)創(chuàng)建多個(gè)channel實(shí)例,但channel實(shí)例不能在線程間共享,應(yīng)用程序?yàn)槊總€(gè)線程開(kāi)辟一個(gè)channel。多線程間共享channel實(shí)例是非線程安全的。

    2024年02月11日
    瀏覽(41)
  • 自定義kafka客戶端消費(fèi)topic

    使用自定義的KafkaConsumer給spring進(jìn)行管理,之后在注入topic的set方法中,開(kāi)單線程主動(dòng)訂閱和讀取該topic的消息。 后端服務(wù)不需要啟動(dòng)時(shí)就開(kāi)始監(jiān)聽(tīng)消費(fèi),而是根據(jù)啟動(dòng)的模塊或者用戶自定義監(jiān)聽(tīng)需要監(jiān)聽(tīng)或者停止的topic 使用的spring集成2.1.8.RELEASE的版本,在@KafkaListener注解中沒(méi)

    2024年02月02日
    瀏覽(19)
  • (四)「消息隊(duì)列」之 RabbitMQ 路由(使用 .NET 客戶端)

    (四)「消息隊(duì)列」之 RabbitMQ 路由(使用 .NET 客戶端)

    先決條件 本教程假設(shè) RabbitMQ 已安裝并且正在 本地主機(jī) 的標(biāo)準(zhǔn)端口( 5672 )上運(yùn)行。如果您使用了不同的主機(jī)、端口或憑證,則要求調(diào)整連接設(shè)置。 獲取幫助 如果您在閱讀本教程時(shí)遇到問(wèn)題,可以通過(guò)郵件列表或者 RabbitMQ 社區(qū) Slack 與 RabbitMQ 官方取得聯(lián)系。 在上一篇教程中

    2024年02月17日
    瀏覽(21)
  • (五)「消息隊(duì)列」之 RabbitMQ 主題(使用 .NET 客戶端)

    (五)「消息隊(duì)列」之 RabbitMQ 主題(使用 .NET 客戶端)

    先決條件 本教程假設(shè) RabbitMQ 已安裝并且正在 本地主機(jī) 的標(biāo)準(zhǔn)端口( 5672 )上運(yùn)行。如果您使用了不同的主機(jī)、端口或憑證,則要求調(diào)整連接設(shè)置。 獲取幫助 如果您在閱讀本教程時(shí)遇到問(wèn)題,可以通過(guò)郵件列表或者 RabbitMQ 社區(qū) Slack 與 RabbitMQ 官方取得聯(lián)系。 在上一篇教程中

    2024年02月16日
    瀏覽(16)
  • Golang筆記:使用ssh包作為客戶端與SSH服務(wù)器交互

    Golang筆記:使用ssh包作為客戶端與SSH服務(wù)器交互

    Golang中可以使用 golang.org/x/crypto/ssh 包作為SSH客戶端或者SSH服務(wù)使用。這篇文章將簡(jiǎn)單記錄下作為客戶端使用的一些內(nèi)容。 Package ssh implements an SSH client and server. 作為客戶端與SSH服務(wù)器操作上來(lái)說(shuō)主要分為三步: 使用一定的參數(shù)與SSH服務(wù)器建立連接得到 Client 對(duì)象; 在 Client 之

    2024年02月09日
    瀏覽(27)
  • (七)「消息隊(duì)列」之 RabbitMQ 發(fā)布者確認(rèn)(使用 .NET 客戶端)

    (七)「消息隊(duì)列」之 RabbitMQ 發(fā)布者確認(rèn)(使用 .NET 客戶端)

    發(fā)布者確認(rèn) 是一個(gè) RabbitMQ 擴(kuò)展,用于實(shí)現(xiàn)可靠的發(fā)布。當(dāng)在通道上啟用發(fā)布者確認(rèn)時(shí),客戶端發(fā)布的消息將由代理 異步確認(rèn) ,這意味著它們已在服務(wù)器端得到處理。 先決條件 本教程假設(shè) RabbitMQ 已安裝并且正在 本地主機(jī) 的標(biāo)準(zhǔn)端口( 5672 )上運(yùn)行。如果您使用了不同的主

    2024年02月16日
    瀏覽(19)
  • Golang編寫(xiě)客戶端SDK,并開(kāi)源發(fā)布包到GitHub,供其他項(xiàng)目import使用

    Golang編寫(xiě)客戶端SDK,并開(kāi)源發(fā)布包到GitHub,供其他項(xiàng)目import使用

    如果希望其他項(xiàng)目能夠使用該SDK,可以將該SDK打包為一個(gè)Go模塊,并將其發(fā)布到Go模塊倉(cāng)庫(kù)中。這將使其他項(xiàng)目能夠通過(guò)Go的模塊依賴機(jī)制來(lái)使用該SDK??梢暂p松地引用和使用你的代碼。 登錄到你的 GitHub 帳戶。 在 GitHub 主頁(yè)點(diǎn)擊右上角的加號(hào)(+),然后選擇 “New repository”(

    2024年02月09日
    瀏覽(29)
  • Trojan客戶端使用教程

    此教程使用的是 Centos7 x86_64系統(tǒng) 使用此命令下載Trojan客戶端 官方版本(GitHub): cd /usr/src wget https://github.com/trojan-gfw/trojan/releases/download/v1.15.1/trojan-1.15.1-linux-amd64.tar.xz 解壓Trojan文件 tar xvf trojan-1.15.1-linux-amd64.tar.xz 打開(kāi)配置文件 cd /usr/src/trojan vi config.json 按i進(jìn)入編輯模式 run_typ

    2024年02月02日
    瀏覽(31)
  • SVN客戶端使用教程

    SVN客戶端使用教程

    正式進(jìn)入公司項(xiàng)目后,我們需要和同事進(jìn)行協(xié)同開(kāi)發(fā),此時(shí)代碼管理工具是必不可少的,目前常用的兩款工具是:SVN 和 Git。本人因?yàn)橐罱ㄒ粋€(gè)自動(dòng)化測(cè)試的框架,對(duì)SVN和Git都不熟悉,在調(diào)研后選擇了操作更為簡(jiǎn)單的代碼管理工具:SVN。 SVN是什么? 全稱Subversion,屬于集中

    2024年02月08日
    瀏覽(27)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包