zoukankan      html  css  js  c++  java
  • 9-EasyNetQ之基于主题的路由

    RabbitMQ有一个很酷的功能,基于主题的路由,这个功能允许订阅者基于多个条件去过滤消息。一个主题是由点号分隔的单词列表,随消息一同发布。例如:“stock.usd.nyse” 或 "book.uk.london" 或 "a.b.c",这些可以是任何你喜欢的单词,但通常是一些消息的属性。主题字符串限制最多255个字符。

    去发布一个主题,简单的通过使用带主题参数的Publish重载方法"

    bus.Publish(message,"X.A");
    

    订阅者能通过指定一个主题去匹配来过滤消息。这些可以包含通配符。

    • *(星号)只能匹配一个词。
    • (井号)能匹配0到多个词。

    这样一个消息被发布带有一个“X.A.2”的主题,将匹配“#”,“X.#”, ".A.", 但是不能匹配“X.B”或“A”。去订阅一个主题,使用带配置的SubScribe重载方法。

    bus.Subscribe("my_id", handler, 
        x=>x.WithTopic("X.*"));
    

    警告:带有相同subscriberId的两个独立订阅,但用了不同主题字符串,可能不会有你预期的效果。一个subscriberId实际上是去识别一个独立的AMQP队列。带有相同subscriberId的两个订阅者将同时连接到同一个队列,同时将添加他们自己主题Binding。例如,假如你这样做:

    bus.Subscribe("my_id",handlerOfXDotStar,
        x=>x.WithTopic("X.*"));
    bus.Subscribe("my_id",handlerOfStarDotB,
        x=>x.WithTopic(*.B));
    

    所以可以匹配“X.”或“.B”的消息都将发送到“XXX_My_id”队列。RabbitMQ然后轮流在两个消费者之间投递消息。handlerOfXDotStar和handlerOfStarDotB会依次轮流得到消息。

    现在,如果你想匹配多个主题("X."或者“.B”)你可以使用另外一个带多个主题参数的Subscribe重载方法,像下面这样:

    bus.Subscribe("my_id",handler, 
        x=>x.WithTopic("X.*").WithTopic("*.B"));
    

    这些主题重载也适用于SubscribeAsync方法。

    关于主题的更多警告,请看这篇博客Topic Confusion,不过要注意,示例代码使用了老版本的API,在你调用Publish方法之前,必须要打开publish管道。

    英文地址:https://github.com/EasyNetQ/EasyNetQ/wiki/Topic-Based-Routing
    本文地址:http://www.cnblogs.com/HuangLiang/p/EasyNetQ_Topic_Based_Routing.html

  • 相关阅读:
    python shutil
    AttributeError: module 'shutil' has no attribute 'copyfileobj'
    python configparser
    JSON使用
    VRRP
    KeepAlived的介绍
    Nginx模块
    Nginx配置
    Nginx介绍
    apache相关补充
  • 原文地址:https://www.cnblogs.com/HuangLiang/p/EasyNetQ_Topic_Based_Routing.html
Copyright © 2011-2022 走看看