rabbitMQ的三种路由模式

rabbitMQ工作流程:

1、声明交换机

2、声明消息队列

3、绑定交换机和队列

4、生产者往交换机里发送新消息

5、交换机根据所选的模式和routingKey决定消息发往哪条消息队列

6、一个消费者只能消费一条消息队列

 

(如果重复声明,类型参数不变不会报错。 如果第二次声明和第一次类型参数有变化,会报异常) 

 

上代码:

 1             var factory = new ConnectionFactory();
 2             factory.UserName = "guest";
 3             factory.Password = "guest";
 4             factory.HostName = "127.0.0.1"; //设置RabbitMQ服务器所在的IP或主机名
 5             var connection = factory.CreateConnection();
 6 
 7             using (IModel channel = connection.CreateModel())
 8             {
 9                 //声明一个交换机
10                 channel.ExchangeDeclare(exchange: "exchange1",
11                                         type: ExchangeType.Topic,
12                                         durable: true,
13                                         autoDelete: false,
14                                         arguments: null);
15 
16                 //声明三个消息队列
17                 channel.QueueDeclare(
18                     queue: "q1",
19                     durable: true,
20                     exclusive: false,
21                     autoDelete: false,
22                     arguments: null);
23 
24                 channel.QueueDeclare(
25                     queue: "q2",
26                     durable: true,
27                     exclusive: false,
28                     autoDelete: false,
29                     arguments: null);
30 
31                 channel.QueueDeclare(
32                     queue: "q3",
33                     durable: true,
34                     exclusive: false,
35                     autoDelete: false,
36                     arguments: null);
37 
38                 //用不同的routingKey绑定队列与交换机
39                 channel.QueueBind(queue: "q1",
40                                     exchange: "exchange1",
41                                     routingKey: "person.name.*",
42                                     arguments: null);
43 
44                 channel.QueueBind(queue: "q2",
45                                     exchange: "exchange1",
46                                     routingKey: "person.age.*",
47                                     arguments: null);
48 
49                 channel.QueueBind(queue: "q3",
50                                     exchange: "exchange1",
51                                     routingKey: "person.#",
52                                     arguments: null);
53 
54 
55                 //往交换机中发出一条消息
56                 channel.BasicPublish(
57                         exchange: "exchange1",
58                         routingKey: "person.name.jerry",
59                         basicProperties: null,
60                         body: Encoding.UTF8.GetBytes(msg));   
View Code

 

 

 三种常用路由模式:

1、Direct

这种模式下,交换机根据routingKey进行完全匹配。如果匹配失败则丢弃消息。

例如:绑定的交换机routingKey是"person.name",而使用BasicPublish()方法往交换机发消息时用的"person.name"则匹配成功,将根据交换机名称和routingKey找到绑定的消息队列,并发送新消息。

 

2、Fanout

这种模式会完全忽略routingKey。

只要往交换机1中发送消息,则会广播到与交换机1绑定的所有消息队列。

 

3、Topic

这种模式下可以对routingKey进行模糊匹配,如果匹配失败则丢弃消息,如果匹配多个结果,则往多个结果都发送消息。

类似于正则表达式, 它有两种语法:“*”,"#"

"*"只匹配当前级别的词,如"person.*"可以匹配"person.name",无法匹配"person.name.jerry"。无法匹配空,如"person"。

"#"能匹配多个子级别的词,如"person.#"可以匹配"person.name",也可以匹配"person.name.jerry"。可以匹配空,如"person"。

 

posted on 2018-11-13 17:07  邓绍俊  阅读(1745)  评论(0编辑  收藏  举报

导航