设为首页 收藏本站
查看: 1099|回复: 0

[经验分享] RabbitMQ七:交换机类型Exchange Types--Fanout 介绍

[复制链接]

尚未签到

发表于 2017-12-8 16:32:46 | 显示全部楼层 |阅读模式
前言
  最新版本的RabbitMQ有四种交换机类型,分别是Direct exchange、Fanout exchange、Topic exchange、Headers exchange。
  其中之前我们用过Direct exchange,Direct直接翻译过来就是"直接的,直的",在我们之前的案例中基本都是Direct类型。
  其一:Direct Exchange – 处理路由键。需要将一个队列绑定到交换机上,要求该消息与一个特定的路由键完全匹配。这是一个完整的匹配。
  如果一个队列绑定到该交换机上要求路由键 “key”,则只有被标记为“key”的消息才被转发,只会转发key。 Direct在前面案例中已经有案例,我们就不做重点了。
DSC0000.png

  其二: Fanout Exchange – 不处理路由键。你只需要简单的将队列绑定到交换机上。一个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。很像子网广播,每台子网内的主机都获得了一份复制的消息。Fanout交换机转发消息是最快的。 (最实际开发中遇到的案例:你注册某网站,对方会给你邮箱和短信发送同样的内容.......)话不多说,今天的主角就是 Fanout Exchange,英语翻译(fanout :分列)
DSC0001.png

  其三,其四,请看下回讲解,哈哈哈.....,
  进入场景:::需求,某网站注册成功,同时给手机端和邮箱发同样的消息,(备注:代码中我会采用,一次性发100条消息,也是为了跟上篇文章作比较)

代码

发布端:
  案例简述(比如:注册成功会有发送一百条同样的消息,这里是为了跟上篇文章做比较)



  /// <summary>
/// fanout实现   模拟场景: 客户注册某某网站,消息提醒同一条消息,分别发送给短息和邮件方
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
using (var channel = HelpConnection.GetConnection().CreateModel())
{
                //声明一个fanout类型的Exchange
channel.ExchangeDeclare("fanoutExchange", "fanout", true, false, null);
for (int i = 0; i < 100; i++)
{
var reamker = i % 2 == 0 ? "sms" : "emai";
var msg = Encoding.UTF8.GetBytes("内容:发送内容,我最帅" + i.ToString());
Console.WriteLine("内容:发送内容,"+i);
//不需要指定routingkey,指定了也没用.因为交换机是fanout类型
channel.BasicPublish("fanoutExchange",string.Empty, null, msg);
}
}
Console.WriteLine("发布成功");
Console.ReadKey();
}
  效果图: DSC0002.png

消费端
  模拟场景:发布端已经发布100条数据,我们消费端模拟,当你输入登录邮箱的时候能看到发送的消息,你查看手机短信页面的时候查看到发送的消息;



        /// <summary>
///   消费者 fanout实现   模拟场景: 客户注册某某网站,消息提醒同一条消息,分别发送给短息和邮件方
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
while (true)
{
Console.WriteLine("请选择登陆:1邮箱,2短信?");
var readline = Console.ReadLine();
//邮箱短信
if (readline == "1" || readline == "2")
{
var queueName = readline == "1" ? "sms" : "emai";
using (var channel = HelpConnection.GetConnection().CreateModel())
{
channel.QueueDeclare(queueName, true, false, false, null);
channel.ExchangeDeclare("fanoutExchange", "fanout", true, false, null);
//不需要指定routingkey,指定了也没用.因为交换机是fanout类型
channel.QueueBind(queueName, "fanoutExchange", string.Empty, null);
var consumer = new EventingBasicConsumer(channel);
consumer.Received+=(mode,e)=>{
var msg=Encoding.UTF8.GetString(e.Body);
Console.WriteLine(queueName + "显示结果:" + msg);
};
channel.BasicConsume(queueName,true,consumer);
Console.ReadKey();
}
}
else
{
Console.WriteLine("输入有误,请重新输入!!");
}
}
}
效果图,

操作简述,由于队列消息我们在客户端创建的,所以,你启动消费端,输入邮箱和邮件的时候才能创建队列,之前案例中也有类似的demo,当然第一次创建的时候,肯定会把发布者第一发布的消息给消费了,当你发布第二次消息的时候,我们就能看消费者中代码创建的(100条)消息。整个过程最好你把代码敲一遍,很自然就能理解整个过程。
   DSC0003.png
DSC0004.png

DSC0005.png

DSC0006.png


总结
  我感觉这是Demo中学习运用,还需要在具体的实际项目中实践,一些代码如何去封装适合的场景,让我们一起写博文分享中前进吧;


  • 博主是利用读书、参考、引用、抄袭、复制和粘贴等多种方式打造成自己的纯镀 24k 文章,请原谅博主成为一个无耻的文档搬运工!
  • 小弟刚迈入博客编写,文中如有不对,欢迎用板砖扶正,希望给你有所帮助。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-422205-1-1.html 上篇帖子: POJ1860 Currency Exchange —— spfa求正环 下篇帖子: Exchange Management Console Error
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表