zoukankan      html  css  js  c++  java
  • Rabbitmq-topic演示

      在direct演示里,我们的日志系统实现了可选择性的接收日志。但仍旧有一些限制:不能基于多种标准进路由。在一个完整的日志系统中,我们可能不仅要根据日志的严重级别来接收日志,可能需要基于日志的来源来进行路由。

    什么叫日志的来源呢?

      就是引发日志的设备。比如设备auth/cron/kern。我们可以监听来自corn的错误日志,同时也监听kern的所有日志。这使得我们记录日志更加灵活。

    通过topic类型的交换机,我们来演示如何实现这一功能。对于topic交换机的消息的路由键routing key不能任意给定。它必须是一些单词的集合,中间用点号.分割。这些单词可以任意,但通常要体现出消息的特征。一些有效的路由键示例:stock.usd.nyse,nyse.vmw,quick.orange.rabbit。这些路由键可以包含很多单词,但路由键总长度不能超过255个字节。

    绑定键binding key也必须是这种形式。topic路由器背后的逻辑与direct路由器类似:以特定路由键发送的消息将会发送到所有绑定键与之匹配的队列中。但绑定键有两种特殊的情况:
      *(星号)仅代表一个单词
      #(井号)代表任意个单词
    下图可以很好地解释这两个符号的含义:

    对于上图的例子,我们将会发送描述动物的消息。这些消息将会以由三个单词组成的路由键发送。路由键中的第一个单词描述了速度,第二个描述了颜色,第三个描述了物种:<speed>.<colour>.<species>。
    我们创建了三个绑定,Q1的绑定键为*.orange.*,Q2的绑定键有两个,分别是*.*.rabbit和lazy.#。
    上述绑定关系可以描述为:
    ①Q1关注所有颜色为orange的动物。
    ②Q2关注所有的rabbit,以及所有的lazy的动物。
    如果一个消息的路由键是quick.orange.rabbit,那么Q1和Q2都可以接收到,路由键是lazy.orange.elephant的消息同样如此。但是,路由键是quick.orange.fox的消息只会到达Q1,路由键是lazy.brown.fox的消息只会到达Q2。注意,路由键为lazy.pink.rabbit的消息只会到达Q2一次,尽管它匹配了两个绑定键。路由键为quick.brown.fox的消息因为不和任意的绑定键匹配,所以将会被丢弃。
    假如我们不按常理出牌:发送一个路由键只有一个单词或者四个单词的消息,像orange或者quick.orange.male.rabbit,这样的话,这些消息因为不和任意绑定键匹配,都将会丢弃。但是,lazy.orange.male.rabbit消息因为和lazy.#匹配,所以会到达Q2,尽管它包含四个单词。
     
    Topic exchange
      Topic exchange非常强大,可以实现其他任意路由器的功能。
      当一个队列以绑定键#绑定,它将会接收到所有的消息,而无视路由键(实际是绑定键#匹配了任意的路由键)。----这和fanout路由器一样了。
      当*#这两个特殊的字符不出现在绑定键中,Topic exchange就会和direct exchange类似了。
     
    Coding案例:现在将日志系统使用topic交换机,并假设所有日志消息以两个单词<facility>.<severity>为路由键。
     
    生产者:EmitLogTopic

    消费者:ReceiveLogsTopic

    测试参数:日志严重级别info/warn/crit...和设备auth/cron/kern...

    测试步骤: 

    消费者:
      将String bingingKeys[] = {""}改为String bingingKeys[] = {"#"},启动第一个消费者;
      再改为String bingingKeys[] = {"kern.*"},启动第二个消费者;
      再改为String bingingKeys[] = {"*.critical"},启动第三个消费者;
      再改为String bingingKeys[] = {"kern.*", "*.critical"},启动第四个消费者。

    生产者,发送多个消息,如:
      路由键为kern.critical 的消息:A critical kernel error
      路由键为kern.info 的消息:A kernel info
      路由键为kern.warn 的消息:A kernel warning
      路由键为auth.critical 的消息:A critical auth error
      路由键为cron.warn 的消息:A cron waning
      路由键为cron.critical 的消息:A critical cron error

    试试最后的结果:第一个消费者将会接收到所有的消息,第二个消费者将会kern的所有严重级别的日志,第三个消费者将会接收到所有设备的critical消息,第四个消费者将会接收到kern设备的所有消息和所有critical消息。


  • 相关阅读:
    could not read data from '/Users/lelight/Desktop/ViewControllerLife/ViewControllerLife/Info.plist': The file “Info.plist” couldn’t be opened because there is no such file.
    NSNotification 消息通知的3种方式
    按钮点击播放音效
    字符串变枚举变量
    Flutter的使用教学笔记
    UI控件的位置
    博客园大佬主页跳转
    retain, copy, assign区别
    OC自定义文档头部注释
    OC语言自定义打印
  • 原文地址:https://www.cnblogs.com/zhangbLearn/p/9559336.html
Copyright © 2011-2022 走看看