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

  • 相关阅读:
    算法5--排序
    算法4---数组
    算法3---字符串
    算法2---链表4---单循环链表
    wcf精通1-15
    框架技术细节
    Achieving High Availability and Scalability
    Windows平台下利用APM来做负载均衡方案
    Windows平台分布式架构实践
    web api control注册及重写DefaultHttpControllerSelector、ApiControllerActionSelector、ApiControllerActionInvoker
  • 原文地址:https://www.cnblogs.com/HuangLiang/p/EasyNetQ_Topic_Based_Routing.html
Copyright © 2011-2022 走看看