成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

【譯】RabbitMQ系列(五) - 主題模式

pingan8787 / 1173人閱讀

摘要:主題模式在上一章我們改進(jìn)了我們的日志系統(tǒng),如果使用我們只能簡(jiǎn)單進(jìn)行廣播,而使用則允許消費(fèi)者可以進(jìn)行一定程度的選擇。為的會(huì)同時(shí)發(fā)布到這兩個(gè)。當(dāng)為時(shí),會(huì)接收所有的。當(dāng)中沒(méi)有使用通配符和時(shí),的行為和一致。

主題模式

在上一章我們改進(jìn)了我們的日志系統(tǒng),如果使用fanout我們只能簡(jiǎn)單進(jìn)行廣播,而使用direct則允許消費(fèi)者可以進(jìn)行一定程度的選擇。但是direct還是有其局限性,其路由不支持多個(gè)條件。

在我們的日志系統(tǒng)中,消費(fèi)者程序可能不止是基于日志的severity,同時(shí)也想基于發(fā)送日志的源系統(tǒng)。你可能知道linux的syslog工具,它就是同時(shí)基于severity(info/warn/crit...)和功能(auth/cron/kern...).

這就提供了很大的靈活性-我們想接收來(lái)自cron的嚴(yán)重錯(cuò)誤日志和kern的所有日志。

下面我們就使用更復(fù)雜的topic來(lái)改進(jìn)我們的日志系統(tǒng)。

Topic exchange

發(fā)送到topic類(lèi)型exchange的message不可以具有模糊的routing_key,它必須具有以冒號(hào)分割的詞。就像"stock.usd.nyse","nyse.vmw","quick.orange.rabbit"等,限制長(zhǎng)度255字節(jié)。

binding key也采用相似的形勢(shì)。topic exchange的邏輯和direct相似,通過(guò)比較message的routing key和bind的binding key,來(lái)匹配轉(zhuǎn)發(fā)的queue。但是topic的binding支持通配符:

” * “表示任何一個(gè)詞

” # “ 表示0或1個(gè)詞


通過(guò)上面圖示的場(chǎng)景來(lái)解釋會(huì)比較好理解。

例子中我們將發(fā)送描述動(dòng)物的message。message會(huì)攜帶routing key(包含三個(gè)詞),第一個(gè)詞表示speed,第二個(gè)表示color,第三個(gè)表示species"..".

創(chuàng)建了三個(gè)綁定:Q1的binding key是”*.orange.*" Q2的binding key是“*.*.rabbit”和 "lazy.#".

以文字表述便是:

Q1 關(guān)心所有橘色的動(dòng)物

Q2 關(guān)心所有的rabbit和所有的lazy動(dòng)物

routing key為“quick.orange.rabbit"的message會(huì)同時(shí)發(fā)布到這兩個(gè)queue。
routing key為"lazy.orange.elephant"的message會(huì)同時(shí)發(fā)布到這兩個(gè)queue。
routing key為”quick.orange.fox“只會(huì)發(fā)布到第一個(gè)queue.
routing key為”lazy.brown.fox"的message只會(huì)發(fā)布到第二個(gè)queue.
routing key為"lazy.pink.rabbit"的message雖然滿(mǎn)足Q2的兩個(gè)條件,但也只會(huì)發(fā)布到Q2一次。
routing key為"quick.brown.fox"的message沒(méi)有任何匹配,就會(huì)被丟失。

如果我們發(fā)送的message只有一個(gè)word或者多余三個(gè)word,如"orange"或者"quick.orange.male.rabbit"會(huì)發(fā)生什么呢?這些message不會(huì)匹配任何binding key,均會(huì)被丟棄掉。

另外"lazy.orange.male.rabbit"雖然具有四個(gè)詞,但是會(huì)匹配最后的binding key,而被發(fā)送到第二個(gè)queue。

Topic exhange非常強(qiáng)大,同時(shí)可以模仿其他兩種類(lèi)型的exchange。當(dāng)binding key為 # 時(shí),queue會(huì)接收所有的message。當(dāng)binding key中沒(méi)有使用通配符(* 和 #)時(shí),topic的行為和direct一致。
開(kāi)始執(zhí)行

我們將在日志系統(tǒng)中使用topic exchange。我們的routding key采用兩個(gè)詞 ".".
EmitLogTopic.java的代碼如下:

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

public class EmitLogTopic {

  private static final String EXCHANGE_NAME = "topic_logs";

  public static void main(String[] argv) throws Exception {
    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("localhost");
    try (Connection connection = factory.newConnection();
         Channel channel = connection.createChannel()) {

        channel.exchangeDeclare(EXCHANGE_NAME, "topic");

        String routingKey = getRouting(argv);
        String message = getMessage(argv);

        channel.basicPublish(EXCHANGE_NAME, routingKey, null, message.getBytes("UTF-8"));
        System.out.println(" [x] Sent "" + routingKey + "":"" + message + """);
    }
  }
  //..
}

ReceiveLogsTopic.java的代碼如下:

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;

public class ReceiveLogsTopic {

  private static final String EXCHANGE_NAME = "topic_logs";

  public static void main(String[] argv) throws Exception {
    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("localhost");
    Connection connection = factory.newConnection();
    Channel channel = connection.createChannel();

    channel.exchangeDeclare(EXCHANGE_NAME, "topic");
    String queueName = channel.queueDeclare().getQueue();

    if (argv.length < 1) {
        System.err.println("Usage: ReceiveLogsTopic [binding_key]...");
        System.exit(1);
    }

    for (String bindingKey : argv) {
        channel.queueBind(queueName, EXCHANGE_NAME, bindingKey);
    }

    System.out.println(" [*] Waiting for messages. To exit press CTRL+C");

    DeliverCallback deliverCallback = (consumerTag, delivery) -> {
        String message = new String(delivery.getBody(), "UTF-8");
        System.out.println(" [x] Received "" +
            delivery.getEnvelope().getRoutingKey() + "":"" + message + """);
    };
    channel.basicConsume(queueName, true, deliverCallback, consumerTag -> { });
  }
}

編譯

javac -cp $CP ReceiveLogsTopic.java EmitLogTopic.java

接收所有日志

java -cp $CP ReceiveLogsTopic "#"

接收功能"kern"的日志

java -cp $CP ReceiveLogsTopic "kern.*"

接收嚴(yán)重級(jí)別日志

java -cp $CP ReceiveLogsTopic "*.critical"

接收者使用兩個(gè)綁定條件

java -cp $CP ReceiveLogsTopic "kern.*" "*.critical"

發(fā)送日志message

java -cp $CP EmitLogTopic "kern.critical" "A critical kernal error"

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/73916.html

相關(guān)文章

  • RabbitMQ系列(四) - 路由模式

    摘要:路由模式在之前的文章中我們建立了一個(gè)簡(jiǎn)單的日志系統(tǒng)。更形象的表示,如對(duì)中的感興趣。為了進(jìn)行說(shuō)明,像下圖這么來(lái)設(shè)置如圖,可以看到有兩個(gè)綁到了類(lèi)型為的上。如圖的設(shè)置中,一個(gè)為的就會(huì)同時(shí)發(fā)送到和。接收程序可以選擇要接收日志的嚴(yán)重性級(jí)別。 路由模式 在之前的文章中我們建立了一個(gè)簡(jiǎn)單的日志系統(tǒng)。我們可以通過(guò)這個(gè)系統(tǒng)將日志message廣播給很多接收者。 在本篇文章中,我們?cè)谶@之上,添加一個(gè)新的功...

    liuchengxu 評(píng)論0 收藏0
  • 白話(huà)RabbitMQ(): 主題路由器(Topic Exchange)

    摘要:推廣專(zhuān)題講座開(kāi)源項(xiàng)目我們利用消息隊(duì)列實(shí)現(xiàn)了分布式事務(wù)的最終一致性解決方案,請(qǐng)大家圍觀。主題交換機(jī)也可以當(dāng)成其它交換機(jī)來(lái)使用,假如隊(duì)列綁定到了那么它會(huì)接收所有的消息,就像廣播路由器一樣而如果未使用,那么就跟直達(dá)路由器一樣了。 推廣 RabbitMQ專(zhuān)題講座 https://segmentfault.com/l/15... CoolMQ開(kāi)源項(xiàng)目 我們利用消息隊(duì)列實(shí)現(xiàn)了分布式事務(wù)的最終一致性...

    Gilbertat 評(píng)論0 收藏0
  • RabbitMQ系列(二)-Work模式

    摘要:每個(gè)消費(fèi)者會(huì)得到平均數(shù)量的。為了確保不會(huì)丟失,采用確認(rèn)機(jī)制。如果中斷退出了關(guān)閉了,關(guān)閉了,或是連接丟失了而沒(méi)有發(fā)送,會(huì)認(rèn)為該消息沒(méi)有完整的執(zhí)行,會(huì)將該消息重新入隊(duì)。該消息會(huì)被發(fā)送給其他的。當(dāng)消費(fèi)者中斷退出,會(huì)重新分派。 Work模式 原文地址showImg(https://segmentfault.com/img/bVbqlXr?w=694&h=252); 在第一章中,我們寫(xiě)了通過(guò)一個(gè)...

    lcodecorex 評(píng)論0 收藏0
  • RabbitMQ系列(三) - 發(fā)布/訂閱模式

    摘要:發(fā)布訂閱模式在之前的文章里,創(chuàng)建了。我們稱(chēng)之為發(fā)布訂閱模式。其實(shí)我們是用到了默認(rèn)的,用空字符串來(lái)標(biāo)識(shí)??兆址砹藳](méi)有名字的被路由到了由指定名字的。和這種關(guān)系的建立我們稱(chēng)之為從現(xiàn)在開(kāi)始這個(gè)就會(huì)將推向我們的隊(duì)列了。 發(fā)布訂閱模式 在之前的文章里,創(chuàng)建了work queue。work queue中,每一個(gè)task都會(huì)派發(fā)給一個(gè)worker。在本章中,我們會(huì)完成完全不一樣的事情 - 我們會(huì)...

    WrBug 評(píng)論0 收藏0
  • RabbitMQ系列(六)-RPC模式

    摘要:如果涉及返回值,就要用到本章提到的了。方法發(fā)送請(qǐng)求,并阻塞知道結(jié)果返回。當(dāng)有消息時(shí),進(jìn)行計(jì)算并通過(guò)指定的發(fā)送給客戶(hù)端。當(dāng)接收到,則檢查。如果和之前的匹配,則將消息返回給應(yīng)用進(jìn)行處理。 RPC模式 在第二章中我們學(xué)習(xí)了如何使用Work模式在多個(gè)worker之間派發(fā)時(shí)間敏感的任務(wù)。這種情況是不涉及到返回值的,worker執(zhí)行任務(wù)就好。如果涉及返回值,就要用到本章提到的RPC(Remote ...

    894974231 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<