• RabbitMQ Exchange中的fanout类型


    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进行了不同的消费

    image

  • 相关阅读:
    asp与aspx有什么区别
    ASPX导入JS,JavaScript乱码怎么办
    ASP.NET找不到类型或命名空间名称怎么办
    ASP.NET缺少程序集引用怎么办
    如何查看搜狗浏览器应用的源码
    [HTML5] Render Hello World Text with Custom Elements
    [Javascript] Conditionally spread entries to a JavaScript object
    [TypeScript] Use the JavaScript “in” operator for automatic type inference in TypeScript
    [Javascript] Use a Pure RNG with the State ADT to Select an Element from State
    [Spring boot] Configuring and Accessing a Data Source
  • 原文地址:https://www.cnblogs.com/zxtceq/p/7567365.html
Copyright © 2020-2023  润新知