rabbitMQ的三种路由模式

rabbitMQ工做流程:正则表达式

一、声明交换机服务器

二、声明消息队列并发

三、绑定交换机和队列ide

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

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

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

 

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

 

上代码:路由

 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

 

 

 三种经常使用路由模式:消息队列

一、Direct

这种模式下,交换机根据routingKey进行彻底匹配。若是匹配失败则丢弃消息。

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

 

二、Fanout

这种模式会彻底忽略routingKey。

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

 

三、Topic

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

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

"*"只匹配当前级别的词,如"person.*"能够匹配"person.name",没法匹配"person.name.jerry"。没法匹配空,如"person"。

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