【朝夕技术专刊】RabbitMQ路由解析(上篇)
欢迎大家阅读《朝夕Net社区技术专刊》
我们致力于.NetCore的推广和落地,为更好的帮助大家学习,方便分享干货,特创此刊!很高兴你能成为忠实读者,文末福利不要错过哦!
上篇文章介绍了如何在C#控制台基于RabbitMQ搭建生产者,消费者。这篇文章将会持续进阶RabbitMQ的使用;这里将会给大家聊聊RabbitMQ中的路由;
什么是路由呢?就和你们家里的路由器是一个概念,路由器就是把网络信号做转发、那么RabbitMQ中的路由,就是把消息做转发;在本篇文章中,如果出现图片不清晰的,请关注朝夕教育公众号可获取关于RabbitMQ的视频录播学习;
RabbitMQ一共提供了四种路由:
Ø Direct类型
Ø Fanout类型
Ø Topic类型
Ø Header类型
01PARTDirect类型的路由:
上一篇文章中写的RabbitMQ的基本应用案例中使用的Exchange就是direct类型的,direct类型的exchange路由规则很简单:
exchange在和queue进行binding时会设置routingkey(为了避免和下边的routingKey混淆,很多时候把这里的routingKey叫做BindingKey)
channel.QueueBind(queue:”Q1″,exchange:”myexchange”,routingKey:”orange”);将消息发送到Broker时会设置对应的routingkey:channel.BasicPublish(exchange:”myexchange”,routingKey:”orange”,basicProperties: null, body: body);
只有RoutingKey和BindingKey完全相同时,exchange才会把消息路由到绑定的queue中去。
我们知道了direact类型的交换机只有routingKey和bindingKey相同的时候才会进行消息路由,根据这一特点我们可以通过routingKey将消息路由到不同的queue中。如在进行日志处理时,需求是所有的日志都保存到文本文件,出现错误日志时则还需要短信通知以便及时处理。
我们可以创建两个队列:只接收错误日志的log_error队列和接收所有日志信息的log_all队列。消费者C1处理log_error队列中消息,将这些消息通过短信通知管理员,消费者C2处理log_all队列的信息,将这些信息记录到文本文件。如下图所示:
生产者用于发送日志消息,代码下图所示:
如果图片不清晰,请关注朝夕net社区微信公众号获取视频录播
消费者C1用于处理log_error队列中的消息,错误消息进行短信通知,代码如下:
消费者C2用于处理log_all队列中的消息,所有消息记录到文本文件中,代码下图所示:
生产者,消费者同时运行起来,结果如图6:
02PARTFonout类型的路由:
fanout类型的exchange路由规则是最简单的,交换机会把消息广播到与该Exchange绑定的所有queue中,即所有和该exchange绑定的队列都会收到消息。fanout类型exchange和队列绑定时不需要指定routingKey,即使指定了routingKey也会被忽略掉。路由结构如下图:
fanout类型交换机主要用于发布/订阅的一些场景,如用户注册了我们的网站后,我们通过短信和邮件两种方式通知用户;
代码如下图:
这里通过代码简单演示将消息同时使用短信和邮件两种方式通知用户的流程。首先声明一个fanout类型的exchange,然后声明两个队列 SMSqueue和EMAILqueue,这两个队列都和这个exchange绑定。消费者1处理EMAILqueue的消息,通过邮件方式发送通知;消费者2处理SMSqueue的消息通过短信方式发送通知。
生产者代码:
消费者1将EMAILqueue的消息通过邮件方式发送通知,代码如下图:
消费者2将SMSqueue的消息通过短信方式发送通知,代码如下图:
启动这三个应用程序,执行结果如下图