初步了解 RabbitMQ

news2025/6/19 4:15:14

目录

​编辑一、MQ 概述

1、MQ 的简介

2、MQ 的用途

(1)限流削峰

(2)异步解耦

(3)数据收集

二、RabbitMQ 概述

1、RabbitMQ 简介

2、四大核心概念

3、RabbitMQ 的核心部分 ​编辑

4、名词解释:

三、Hello World

1、依赖

2、消息生产者

 3、消息消费者


一、MQ 概述

1、MQ 的简介

MQ,Message Queue,是一种提供消息队列服务的中间件,也称为消息中间件,是一套提供了消息生产、存储、消费全过程API的软件系统。消息即数据。一般消息的体量不会很大。 

2、MQ 的用途

MQ 的用途有很多,但总结起来其实就是以下三点:

(1)限流削峰

MQ可以将系统的超量请求暂存其中,以便系统后期可以慢慢进行处理,从而避免了请求的丢失或系统被压垮。 

比如:用户请求 5000/s,但是只能处理 2000/s 的数据,那么这多出来的 3000 我们就称之为 “超量”

这多出来的超量,可能会导致系统直接被压垮,为了防止系统垮掉,一般会直接将多余的超量丢弃

为了防止这种情况的发生,可以引入 MQ

 系统可以直接从 MQ 中读取 2000,剩下的多余的 3000,存储在 MQ 内部,只要 MQ 足够大,那么这些数据就是不会丢失的,系统会慢慢对这些数据进行处理


(2)异步解耦

上游系统对下游系统的调用若为同步调用,则会大大降低系统的吞吐量与并发度,且系统耦合度太高。
而异步调用则会解决这些问题。所以两层之间若要实现由同步到异步的转化,一般性做法就是,在这两层间添加一个MQ层。 


(3)数据收集

分布式系统会产生海量级数据流,如:业务日志、监控数据、用户行为等。

针对这些数据流进行实时或批量采集汇总,然后对这些数据流进行大数据分析,这是当前互联网平台的必备技术。通过MQ完成此类数据收集是最好的选择。


二、RabbitMQ 概述

1、RabbitMQ 简介

RabbitMQ 是一个消息中间件:它接受并转发消息。你可以把它当做一个快递站点,当你要发送一个包裹时,你把你的包裹放到快递站,快递员最终会把你的快递送到收件人那里,按照这种逻辑 RabbitMQ 是一个快递站,一个快递员帮你传递快件。

RabbitMQ 与快递站的主要区别在于,它不处理快件而是接收,存储和转发消息数据

2、四大核心概念

生产者:

产生数据发送消息的程序是生产者

交换机:

交换机是 RabbitMQ 非常重要的一个部件,一方面它接收来自生产者的消息,另一方面它将消息
推送到队列中。交换机必须确切知道如何处理它接收到的消息,是将这些消息推送到特定队列还是推送到多个队列,亦或者是把消息丢弃,这个得有交换机类型决定

队列:

队列是 RabbitMQ 内部使用的一种数据结构,尽管消息流经 RabbitMQ 和应用程序,但它们只能存
储在队列中。队列仅受主机的内存和磁盘限制的约束,本质上是一个大的消息缓冲区。许多生产者可以将消息发送到一个队列,许多消费者可以尝试从一个队列接收数据。这就是我们使用队列的方式

消费者:

消费与接收具有相似的含义。消费者大多时候是一个等待接收消息的程序。请注意生产者,消费
者和消息中间件很多时候并不在同一机器上。同一个应用程序既可以是生产者又是可以是消费者。

3、RabbitMQ 的核心部分 

4、名词解释:

 

Broker:接收和分发消息的应用,RabbitMQ Server 就是 Message Broker

Virtual host:出于多租户和安全因素设计的,把 AMQP 的基本组件划分到一个虚拟的分组中,类似于网络中的 namespace 概念。当多个不同的用户使用同一个 RabbitMQ server 提供的服务时,可以划分出多个 vhost,每个用户在自己的 vhost 创建 exchange/queue 等

Connection:publisher/consumer 和 broker 之间的 TCP 连接

Channel:如果每一次访问 RabbitMQ 都建立一个 Connection,在消息量大的时候建立 TCP Connection 的开销将是巨大的,效率也较低。Channel 是在 connection 内部建立的逻辑连接,如果应用程序支持多线程,通常每个 thread 创建单独的 channel 进行通讯,AMQP method 包含了 channel id 帮助客户端和 message broker 识别 channel,所以 channel 之间是完全隔离的。Channel 作为轻量级的Connection 极大减少了操作系统建立 TCP connection 的开销 

Exchange:message 到达 broker 的第一站,根据分发规则,匹配查询表中的 routing key,分发
消息到 queue 中去。常用的类型有:direct (point-to-point), topic (publish-subscribe) and fanout 
(multicast)

Queue:消息最终被送到这里等待 consumer 取走

Binding:exchange 和 queue 之间的虚拟连接,binding 中可以包含 routing key,Binding 信息被保存到 exchange 中的查询表中,用于 message 的分发依据 


三、Hello World

1、依赖

    <!--指定 jdk 编译版本-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <!--rabbitmq 依赖客户端-->
        <dependency>
            <groupId>com.rabbitmq</groupId>
            <artifactId>amqp-client</artifactId>
            <version>5.8.0</version>
        </dependency>
        <!--操作文件流的一个依赖-->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>
    </dependencies>

2、消息生产者

/**
 * 生产者 : 发消息
 */
public class Producer {
    // 队列名称
    public static final String QUEUE_NAME = "hello";

    // 发消息
    public static void main(String[] args) throws IOException, TimeoutException {
        // 创建一个连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        // 工厂 IP 连接 rabbitmq 队列
        factory.setHost("111.229.153.16");
        // 用户名
        factory.setUsername("admin");
        // 密码
        factory.setPassword("123");

        // 创建连接
        Connection connection = factory.newConnection();
        // 获取信道
        Channel channel = connection.createChannel();
        /*
        生成一个队列
        1、队列名称
        2、队列里的消息是否持久化(磁盘)(默认存储在内存中)
        3、是否进行消费的共享
        4、是否自动删除 (最后一个消费者断开连接之后,是否自动删除)
        5、其它参数
         */
        channel.queueDeclare(QUEUE_NAME,false,false,false,null);
        // 发消息
        String message = "hello world";
        /*
        1、发送到哪个交换机
        2、路由的 key 值,本次是队列名称
        3、其它参数信息
        4、发送消息的消息体
         */
        channel.basicPublish("",QUEUE_NAME,null,message.getBytes());
        System.out.println("消息发送完毕");
    }
}

 3、消息消费者

/**
 * 消费者,接受消息
 */
public class Consumer {
    // 队列的名词
    public static final String QUEUE_NAME = "hello";

    // 接收信息
    public static void main(String[] args) throws IOException, TimeoutException {
        // 创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("111.229.153.16");
        factory.setUsername("admin");
        factory.setPassword("123");
        // 创建连接
        Connection connection = factory.newConnection();
        // 信道
        Channel channel = connection.createChannel();

        // 声明 接收消息
        DeliverCallback deliverCallback = (consumerTag,message) ->{
            System.out.println(new String(message.getBody()) );
        };
        // 取消消息的回调
        CancelCallback  cancelCallback = consumerTag ->{
            System.out.println("消息消费被中断");
        };
        /*
        消费者接收消息
        1、队列名
        2、消费成功之后,是否要自动答应
        3、消费者成功消费的回调
        4、消费者取消消费的回调
         */
        channel.basicConsume(QUEUE_NAME,true,deliverCallback,cancelCallback);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1186522.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MSR015/MSR025低温漂、低功耗电压基准

MSR015/MSR025 是低温漂、低功耗、高精度 CMOS 电压基准&#xff0c; 具有 0.05% 初始精度、低功耗特点。该器件的低输出电压迟滞和低长期输出电压 漂移特性&#xff0c;进一步提高稳定性和系统可靠性。 此外&#xff0c;器件的小尺寸和低运行 电流特性使其非常适合便携…

Stable Diffusion源码调试(三)

Stable Diffusion源码调试&#xff08;三&#xff09; 个人模型主页&#xff1a;LibLibai stable-diffusion-webui 版本&#xff1a;v1.4.1 内容更新随机&#xff0c;看心情调试代码~ shared 变量 shared变量&#xff0c;简直是一锅大杂烩&#xff0c;shared变量存放着程序…

debian 已安装命令找不到 解决方法

前言&#xff1a;安装了debian系统&#xff0c;更新完软件包安装软件之后发现很多命令找不到&#xff0c;查找命令路径发现命令已经安装了&#xff0c;但是没办法直接使用 更新软件包 &#xff08;第一次安装的系统一定要执行&#xff0c;不然可能无法安装软件&#xff09; apt…

说说对Fiber架构的理解?解决了什么问题?

一、问题 JavaScript引擎和页面渲染引擎两个线程是互斥的&#xff0c;当其中一个线程执行时&#xff0c;另一个线程只能挂起等待 如果 JavaScript 线程长时间地占用了主线程&#xff0c;那么渲染层面的更新就不得不长时间地等待&#xff0c;界面长时间不更新&#xff0c;会导…

设计模式之生产者/消费者模式

文章目录 1. 简介2. 代码实现 1. 简介 生产者消费者模式与保护性暂停模式的GuardObject不同&#xff0c;它不需要产生结果和消费结果的线程一一对应。它使用一个消息队列来平衡生产者和消费者的线程资源。其中生产者仅负责产生结果数据&#xff0c;不关心数据该如何处理&#…

小程序 打开方式 页面效果 表单页面 点击跳到详情页 图标 获取后台数据 进行页面渲染

请求地址&#xff1a;geecg-uniapp 同源策略 数据请求 获取后台数据 ui库安装 冲突解决&#xff08;3&#xff09;-CSDN博客 一.uniapp转小程序 (1) 运行微信开发工具 &#xff08;2&#xff09; 配置id 然后运行 打开小程序 路径 E:\通\uniapp-jeecg\unpackage\dist\d…

CSS特效003:太阳、地球、月球的旋转

GPT能够很好的应用到我们的代码开发中&#xff0c;能够提高开发速度。你可以利用其代码&#xff0c;做出一定的更改&#xff0c;然后实现效能。 css实战中&#xff0c;这种球体间的旋转&#xff0c;主要通过rotate()旋转函数来实现。实际上&#xff0c;蓝色的地球和黑色的月球…

C语言 每日一题 PTA 11.8 day14

1.矩阵A乘以B 给定两个矩阵A和B&#xff0c;要求你计算它们的乘积矩阵AB。需要注意的是&#xff0c;只有规模匹配的矩阵才可以相乘。 即若A有Ra​行、Ca列&#xff0c;B有Rb行、Cb列&#xff0c;则只有Ca与Rb​相等时&#xff0c;两个矩阵才能相乘。 输入格式&#xff1a; 输入…

Linux C语言(10)

数组指针和指针数组 1、数组指针 1.1 概念 数组指针&#xff1a;指向数组的指针 整型指针&#xff1a;指向数据类型是整型字符指针&#xff1a;指向数据类型是字符串数组指针&#xff1a;指向数组的指针结构体指针&#xff1a;指向结构体的指针 1.2 定义 存储类型 数据类型 …

再获5G RedCap能力认证!宏电5G RedCap工业智能网关通过中国联通5G物联网OPENLAB开放实验室测试验证

​近日&#xff0c;中国联通5G物联网OPENLAB开放实验室携手宏电股份完成5G RedCap工业智能网关端到端的测试验证&#xff0c;并颁发OPENLAB实验室面向RedCap终端的认证证书&#xff0c;为RedCap产业规模推广、全行业赋能打下坚实基础。 中国联通5G物联网OPENLAB开放实验室是中国…

2023年萤石C6C系列监控如何设置群晖Surveillance网络摄像机套件教程

2023年萤石C6C系列监控如何设置群晖Surveillance网络摄像机套件教程 前置工作莹石云视频App设置群晖Nas设置温馨提醒 前置工作 按照说明书安装好莹石监控摄像机&#xff0c;确保机器正常运作&#xff1b;设置好莹石云视频App&#xff0c;确保能够正常查看监控视频。在群晖Nas的…

【数据结构】树与二叉树(六):二叉树的链式存储

文章目录 5.1 树的基本概念5.1.1 树的定义5.1.2 森林的定义5.1.3 树的术语5.1.4 树的表示 5.2 二叉树5.2.1 二叉树1. 定义2. 特点3. 性质引理5.1&#xff1a;二叉树中层数为i的结点至多有 2 i 2^i 2i个&#xff0c;其中 i ≥ 0 i \geq 0 i≥0。引理5.2&#xff1a;高度为k的二叉…

JS将一个不止深度的对象转换成树结构

JS将一个不止深度的对象转换成树结构 示例数据 {"CODE": 200,"MSG": "SUCCESS","ENT_INFO": {"BREAKLAW": [],"ORGDETAIL": {},"YEARREPORTBASIC": [{"ANCHEYEAR": "2013","…

C# 压缩PDF文件

PDF 文件可以包含文本、图片及各种媒体元素&#xff0c;但如果文件太大则会影响传输效果同时也会占用过多磁盘空间。通过压缩PDF文件&#xff0c;能够有效减小文件大小&#xff0c;从而提高传输效率并节省存储空间。想要通过C#代码快速有效地压缩 PDF 文件&#xff0c;下面是实…

【MySQL篇】授权:授权与回收

前言 SQL通过GRANT和REVOKE语句实现向用户授予或收回对数据的操作权限。 发出GRANT法人可以是数据库管理员、数据库对象创建者&#xff08;即属主Owner&#xff09;、拥有该权限并且可以传播的用户。 SQL不允许循环授权。 权限与可执行的操作对照表拥有的权限可否执行的操作C…

day52

今日内容概要 web应用程序 手写web框架(帮助我们理解别人写好的成熟框架、重点在于思路的理解、代码无需掌握) Django框架的学习 Python中得主流框架 框架的下载、安装、版本、怎么启动、怎么使用等 三板斧问题 web应用程序 Django框架是一款专门用来开发web应用的框架 …

安卓学习记录

文章目录 Text_View基础属性字体阴影跑马灯**activity_main.xml**MyTextview button Text_View ctrl右键可以看到属性 代码整理采用的快捷键是ctrlaltL(电脑qq锁定快捷键&#xff0c;退一下qq就行了) 基础属性 字体阴影 <?xml version"1.0" encoding"utf-…

CSDN每日一题学习训练——Java版(逆序输出、Z 字形变换、输出每天是应该学习还是休息还是锻炼)

版本说明 当前版本号[20231108]。 版本修改说明20231108初版 目录 文章目录 版本说明目录逆序输出题目解题思路代码思路参考代码 Z 字形变换题目解题思路代码思路参考代码 输出每天是应该学习还是休息还是锻炼题目代码思路参考代码 逆序输出 题目 如&#xff1a;abcd1234&…

【Python 千题 —— 基础篇】录入学生信息

题目描述 题目描述 在开学时&#xff0c;需要录入学生的身份信息。每次在控制台输入学生身份证号&#xff0c;按下回车后录入新的信息。如果输入的身份证号已经录入过&#xff0c;需要提示 “该身份证号已录入” 并继续等待下一个输入。如果按下两次回车键&#xff0c;则结束…

软件测试/测试开发丨接口测试学习笔记,TcpDump与WireShark

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接&#xff1a;https://ceshiren.com/t/topic/27859 协议分析工具 网络监听&#xff1a;TcpDump WireShark 代理 Proxy 推荐工具&#xff1a;手工测试charles [全平台]、安全测试burpsuite [全平台 j…