RabbitMQ Exchange中的fanout类型

fanout 多播

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

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

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

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

下面通过代码来看

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

//创建返回一个新的频道
 using (var channel = RabbitMqHelper.GetConnection().CreateModel())
{

       //发布一个消息
        var msg = Encoding.UTF8.GetBytes($"二狗子");
        //不需要指定routingkey,指定了也没用.因为交换机是fanout类型
        channel.BasicPublish("fanoutExchange", routingKey: string.Empty, basicProperties: null, body: msg);

        Console.Write("发布成功!");

}

       Console.ReadKey();

这里是consumer部分的代码

            bool flag = true;
            string pattern = "";
            while (flag)
            {
                Console.WriteLine("请选择Ccnsumer模式  1(发短信)/2(发邮件)");
                pattern = Console.ReadLine();
                if (pattern == "1" || pattern == "2")
                    flag = false;
                else
                    Console.Write("请做出正确的选择");
            }

            using (var channel = RabbitMqHelper.GetConnection().CreateModel())
            {

                //声明交换机 Fanout模式
                channel.ExchangeDeclare("fanoutExchange", ExchangeType.Fanout, true, false, null);
                //根据声明使用的队列
                var queueName = pattern == "1" ? "sms" : "emai";
                channel.QueueDeclare(queueName, true, false, false, null);
                //进行绑定
                channel.QueueBind(queueName, "fanoutExchange", string.Empty, null);

                //创建consumbers
                var consumer = new EventingBasicConsumer(channel);

                consumer.Received += (sender, e) =>
                {
                    var msg = Encoding.UTF8.GetString(e.Body);

                    var action = (pattern == "1" ? "发短信" : "发邮件");
                    Console.WriteLine($"给{msg}{action}");
                };

                //进行消费
                channel.BasicConsume(queueName, true, consumer);

                Console.ReadKey();

            }

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

时间: 2024-10-10 20:59:26

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

RabbitMQ Exchange类型详解

前言 在上一篇文章中,我们知道了RabbitMQ的消息流程如下: 但在具体的使用中,我们还需知道exchange的类型,因为不同的类型对应不同的队列和路由规则. 在rabbitmq中,exchange有4个类型:direct,topic,fanout,header. direct exchange 此类型的exchange路由规则很简单: exchange在和queue进行binding时会设置routingkey channel.QueueBind(queue: "create_pdf_que

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

pytho系列之 RabbitMQ - Exchange几种模式 RabbitMQ中,所有生产者提交的消息都由Exchange来接受,然后Exchange按照特定的策略转发到Queue进行存储 RabbitMQ提供了四种Exchange:fanout, direct, topic, headerheader模式在实际使用中较少,本文只对前三种模式进行比较.性能排序:fanout > direct >> topic .比例大约为11:10:6 六.关键字发送 exchange type =

rabbitmq exchange type

This is the fourth installment to the series: RabbitMQ for Windows.  In thelast installment, we reviewed our Hello World example and introduced the concept of Exchanges.  In this installment, we'll discuss the four basic types of RabbitMQ exchanges.

Exchange Server 运维管理01:Exchange中Active Directory 有什么用?

近期,需要给客户进行一次Exchange Server 的运维普及培训,在前期博文的基础上,准备再梳理一下运维管理的思路,发几篇和运维管理相关的博文.本文,就介绍一下Exchange Server 2010中的Active Directory有什么用? 很多朋友都知道,安装Exchange 肯定需要在域环境里,活动目录很重要,但到底起到了哪些作用?我们来看一下.针对Exchange Server来说,活动目录主要起到两大作用:一是 Exchange Server 使用 Active Direct

RabbitMQ - exchange

总结一下几种ExchangeTypes. 之前写发布/订阅模式时第一次提到了exchange type.即producer不是将消息直接放到队列中,而是先到exchange中,exchange主要用于控制消息到队列的路由,根据具体的exchange type将消息传给需要的队列或者直接废弃.在这一篇中总结一下那些用到的exchange type. 一.Direct Exchangedirect exchange算是最基本的了.direct exchange用于将带上routing key的消息传

[EWS]在exchange中的标识符

摘要 最近在用ews的方式开发邮箱服务,包括写邮件,查看某封邮件的详情,回复,全部回复及转发功能.在获取收件箱的时候,关于唯一标识符的问题.也有点困惑,在每个邮件item中,存在一个changeKey和uniqueid的标识.关于这两个的区别还是查看msdn找到结果的. EWS Identifiers in Exchange 原文地址:https://msdn.microsoft.com/en-us/library/office/dn605828(v=exchg.150).aspx ======

rabbitMQ学习笔记(六) topic类型消息。

上一节中使用了消息路由,消费者可以选择性的接收消息. 但是这样还是不够灵活. 比如某个消费者要订阅娱乐新闻消息 . 包括新浪.网易.腾讯的娱乐新闻.那么消费者就需要绑定三次,分别绑定这三个网站的消息类型. 如果新闻门户更多了,那么消费者将要绑定个更多的消息类型, 其实消费者只是需要订阅娱乐新闻,不管是哪个网站的新闻,都需要. 那么在rabbitMQ中可以使用topic类型. 模糊匹配消息类型. 模糊匹配中的 *代表一个  #代表零个或1个 示例: 1 package com.zf.rabbitm

NetworkInfo 手机中的网络类型

04-27 21:56:54.442: E/NetworkInfo(26457): NetworkInfo: type: mobile[EDGE], state: DISCONNECTED/IDLE, reason: (unspecified), extra: (none), roaming: false, failover: true, isAvailable: false;ni.typename=mobile 04-27 21:56:54.442: E/NetworkInfo(26457):

Entity Framework 教程——Entity Framework中的实体类型

Entity Framework中的实体类型 : 在之前的章节中我们介绍过从已有的数据库中创建EDM,它包含数据库中每个表所对应的实体.在EF 5.0/6.0中,存在POCO 实体和动态代理实体两种. POCO Entity (Plain Old CLR Object): POCO类是不依赖任何框架的类型,如同其他正常的一般类型,我们称之为"Plain Old CLR Objects"(这里不知道怎么翻译,普通的CLR对象?古老的CLR对象?大概意思就是没有什么特殊的对象吧). POC