Rabbitmq运用之fanout模式

Rabbitmq运用之fanout模式

代码在文末无条件提供

rabiitmq 的 fanout 属于多播模式,他的工作图如下,应用场景挺多的。比如订单,客户下单后,会发送消息告诉客户下单成功,通知仓库出货等。

Rabbitmq运用之fanout模式_第1张图片

在上面的图可以看到,项目里有四个启动项目

这里用到RabbitmqFanoutConsumerSend,RabbitmqFanoutConsumerWMS,RabbitmqFanoutProduct这三个控制台,另外一个没用

RabbitmqFanoutProduct 属于生产端,当订单提交成功后,生产端回向某个交换器exchange (这里定义fanoutexchange)推送消息(这种模式是没用路由的) 然后会分别向(sendqueue)和(wmsqueue)两个队列里各种推送一条消息,再经过,各个消费端对各自的队列进行消费,做相关的业务。

我比较简单粗暴,直接上图上代码

代码里面有我写的注释,相信大家一看就懂

生产端的代码如下。

using RabbitMQ.Client;
using System;
using System.Text;
using System.Threading;

namespace RabbitmqFanoutProduct
{
    class Program
    {
        static void Main(string[] args)
        {
            //创建连接工厂 用户名账户 ,密码/IP地址端口号
            ConnectionFactory connectionFactory = new ConnectionFactory() { 
            
               Password="123456",
               UserName="Henry",
               HostName="localhost",
               VirtualHost="Test"
               ,Port=5672
                   
            };
            //创建连接
         IConnection connection=   connectionFactory.CreateConnection();
            //创建通道
         IModel channel=    connection.CreateModel();
            //这里定义交换器名称和 模式,
            channel.ExchangeDeclare("fanoutexchange", ExchangeType.Fanout, true, false, null);
            //队列都是在消费端定义的,哪个要监听,就加进来。
            //接下来是发送信息
         
            while (true)
            {
                string[] list = new string[] { "落叶的订单", "Kettle的订单", "Henry的订单", "微信173265046" };
                foreach (var item in list)
                {
                    string text = item + "---" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                    Console.WriteLine("生产端推送订单"+ text);
                    byte[] content = Encoding.UTF8.GetBytes(text);
                    channel.BasicPublish("fanoutexchange", "", null, content);

                    Thread.Sleep(5000);
                }
               

            }

            Console.ReadKey();
            Console.WriteLine("Hello World!");
        }
    }
}

启动后如图

Rabbitmq运用之fanout模式_第2张图片

两个生产端分别如下,两个端用的消费模式是不一样的,大家要仔细看看

短信消费端;

using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Text;

namespace RabbitmqFanoutProductSend
{
    class Program
    {
        static void Main(string[] args)
        {

            //创建连接工厂 用户名账户 ,密码/IP地址端口号
            ConnectionFactory connectionFactory = new ConnectionFactory()
            {

                Password = "123456",
                UserName = "Henry",
                HostName = "localhost",
                VirtualHost = "Test"
               ,
                Port = 5672

            };
            //创建连接
            IConnection connection = connectionFactory.CreateConnection();
            //创建通道
            IModel channel = connection.CreateModel();
            //这里定义交换器名称和 模式 durable 持久化  ,autodelete 断开删除
          channel.ExchangeDeclare("fanoutexchange", ExchangeType.Fanout, true, false, null);
            //定义短信队列
            channel.QueueDeclare("sendqueue", true, false, false, null);
            //绑定队列和交换器
            channel.QueueBind( "sendqueue", "fanoutexchange", "",null);
 
            //主要是不让整个队列一下子到消费端,减少消费端的压力
            channel.BasicQos(0, 1, false);
            //事件消费模式,另外一种模式在另外一个消费端展现
            EventingBasicConsumer eventingBasicConsumer = new EventingBasicConsumer(channel);
            eventingBasicConsumer.Received += (obj,evet)=>{ 
               
                 string  content=     Encoding.UTF8.GetString(evet.Body.ToArray());
                Console.WriteLine($"消费端信息-收到订单{content} 发送短信");
                //确认一个或多个已传递的消息 踢出队列
                channel.BasicAck(evet.DeliveryTag, true);
                // 当失败的时候 拒绝确认,是否放回队列
             //   channel.BasicReject(evet.DeliveryTag, true);


            };
            //开始消费某个队列,不自动确认,开始时间
            channel.BasicConsume("sendqueue", false, eventingBasicConsumer);
            Console.ReadKey();
            Console.WriteLine("Hello World!");
        }

       
    }
}

仓库消费端

using RabbitMQ.Client;
using System;
using System.Text;
using System.Threading;

namespace RabbitmqFanoutWMS
{
    class Program
    {
        static void Main(string[] args)
        {
            //创建连接工厂 用户名账户 ,密码/IP地址端口号
            ConnectionFactory connectionFactory = new ConnectionFactory()
            {

                Password = "123456",
                UserName = "Henry",
                HostName = "localhost",
                VirtualHost = "Test"
               ,
                Port = 5672

            };
            //创建连接
            IConnection connection = connectionFactory.CreateConnection();
            //创建通道
            IModel channel = connection.CreateModel();
            //这里定义交换器名称和 模式 durable 持久化  ,autodelete 断开删除
               channel.ExchangeDeclare("fanoutexchange", ExchangeType.Fanout, true, false, null);
            //定义短信队列
            channel.QueueDeclare("wmsqueue", true, false, false, null);
            channel.QueueBind( "wmsqueue", "fanoutexchange","", null);

            while (true) {
                //从哪个队列获取,是否自动确认 这里是否
                BasicGetResult basicGetResult = channel.BasicGet("wmsqueue", false);
                if (basicGetResult != null) {
                    string content = Encoding.UTF8.GetString(basicGetResult.Body.ToArray());
                    Console.WriteLine($"消费端仓库 -收到订单{content} 准备发货");
                    //确认 
                    channel.BasicAck(basicGetResult.DeliveryTag, true);
                }
                Thread.Sleep(3000);

            }
 
            Console.ReadKey();
            Console.WriteLine("Hello World!");
        }
    }
}

启动后产生的队列如图

Rabbitmq运用之fanout模式_第3张图片

运行的时候如图

Rabbitmq运用之fanout模式_第4张图片

代码下载地址(免积分提供)

https://download.csdn.net/download/yu240956419/85351699 可以到我的资源里面找


### 启动后产生的队列如图

[外链图片转存中...(img-VoVITmfc-1652279605758)]



### 运行的时候如图

[外链图片转存中...(img-veBrmooL-1652279605758)]

代码下载地址(免积分提供)

https://download.csdn.net/download/yu240956419/85351699 可以到我的资源里面找

后面有时间再写其他剩下的topic 和header,rpc,死信队列等

你可能感兴趣的:(rabbitmq,分布式)