C#RabbitMQ消息队列的使用

2023-05-16

C#RabbitMQ消息队列的使用

概念

1、消息(Message)

消息指的是两个应用之间传递的数据。其中数据的类型可以有很多的形式,可能只是包含文本字符串的一条消息,也可能时一个嵌入的对象。

2、消息队列(Meaasge Queue)

消息队列指的是在消息传递过程中保存消息的容器,我们可以把它理解成通讯中的缓存区,只不过是在缓存区当中可以存储多条消息数据,且提取的顺序是先进先出的原则。在消息队列中,通常还有两个必不可少的角色,也就是消息的发出是由谁来发,我们称之为生产者;以及这条消息被谁接受使用,我们称之为消费者。在消息队列当中,消费者不用考虑这条消息谁有那个生产者发送的,只负责从消息里面提取数据,甚至都可以不用管生产者是否存在,然后进行消费。消息模型图如下:
在这里插入图片描述
RabbitMQ的内部结构图:
在这里插入图片描述
在消息模型图当中,只是对消息队列的一个简单的抽象的介绍,具体到RabbitMQ当中,有几个更详细的概念也需要解释。

1、Exchange
交换器或者交换机它是负责用来接收生产者发送的消息,同时将这些消息通过指定的路由规则传输到服务器中的队列。
2、Binding
绑定,它是连接在交换器和队列的一个桥梁,一个绑定就是联接交换器和队列的路由规则,所以将交换器理解成一个由绑定构成的路由表。
3、Queue
队列,它是用来存储消息的容器,一直保留直到被消费者消费,同时呢,也是消息的终点。消息一直在队列里面,等待消费者连接到这个队列后将其消费取走。
4、Connection
网络连接,比如一个TCP连接。
5、Channel
信道,多路复用连接中的一条独立的双向数据流通道。信道是建立在真实的TCP连接内的虚拟连接,AMQP 命令都是通过信道发出去的,不管是发布消息、订阅队列还是接收消息,这些动作都是通过信道完成。因为对于操作系统来说建立和销毁 TCP 都是非常昂贵的开销,所以引入了信道的概念,以复用一条 TCP 连接。
6、Virtual Host
虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个 vhost 本质上就是一个 mini 版的 RabbitMQ 服务器,拥有自己的队列、交换器、绑定和权限机制。vhost 是 AMQP 概念的基础,必须在连接时指定,RabbitMQ 默认的 vhost 是 / 。
7、Broker
表示消息队列服务器实体

为什么使用消息队列

从上面的描述我们可以看到,生产者和消费者之间可以说没有直接的关系,就是说在没有消费者的情况下,生产者也可以将消息传递到消息队列当中,不管生产者有没存在,消费者依旧可以从消息队列当中提取消息数据。这是一种异步的机制,那么我们在何种情况下要使用到消息队列呢?

以我们常见的订单系统为例,用户点击下了一个订单,在服务端的业务逻辑可能包含产品信息过账,库存扣减,生成相应的订单信息,还可以通知用户订单生成成功。当商家订单接到爆,处于繁忙状态,确认订单的事情被滞后了,用户不用管商家何时处理,去做自己想做的事情,等待商家自行处理订单即可。

以上是我们常见的业务解耦的情况,在需要使用到解耦的场景当中、错峰控流、广播等等,我们就可以使用消息队列。

RabbitMQ的特点

RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。
AMQP :Advanced Message Queue,高级消息队列协议。它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制。
RabbitMQ 最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。具体特点包括:

1、可靠性(Reliability)
RabbitMQ 使用一些机制来保证可靠性,如持久化、传输确认、发布确认。
2、灵活的路由(Flexible Routing)
在消息进入队列之前,通过 Exchange 来路由消息的。对于典型的路由功能,RabbitMQ 已经提供了一些内置的 Exchange 来实现。针对更复杂的路由功能,可以将多个 Exchange 绑定在一起,也通过插件机制实现自己的 Exchange 。
3、消息集群(Clustering)
多个 RabbitMQ 服务器可以组成一个集群,形成一个逻辑 Broker 。
4、高可用(Highly Available Queues)
队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列仍然可用。
5、多种协议(Multi-protocol)
RabbitMQ 支持多种消息队列协议,比如 STOMP、MQTT 等等。
6、多语言客户端(Many Clients)
RabbitMQ 几乎支持所有常用语言,比如 Java、.NET、Ruby 等等。
7、管理界面(Management UI)
RabbitMQ 提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker 的许多方面。
8、跟踪机制(Tracing)
如果消息异常,RabbitMQ 提供了消息跟踪机制,使用者可以找出发生了什么。
9、插件机制(Plugin System)
RabbitMQ 提供了许多插件,来从多方面进行扩展,也可以编写自己的插件。

RabbitMQ安装

1、安装Erlang
由于RabbitMQ是由Erlang语言开发的,所以在安装之前,一般需要安装Erlang,大家可以去Erlang官网下载
打开链接如下图所示:大家根据自己电脑系统匹配下载框内文件。
在这里插入图片描述
鉴于我的电脑是64位的,下载后得到这么一个玩意,双击运行它,一直下一步即可:
在这里插入图片描述
安装完成后还需要配置一下环境变量:
在这里插入图片描述
2、安装RabbitMQ服务端

大家可以到RabbitMQ的gitHub项目中,下载window版本的服务端安装包:
在这里插入图片描述
下载完成后,得到这个玩意:
在这里插入图片描述
双击运行,一直下一步,安装完成后找到根目录:
在这里插入图片描述
在安装目录sbin下,运行cmd 输入 rabbitmq-plugins enable rabbitmq_management 启动界面管理服务:
在这里插入图片描述
启动以后,在浏览器中输入 http://127.0.0.1:15672/,进入管理页面,账户密码都是guest。
以下,介绍几个操作命令:

rabbitmqctl list_users  							查看所有用户tags
rabbitmqctl set_user_tags 用户名 administrator      给用户赋予管理员角色
rabbitmqctl change_password 用户名  密码            修改用户密码
rabbitmqctl  add_user  JC JayChou                   创建用户JC密码为JayChou
rabbitmqctl  set_permissions  JC ".*"  ".*"  ".*"   赋予JC读写所有消息队列的权限
rabbitmqctl delete_user  JC 			            删除用户JC
rabbitmq-plugins enable rabbitmq_management         开启rabbitmq_management插件,在web界面查看和管理RabbitMQ服务
rabbitmqctl status				                    查看状态

注意点:
1、rabbitmq server 默认端口是 udp的15672端口,如果是远程连接需要开启防火墙
2、guest 用户是本地账号如果,不在同一台服务器上无法连接,需要新建一个账号并且给这个账号对应的权限
以上,我们的RabbitMQ已经安装完成了,接下来,我们来介绍下.net如何使用它
3、如果需要消息持久化 ,需要把队列设置为持久化,并且每次发送消息都需要设置为持久化,重启以后会自动去加载队列以及队列的消息

RabbitMQ使用

1、导入引用
在vs中引用客户端RabbitMQ.Client,可以在官网下载,也可以在 vs的nuget中下载,需要的筒子们也可以在下面的百度云链接下载:
链接:https://pan.baidu.com/s/1KUZKkpj-f9NKL05ME6YUcQ
提取码:2wvc

2、生产者发送消息到消息队列代码:

先定义一个RabbitMQ模型,用于初始化调用

	public class RabbitMQModel
    {
        /// <summary>
        /// 远程服务器IP地址
        /// </summary>
        public string HostName { get; set; }
        /// <summary>
        /// 远程服务器端口
        /// </summary>
        public int Port { get; set; }
        /// <summary>
        /// 消息队列登录用户名
        /// </summary>
        public string UserName { get; set; }
        /// <summary>
        /// 消息队列登录密码
        /// </summary>
        public string PassWord { get; set; }
        /// <summary>
        /// 消息队列名
        /// </summary>
        public string queueName { get; set; }
        /// <summary>
        /// 交换机名
        /// </summary>
        public string exchangeName { get; set; }
    }

声明对象:using RabbitMQ.Client;

	RabbitMQModel Wcs_RabbitMQModel;
    ConnectionFactory _factoryWcsMQ;

初始化对象:


			Wcs_RabbitMQModel = new RabbitMQModel()
            {
                HostName = "localhost",
                Port = 5672,
                UserName = "lijunqing",
                PassWord = "960519",
                queueName = "WCSRabbitMQ1",
                exchangeName = "WCSRabbitMQRoute1"
            };
            if (_factoryWcsMQ == null)
            {
                _factoryWcsMQ = new ConnectionFactory
                {
                    HostName = Wcs_RabbitMQModel.HostName,
                    Port = Wcs_RabbitMQModel.Port,
                    UserName = Wcs_RabbitMQModel.UserName,
                    Password = Wcs_RabbitMQModel.PassWord
                };
            }

发送到消息队列的方法:

 #region 发送消息
        public bool SendToRPCServer(string sendContent)
        {
            if (_factoryWcsMQ != null)
            {
                IConnection conn = _factoryWcsMQ.CreateConnection();
                IModel im = conn.CreateModel();
                try
                {
                    im.ExchangeDeclare(Wcs_RabbitMQModel.exchangeName, ExchangeType.Direct);
                    im.QueueDeclare(Wcs_RabbitMQModel.queueName, true, false, false, null);
                    im.QueueBind(Wcs_RabbitMQModel.queueName, WMS_RabbitMQModel.exchangeName, ExchangeType.Direct, null);
                    Thread.Sleep(10);
                    byte[] message = Encoding.UTF8.GetBytes(sendContent);
                    im.BasicPublish(Wcs_RabbitMQModel.exchangeName, ExchangeType.Direct, null, message);
                    return true;
                }
                catch (Exception ex)
                {
                    return false;
                }
                finally
                {
                    im.Close();
                    conn.Close();
                }
            }
            return false;
        }
        #endregion

3、消费者从消息队列里面提取消息的方法:
声明对象:using RabbitMQ.Client;

		RabbitMQModel WMS_RabbitMQModel;
        ConnectionFactory _factoryWmsMQ;
        bool _Countinue = true;//用于线程循环

初始化对象:


			WMS_RabbitMQModel = new RabbitMQModel()
            {
                HostName = "localhost",
                Port = 5672,
                UserName = "lijunqing",
                PassWord = "960519",
                queueName = "WMSRabbitMQ1",
                exchangeName = "WMSRabbitMQRoute1"
            };

            if (_factoryWmsMQ == null)
            {
                _factoryWmsMQ = new ConnectionFactory
                {
                    HostName = WMS_RabbitMQModel.HostName,
                    Port = WMS_RabbitMQModel.Port,
                    UserName = WMS_RabbitMQModel.UserName,
                    Password = WMS_RabbitMQModel.PassWord
                };
            }

获取消息线程方法:

		private void WmsCommunicaFunc(object sender)
        {
            ResponseModel model = new ResponseModel();
            #region 监听接收到的数据信息
            if (WMS_RabbitMQModel != null)
            {
                ConnectionFactory factory = new ConnectionFactory
                {
                    HostName = WMS_RabbitMQModel.HostName,
                    Port = WMS_RabbitMQModel.Port,
                    UserName = WMS_RabbitMQModel.UserName,
                    Password = WMS_RabbitMQModel.PassWord
                };
                if (factory != null)
                {
                    factory.AutomaticRecoveryEnabled = true;
                    IConnection conn = factory.CreateConnection();
                    IModel im = conn.CreateModel();
                    while (_Countinue)
                    {
                        try
                        {
                            #region 数据接收
                            BasicGetResult res = im.BasicGet(WMS_RabbitMQModel.queueName, true);
                            if (res != null && res.Body.Length > 0)
                            {
                                var result = Encoding.UTF8.GetString(res.Body);
                                //消息处理逻辑代码
                            }
                            #endregion
                        }
                        catch (Exception ex)
                        {
                            if (!ex.ToString().Contains("code=404"))
                            {
                                SaveLogExceptionClient(ex.ToString());
                            }
                            else
                            {
                                #region 如果消息队列被删除/还未创建 自动创建消息队列
                                conn.Close();
                                im.Close();
                                conn = factory.CreateConnection();
                                im = conn.CreateModel();
                                im.QueueDeclare(WMS_RabbitMQModel.queueName, true, false, false, null);
                                im.ExchangeDeclare(WMS_RabbitMQModel.exchangeName, ExchangeType.Direct);
                                im.QueueBind(WMS_RabbitMQModel.queueName, WMS_RabbitMQModel.exchangeName, ExchangeType.Direct, null);
                                #endregion
                            }
                        }
                        Thread.Sleep(100);
                    }
                    im.Close();
                    conn.Close();
                }
            }
            #endregion
        }

4、可视化界面消息查看
在这里插入图片描述
以上,就是本次RabbitMQ的一些使用的介绍。

部分内容是从其他地方参考而来,如有侵权,烦请告知删除!谢谢

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#RabbitMQ消息队列的使用 的相关文章

  • 发送消息到任意虚拟主机/与 RabbitMQ / Spring AMQP 交换

    I use RabbitMQ and Spring AMQP发送消息 我有这个片段 rabbitTemplate convertAndSend exchange key object 当我对单个操作进行操作时 这有效VHOST 我必须从 1
  • 在 Docker 中使用 RabbitMQ 删除容器

    我尝试使用RabbitMQ启动Docker容器 结果下载了镜像 但容器没有启动 我在日志中收到以下消息 error RABBITMQ DEFAULT PASS is set but deprecated error RABBITMQ DEF
  • 与 RabbitMQ 相比,Amazon SQS 的性能较慢

    我想在我的 Web 应用程序中集成消息队列中间层 我测试了 Rabbitmq 和 Amazon SQS 但发现 Amazon SQS 速度很慢 我在 Amazon SQS 中每秒收到 80 个请求 而在 Rabbitmq 中每秒收到 200
  • 在 Red Hat 上安装 RabbitMQ - 错误的 Erlang 版本

    我正在尝试按照以下说明在 Red Hat Enterprise Linux 7 64 位工作站版本 的评估虚拟机上安装 RabbitMQhttps www rabbitmq com install rpm html https www ra
  • 当我为rabbitmq-management创建用户时,发生了错误

    当我为rabbitmq创建用户时 root localhost rabbitmqctl add user admin admin 发生错误 消息 Creating user admin Error undef crypto hash sha
  • Akka 的语言和产品替代品是什么?

    现在我正在看游戏框架 https www playframework com 并且非常喜欢它 Play 中提供的功能中最受宣传的部分之一是Akka http akka io 为了更好地理解 Akka 以及如何正确使用它 您能告诉我其他语言或
  • 如何在nodejs中验证rabbitmq?

    错误 握手被服务器终止 403 ACCESS REFUSED 消息 ACCESS REFUSED 使用身份验证拒绝登录 旋转机制平原 有关详细信息 请参阅代理日志文件 我单独尝试了 authMechanism PLAIN AMQPLAIN
  • 每次发布后我应该关闭通道/连接吗?

    我在 Node js 中使用 amqplib 但我不清楚代码中的最佳实践 基本上 我当前的代码调用amqp connect 当 Node 服务器启动时 然后为每个生产者和每个消费者使用不同的通道 而不会真正关闭它们中的任何一个 我想知道这是
  • Django、RabbitMQ 和 Celery - 为什么在我更新开发中的 Django 代码后,Celery 会运行旧版本的任务?

    所以我有一个 Django 应用程序 它偶尔会向 Celery 发送任务以进行异步执行 我发现 当我在开发中处理代码时 Django 开发服务器知道如何自动检测代码何时发生更改 然后重新启动服务器 以便我可以看到我的更改 然而 我的应用程序
  • 何时使用 RabbitMQ 而不是 Kafka? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我被要求评估 RabbitMQ 而不是 Kafka 但发现很难找到消息队列比 Kafka 更合适的情况 有谁知道消息队列在吞吐量 耐用性 延迟或
  • 为什么需要消息队列来与 Web 套接字聊天?

    我在互联网上看到了很多使用 Web 套接字和 RabbitMQ 进行聊天的示例 https github com videlalvaro rabbitmq chat https github com videlalvaro rabbitmq
  • Celery 与rabbitmq 创建结果多个队列

    我已经用 RabbitMQ 安装了 Celery 问题是 对于返回的每个结果 Celery 都会在 Rabbit 中创建队列 并在交换 celeryresults 中使用任务 ID 我仍然想得到结果 但在一个队列上 我的芹菜配置 from
  • Erl 无法连接到本地 EPMD。为什么?

    Erlang R14B04 erts 5 8 5 source 64 bit rq 1 async threads 0 kernel poll false Eshell V5 8 5 abort with G root ip 10 101
  • RabbitMQ 管理插件窗口呈现为空白页面

    I have installed Erlang RabbitMQ and configured the management plugin as per the instructions on the website https www r
  • Amazon EC2 实例上和本地的 RabbitMQ?

    是否可以设置一个RabbitMQ服务器上的Amazon EC2 instance 并将我办公室的机器连接到此RabbitMQ服务器并向其发送 接收消息 我会被收取费用吗Amazon对于流入 流出我的带宽 消息RabbitMQ EC2 ins
  • rabbitmq 的 REST API

    有没有办法从 ajax 向 RabbitMQ 发送数据 我的应用程序由数千个 Web 客户端 用 js 编写 和 WCF REST 服务组成 现在我试图弄清楚如何为我的应用程序创建可扩展点 这个想法是有一个rabbitmq实例 它从放置在一
  • RabbitMQ 等待消息超时

    我想向 RabbitMQ 服务器发送一条消息 然后等待回复消息 在 回复 队列上 当然 我不想永远等待 以防处理这些消息的应用程序出现故障 需要有一个超时 这听起来像是一项非常基本的任务 但我找不到方法来做到这一点 我现在在使用 Java
  • 从 RabbitMQ 迁移到 Amazon SQS [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们的初创公司目前正在使用RabbitMQ with Python Django 对于消息队列 现在我们计划转移到Amazon SQS其高可用性
  • 使用 Spring 与 RabbitMQ 集成

    我正在为我们的一个应用程序开发消息传递界面 该应用程序是一种服务 旨在接受 作业 进行一些处理并返回结果 实际上以文件的形式 这个想法是使用 RabbitMQ 作为消息传递基础设施 并使用 Spring AMQP 来处理协议特定的细节 我不
  • RabbitMQ 中 Pub/Sub 与工作队列的混合

    我正在评估使用 RabbitMQ 作为消息队列 消息总线 并一直在查看示例教程 https www rabbitmq com getstarted html在 RabbitMQ 页面上 我正在寻找教程中未涵盖的特定场景 并且我不确定是否以及

随机推荐

  • 新手入门:PyCharm 的使用

    初次接触 pycharm 不要怕 xff0c 这篇文章帮你快速入门 xff0c 点击收藏不迷路 相关文章 xff1a Windows 10 同时安装 Python 2 和 Python 3 推荐一个视频 xff1a pycharm使用教程
  • EntityFrameworkCore 运行时数据迁移

    EntityFrameworkCore 以后简称EFCore 是 net core的一个orm框架 xff0c 以前在 net framework中使用时候利用code first可以在程序运行的时候自动迁移数据库 xff0c 更新数据库表
  • query.unwrap(SQLQuery.class).setResultTransformer弃用

    替换为 query unwrap span class token punctuation span NativeQueryImpl class span class token punctuation span setResultTran
  • pyinstaller报错AttributeError: type object ‘Callable‘ has no attribute ‘_abc_registry‘

    遇到问题 xff1a pyinstaller 打包文件时失败 xff0c 报错 xff1a AttributeError type object Callable has no attribute abc registry 解决方法 xff
  • Mysql数据库完全备份与恢复

    一 数据备份的重要性 在生产环境中 xff0c 数据的安全性是至关重要的 xff0c 任何数据的丢失都可能产生严重的后果 造成数据丢失的原因如下 程序错误人为错误计算机失败磁盘失败灾难 如火灾 地震 和盗窃 二 数据库备份的分类 1 从物理
  • [sourcetree] rebase的使用

    相关问题 最近写自己的辣鸡代码使用git时 xff0c 因为个人不大熟悉git又是个强迫症 xff0c 被来回不同的版本折腾来折腾去的 xff0c 十分不爽 xff0c 于是在此小结下sourcetree怎么使用变基 变基rebase这个操
  • mac下word有何无格式粘贴快捷键设置为默认方法

    补充说明 xff1a 后来使用发现可能是默认的快捷键 xff1a Command 43 V 粘贴无格式文本 xff1b control 43 V 粘贴格式文本 mac word 16 3之前的版本 xff0c 粘贴有Bug xff0c 只能
  • JVM内存管理

    一 物理内存与虚拟内存 xff1a 1 物理内存即RAM 随机存储器 2 寄存器 xff0c 用于存储计算单元指令 xff08 如浮点 xff0c 整数等运算 xff09 3 地址总线 xff1a 连接处理器和RAM 4 虚拟内存使得多个进
  • mongo

    mongo分页操作 与mysql数据库不同 xff0c mongo数据库是一种NoSQL数据库 xff0c 它的存储方式是以文档的形式进行存储的 本文主要记录了在开发过程中遇到的索引问题及数据库分页查询问题 常见的分页查询方式 1 使用li
  • RocketMQ本地环境搭建

    官网下载源码 建议到官网去下载 xff0c 本文使用的rocket的版本是基于4 7 1 xff0c 点击这里开始下载 导入idea rocketMQ是以maven的形式进行构建的 xff0c 因此直接使用ideaopen打开即可 xff0
  • 分布式事务-seata

    记录基于seata官网本地搭建seata的过程 下载seata软件报 Releases seata seata GitHub 将其解压缩 启动seata服务 sh seata server sh p 8091 h 127 0 0 1 m f
  • WKHtmltoPdf

    踩过的坑 请一定要使用下面的这种方式获取系统的可执行命令 xff0c 否则会报一堆的找不到目录等错误 xff01 xff01 xff01 String osname 61 System getProperty 34 os name 34 t
  • itext5 生成pdf

    最近项目中有需求 xff0c 需要生成一些打印的pdf数据 xff1b 经过调研发现使用itext生成的pdf的速度最快 下面讲解一下使用itext5 43 thymeleaf生成pdf的方法 xff1b 首先需要引入itext5相关的包
  • settings

    原理 通过 ContentProvider 和 ContentObserver实现的 调用方式 改值 span class token keyword void span span class token function test spa
  • Android BottomNavigationView修改导航文字大小无效的解决方法

    网上搜索到的大部分修改BottomNavigationView文字大小的方式 xff0c 都是通过dimens xml文件覆盖BottomNavigationView 底部导航栏默认使用的dimen来达到修改的效果 xff0c 但是在新的版
  • 同个局域网共享文件夹方法,ftp,多台电脑共同操作文件夹

    1 首先创建一个文件夹 xff08 命名随便 xff09 2 右键该文件夹选择属性 xff0c 进入该文件属性 xff0c 接着点击共享 xff0c 接下来就看下面图来操作就行了 选择了everyone后记得点添加 添加之后下面列表就会出现
  • MacOS 日历和群晖日历同步问题解决

    问题 xff1a 一直不能建立 群晖日历 账户 xff08 但可以订阅 xff09 2021 08 23 群晖日历和MAC日历不能同步问题 2021 08 23提示错误 xff1a 发生错误 xff0c 错误 1 解决 xff1a 1 主要
  • sudo apt-get install gcc-4.4 g++-4.4 g++-4.4-multilib

    问题 xff1a sudo apt get install gcc 4 4 g 43 43 4 4 g 43 43 4 4 multilib 正在读取软件包列表 完成 正在分析软件包的依赖关系树 正在读取状态信息 完成 没有可用的软件包 g
  • 如何修改电脑的MAC地址?

    常见的修改方式为修改有线的MAC地址 xff0c 本文主要讲述如何修改有限MAC地址 xff1b 首先第一步让电脑通过网线和交换机相连接 xff0c 这样才可以看到能够修改的网卡 xff1b 图中为未连接网线时的网络连接状态 xff0c 如
  • C#RabbitMQ消息队列的使用

    C RabbitMQ消息队列的使用 概念 1 消息 Message 消息指的是两个应用之间传递的数据 其中数据的类型可以有很多的形式 xff0c 可能只是包含文本字符串的一条消息 xff0c 也可能时一个嵌入的对象 2 消息队列 Meaas