• 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

  • 相关阅读:
    【收集】13款Linux系统有
    【收集】13款Linux系统有
    献给母亲节的沙画,致此生最爱——母亲!
    ACM2136
    WTF is The BlockChain?
    Java 多线程(上)
    Kubernetes集群部署DNS插件
    Vue组件
    写在APIO2016之前
    5G-NR物理信道与调制-下行链路v1.1.0
  • 原文地址:https://www.cnblogs.com/LiangSW/p/6195836.html
Copyright © 2020-2023  润新知