fanout 多播

在之前都是使用direct直连类型的交换机,通过routingkey来决定把消息推到哪个queue中。

而fanout则是把拿到消息推到与之绑定的所有queue中。

分析业务,怎样的场景需要它呢?某个用户注册了网站的用户,一般我们需要发送短信和邮件通知,莫非要在同一个consumer中把这两件事都做了?这不符合单一职责,可是发送的消息是一样的,只是方式不一样。要使用两种routingkey都发送一次?这显然也不是我们想要的。所以fanout出现了

fanout类型的exchange会把消息推到所有的queue中,所以不需要指定routingkey,指定了也没用!

下面通过代码来看

这里有两种需求,发短信与发邮件

  1. //创建返回一个新的频道
  2. using (var channel = RabbitMqHelper.GetConnection().CreateModel())
  3. {
  4.  
  5. //发布一个消息
  6. var msg = Encoding.UTF8.GetBytes($"二狗子");
  7. //不需要指定routingkey,指定了也没用.因为交换机是fanout类型
  8. channel.BasicPublish("fanoutExchange", routingKey: string.Empty, basicProperties: null, body: msg);
  9.  
  10. Console.Write("发布成功!");
  11.  
  12. }
  13.  
  14. Console.ReadKey();

这里是consumer部分的代码

  1. bool flag = true;
  2. string pattern = "";
  3. while (flag)
  4. {
  5. Console.WriteLine("请选择Ccnsumer模式 1(发短信)/2(发邮件)");
  6. pattern = Console.ReadLine();
  7. if (pattern == "1" || pattern == "2")
  8. flag = false;
  9. else
  10. Console.Write("请做出正确的选择");
  11. }
  12.  
  13. using (var channel = RabbitMqHelper.GetConnection().CreateModel())
  14. {
  15.  
  16. //声明交换机 Fanout模式
  17. channel.ExchangeDeclare("fanoutExchange", ExchangeType.Fanout, true, false, null);
  18. //根据声明使用的队列
  19. var queueName = pattern == "1" ? "sms" : "emai";
  20. channel.QueueDeclare(queueName, true, false, false, null);
  21. //进行绑定
  22. channel.QueueBind(queueName, "fanoutExchange", string.Empty, null);
  23.  
  24. //创建consumbers
  25. var consumer = new EventingBasicConsumer(channel);
  26.  
  27. consumer.Received += (sender, e) =>
  28. {
  29. var msg = Encoding.UTF8.GetString(e.Body);
  30.  
  31. var action = (pattern == "1" ? "发短信" : "发邮件");
  32. Console.WriteLine($"给{msg}{action}");
  33. };
  34.  
  35. //进行消费
  36. channel.BasicConsume(queueName, true, consumer);
  37.  
  38. Console.ReadKey();
  39.  
  40. }

下面把程序运行起来,不同的consumer进行了不同的消费

RabbitMQ Exchange中的fanout类型的更多相关文章

  1. RabbitMQ fanout类型的Exchange

    就目前来说,Exchange是与消息发送端有关的,因为它可以指定将消息发送到哪个或哪些队列中. 本篇文章介绍的fanout类型就是指定将消息群发到与Exchange绑定的所有队列中. fanout这个 ...

  2. RabbitMQ与.net core(三) fanout类型Exchange 与 消息的过期时间 与 队列的存活时间

    上一篇我们讲了关于direct类型的Exchange,这一片我们来了解一下fanout类型的Exchange. 1.Exchange的fanout类型 fanout类型的Exchange的特点是会把消 ...

  3. RabbitMQ Exchange类型详解

    前言 在上一篇文章中,我们知道了RabbitMQ的消息流程如下: 但在具体的使用中,我们还需知道exchange的类型,因为不同的类型对应不同的队列和路由规则. 在rabbitmq中,exchange ...

  4. 四、RabbitMQ Exchange类型

    RabbitMQ整体上是一个生产者与消费者模型,主要负责接收.存储和转发消息.可以把消息传递的过程想象成:当你将一个包裹送到邮局,邮局会暂存并最终将邮件通过邮递员送到收件人的手上,RabbitMQ就好 ...

  5. RabbitMQ Exchange详解以及Spring中Topic实战

    前言 AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计.消息中间件主要用于组件之间的解耦. 业务需求 ...

  6. 5、RabbitMQ - Exchange之 fanout \ 【direct 关键字发送】 \ topic

    pytho系列之 RabbitMQ - Exchange几种模式 RabbitMQ中,所有生产者提交的消息都由Exchange来接受,然后Exchange按照特定的策略转发到Queue进行存储 Rab ...

  7. (七)RabbitMQ消息队列-通过fanout模式将消息推送到多个Queue中

    原文:(七)RabbitMQ消息队列-通过fanout模式将消息推送到多个Queue中 前面第六章我们使用的是direct直连模式来进行消息投递和分发.本章将介绍如何使用fanout模式将消息推送到多 ...

  8. 8、RabbitMQ三种Exchange模式(fanout,direct,topic)的性能比较

    RabbitMQ三种Exchange模式(fanout,direct,topic)的性能比较 RabbitMQ中,除了Simple Queue和Work Queue之外的所有生产者提交的消息都由Exc ...

  9. python---RabbitMQ(2)exchange中订阅者模式fanout<广播>,(一对多,发布一条消息,多人同时接收)

    fanout:广播:所有bind到此exchange的queue都可以接受到消息 生产者: # coding:utf8 # __author: Administrator # date: // # / ...

随机推荐

  1. 拒绝了对对象 'XXX' (数据库 'XXX',架构 'dbo')的 SELECT 权限

    2010-04-17 23:16 在IIS里测试ASP.NET网站时会遇到这样的问题(ASP.NET+SQL2005)我自己的解决方法是这样的: 1.打开SQL2005管理界面(没有安装SQLServ ...

  2. ssh 免密码设置失败原因总结

    先复习一下设置ssh免密码操作的步骤: 进入主目录 cd 生成公钥 ssh-keygen -t rsa -P '' (注:最后是二个单引号,表示不设置密码) 然后分发公钥到目标机器 ssh-copy- ...

  3. tkinter 的两个例子

    第一个例子:after 用于定时操作 import tkinter as tk import time class MyApp(tk.Frame): def __init__(self, msecs= ...

  4. sublime text2 打开包含中文的文件会自动追加.dump后缀解决办法

    用sublime text2 打开.c, .h,.txt等文件会自动追加一个.dump后缀,這样在打开.c,.h等文件时无法正常识别,从而无法正常进行语法着色,网上说是因为安装了GBK Encodin ...

  5. 学习笔记——Maven 如何处理传递性依赖

    maven引入的传递性依赖机制,一方面大大简化和方便了依赖声明,另一方面,大部分情况下我们只需要关心项目的直接依赖是什么,而不用考虑这些直接依赖会引入什么传递性依赖.但有时候,当传递性依赖造成问题的时 ...

  6. leetcode - 位运算题目汇总(上)

    最近在看位运算的知识,十分感叹于位运算的博大精深,正好leetcode有 Bit Manipulation 的专题,正好拿来练练手. Subsets 给出一个由不同的数字组成的数组,枚举它的子数组(子 ...

  7. byte[] 转字符串 中文乱码

    闲来无事,写了一个UWP的UDP/TCP小Demo,网上找了个网络调试助手,就兴冲冲的开始玩耍 结果“鸡同鸭讲”: 讲英文的时候大家都是abc,hello man!how are you? 讲中文的时 ...

  8. vi实战记录

    vi编辑器在Unix和Linux中比较早期的,Vim是vi的扩展集,是对vi的加强. 服务器最小化,默认集成vi编辑器!了解vi常用命令,工作起来颇有-洪荒之力!!! 01.关于退出 :wq!  -- ...

  9. linux 定时执行scrapy命令

    解决方案: 1.以管理员方式执行命令添加计划 sudo crontab -e 添加: 1 0 * * * sh /home/ubuntu/CRON/cron.sh 2. 重启cron服务 sudo s ...

  10. ORA-600(qerltcInsertSelectRop_bad_state)错误

    来源于: http://blog.itpub.net/22458783/viewspace-615501/ 这是碰到的第一个11.2上的bug,在利用IGNORE_ROW_ON_DUPKEY_INDE ...