Rabbitmq运用之fanout模式

这篇具有很好参考价值的文章主要介绍了Rabbitmq运用之fanout模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Rabbitmq运用之fanout模式

代码在文末无条件提供

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

rabbitmq fanout,rabbitmq,分布式

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

这里用到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,rabbitmq,分布式

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

短信消费端;

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,rabbitmq,分布式

运行的时候如图

rabbitmq fanout,rabbitmq,分布式

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

https://download.csdn.net/download/yu240956419/85351699 可以到我的资源里面找文章来源地址https://www.toymoban.com/news/detail-528893.html


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

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



### 运行的时候如图

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

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

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

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

到了这里,关于Rabbitmq运用之fanout模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RabbitMQ——解决分布式事务问题,RabbitMQ的重要作用之一!!!通过可靠生产和可靠消费来完美解决!

    分布式事务是指涉及多个独立的计算机系统(也称为节点或参与者)之间的事务处理。在分布式系统中,每个节点可能各自拥有自己的数据存储和事务管理机制。分布式事务的目标是保证在跨多个节点执行的一系列操作可以以一致和可靠的方式执行和提交,即使在面对故障或

    2024年04月23日
    浏览(46)
  • 微服务学习:SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

    目录 一、高级篇 二、面试篇 ==============实用篇============== day05-Elasticsearch01 1.初识elasticsearch 1.4.安装es、kibana 1.4.1.部署单点es 1.4.2.部署kibana 1.4.3.安装IK分词器 1.4.4.总结 2.索引库操作 2.1.mapping映射属性 2.2.索引库的CRUD 2.2.1.创建索引库和映射 2.2.2.查询索引库 2.2.3.修改索引库 2.

    2024年02月02日
    浏览(54)
  • 分布式消息队列:Kafka vs RabbitMQ vs ActiveMQ

    在现代分布式系统中,消息队列是一种常见的异步通信模式,它可以帮助系统处理高并发、高可用性以及容错等问题。在这篇文章中,我们将深入探讨三种流行的分布式消息队列:Apache Kafka、RabbitMQ和ActiveMQ。我们将讨论它们的核心概念、算法原理、特点以及使用场景。 随着

    2024年02月02日
    浏览(59)
  • Python爬虫分布式架构 - Redis/RabbitMQ工作流程介绍

    在大规模数据采集和处理任务中,使用分布式架构可以提高效率和可扩展性。本文将介绍Python爬虫分布式架构中常用的消息队列工具Redis和RabbitMQ的工作流程,帮助你理解分布式爬虫的原理和应用。 为什么需要分布式架构? 在数据采集任务中,单机爬虫可能面临性能瓶颈和资

    2024年02月11日
    浏览(40)
  • (黑马出品_07)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

    [此文档是在心向阳光的天域的博客加了一些有助于自己的知识体系,也欢迎大家关注这个大佬的博客](https://blog.csdn.net/sinat_38316216/category_12263516.html) [是这个视频](https://www.bilibili.com/video/BV1LQ4y127n4/?p=5spm_id_from=pageDrivervd_source=9beb0a2f0cec6f01c2433a881b54152c) 聚合 可以让我们极其方便

    2024年03月12日
    浏览(52)
  • 分布式搜索引擎(Elastic Search)+消息队列(RabbitMQ)部署(商城4)

    1、全文搜索 Elastic search可以用于实现全文搜索功能,例如商城中对商品搜索、搜索、分类搜索、订单搜索、客户搜索等。它支持复杂的查询语句、中文分词、近似搜索等功能,可以快速地搜索并返回匹配的结果。 2、日志分析 Elastic search可以用于实现实时日志分析,例

    2024年02月04日
    浏览(48)
  • 分布式 SpringCloudAlibaba、Feign与RabbitMQ实现MySQL到ES数据同步

    本文参考黑马 分布式Elastic search Elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容 同步调用 方案一:同步调用 基本步骤如下: hotel-demo对外提供接口,用来修改elasticsearch中的数据 酒店管理服务在完成数据库操

    2024年04月11日
    浏览(45)
  • 【103期】RabbitMQ 实现多系统间的分布式事务,保证数据一致性

    org.springframework.boot spring-boot-starter-amqp mysql mysql-connector-java runtime org.projectlombok lombok true org.springframework.boot spring-boot-starter-jdbc com.alibaba fastjson 1.2.17 3.2.1.2配置文件内容: server: port: 8080 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/test?useUnicode=tru

    2024年04月14日
    浏览(64)
  • (黑马出品_高级篇_04)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

    [此文档是在心向阳光的天域的博客加了一些有助于自己的知识体系,也欢迎大家关注这个大佬的博客](https://blog.csdn.net/sinat_38316216/category_12263516.html) [是这个视频](https://www.bilibili.com/video/BV1LQ4y127n4/?p=5spm_id_from=pageDrivervd_source=9beb0a2f0cec6f01c2433a881b54152c) 消息队列在使用过程中,面

    2024年03月19日
    浏览(46)
  • SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈

    我们发现在微服务中有一个令人头疼的问题——部署,用Docker去解决这个部署难题 1、项目部署的问题 2、Docker 扔到一台机器上,它们的依赖难道没有干扰吗?不会,docker将打包好的程序放到一个隔离容器去运行,使用沙箱机制,避免互相干扰,之间不可见,这样就解决了混

    2023年04月24日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包