初始RabbitMQ(入门篇)

消息队列(MQ)

本质上就是一个队列,一个先进先出的队列,队列中存放的内容是message(消息),是一种跨进程的通信机制,用于上下游传递消息,

为什么使用MQ:

削峰填谷:

MQ可以很好的做一个缓冲机制,例如在一个系统中有A和B两个应用,A是接收用户的请求的,然后A调用B进行处理.

这时有可能A收到的请求会达到一个峰值,由于A和B是直接调用的关系,所以B也是达到一个峰值,如果A 1s收到了3w次请求,那么B也是1s 收到3w次请求,这是对B的压力是非常大的,有可能会导致B直接宕机.

这时就可以使用消息队列来达到削峰填谷的效果.

 

我们可以在A和B之间添加一个消息队列,让A接收到请求之后,不在直接调用B了,而是将请求全部作为消息放入到消息队列中,而B则是直接在消息队列中获取消息(这个消息就是A放入的用户的请求),

这时让B按照一定的速率进行获取消息,

这样做之后,尽管出现1s 3万的请求,这时我们的A会将所有的请求全部放入消息队列中,然后B会将消息队列中的消息按照一定的速率进行获取,这个时候B就不会出现同一时刻有大量的请求同时触发了.(这就是削峰)

当A接收的请求次数降低之后,这时就会达到一个波谷,此时B任然还可以按照一定的速率进行获取消息队列中的消息,(也就是之前挤压的数据),(填谷)

生产者消费者模型

MQ的四大核心概念:

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

交换机:是消息队列中一个部件,可以接收来自生产者的消息,也可以将消息推送到消息队列中,交换机必须确切的知道要如何处理接收到的消息,是将消息推送到特定的队列,还是将消息推送到所有队列中,获取将消息丢弃.

队列:是消息队列内部的一种数据结构,尽管消息是通过消息队列流经应用程序的,但是消息只能存储在队列中,队列本质是一个大的消息缓冲区,许多生产者可以将消息发送到一个队列,许多消费者可以从一个队列中获取消息.

消费者: 消费者与接受者具有相同的含义,消费者大多数是一个等待接收消息的应用程序.

 消息队列的工作原理

Broker(中间人) 接收和分发消息的应用,消息队列服务器就是Broker.

virtual host : 当不同的用户在使用同一个消息队列时,可以划分出多个vhost,每个用户在自己的vhost中创建自己的exchange和queue.

connection: 连接 生成者(Producer)和消费者(Consumer)与消息队列之间的TCP连接.

channel: 如果每次访问消息队列都要建立一个TCP连接,那么当消息很多的时候,就会建立很多TCP连接,这时建立TCP连接的开销是非常大的,效率也是很低的.channel是在connection内部建立的逻辑连接,而且channel之间是完全隔离的.

exchange: 交换机,这是消息到达消息队列的第一站,消息队列会根据分发规则,匹配查询表中的routing key 将消息分发的对应的queue中去.

queue: 消息在这里等待被Consumer(消费者)取走.

binding: exchange和queue之间的逻辑连接.,binding可以包含routingKey,Binding信息被保存到exchange中的查询表中,用户消息的分发.

 安装RabbitMQ

环境:CentOS7

注意:需要下载RabbitMQ的依赖以及RabbitMQ的安装包和erlang,同时在下载的时候需要注意版本问题. 

这里我已经准备好了对应的安装包,需要可以私信我,我发给大家.
将我们准备好的安装包传输到CentOS上之后,就可以进行安装了.

安装erlang

rpm -ivh erlang-23.3.4.11-1.el7.x86_64.rpm

安装erlang 依赖

rpm -ivh openssl-libs-1.0.2k-25.el7_9.x86_64.rpm

安装 socat 依赖

yum install socat -y

安装rabbitMQ

rpm -ivh rabbitmq-server-3.8.8-1.el8.noarch.rpm

启动服务

systemctl start rabbitmq-server

查看服务状态

systemctl status rabbitmq-server

开机自启动

systemctl enable rabbitmq-server

停止服务

systemctl stop rabbitmq-server

重启服务

systemctl restart rabbitmq-server

安装 Web 端的客户端软件

rabbitmq-plugins enable rabbitmq_management 需要打开默认端口

防火墙打开15672端口

网页通过http://IP:端口进行访问 默认账号密码guest

添加一个远程登录的用户

创建账号和密码

rabbitmqctl add_user DGZ Dgz@#151

设置用户角色

rabbitmqctl set_user_tags DGZ administrator

为用户添加资源权限,添加配置、写、读权限

rabbitmqctl set_permissions -p "/" DGZ ".*" ".*" ".*"

修改密码

rabbitmqctl change_ password 用户名 新密码

删除用户

rabbitmqctl delete_user 用户名

查看用户清单

rabbitmqctl DGZ

RabbitMQ的入门案例

创建的一个maven工程或者springBoot项目都可以.

引入依赖

<!--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>

创建生产者

public class Producer {
    //队列名称
    public static final String QueueName = "hello";
    public static void main(String[] args) throws IOException, TimeoutException {
        ConnectionFactory factory = new ConnectionFactory();   //创建连接工厂
        factory.setHost("127.0.0.1");  //这里的IP地址就是大家centos的IP地址
        factory.setUsername("DGZ"); //用户名
        factory.setPassword("Dgz@#151"); // 密码
        Connection connection = factory.newConnection();  //通过连接工厂创建一个连接
        Channel channel = connection.createChannel();  //获取信道
        /**
         * 生产一个对列
         * 1.对列名称
         * 2.对列里面的消息是否持久化,默认情况下,消息存储在内存中
         * 3.该队列是否只供一个消费者进行消费,是否进行消息共享,true可以多个消费者消费 false:只能一个消费者消费
         * 4.是否自动删除,最后一个消费者端开链接以后,该队列是否自动删除,true表示自动删除
         * 5.其他参数
         */
        channel.queueDeclare(QueueName,false,false,false,null);
        String message = "hello world";
        /**
         * 发送一个消息
         * 1.发送到哪个交换机
         * 2.路由的key值是哪个本次是队列的名称
         * 3.其他参数信息
         * 4.发送消息的消息体
         */
        channel.basicPublish("",QueueName,null,message.getBytes());
        System.out.println("消息发送完毕");
    }
}

创建消费者

public class Consumer {
    public static final String QueueName = "hello";
    public static void main(String[] args) throws IOException, TimeoutException {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setUsername("DGZ");
        factory.setPassword("Dgz@#151");
        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.消费成功之后是否要自动应答true:代表自动应答false:代表手动应答
         * 3.消费者未成功消费的回调
         * 4.消费者取消消费的回调
         */
        channel.basicConsume(QueueName,true,deliverCallback,cancelCallback);
    }
}

此时我们先启动生产者代码,然后在启动消费者代码.这样一个简单的RabbitMQ的入门案例就完成了.

WorkQueues(工作队列)

WorkQueues是工作队列,又称任务队列,主要思想就是避免立即执行资源密集型任务,而不得不等待它完成.

相反我们安排任务在之后执行,我们把任务封装为消息并将其发送到队列,在后台运行的工作进程将弹出任务并最终执行作业,当有多个工作线程时,这些工作线程将一起处理这些任务.

 我们将消费者main方法设置为开启对个实例之后,然后生产者发送消息,此时就会发送消费者是以轮询消费的方式消费消息的.

生产者:

消费线程1:

消费线程2:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++ STL之string的使用及模拟实现

文章目录 1. 前言2. 介绍3. string类的使用3.1 string类的构造函数3.2 string类对象的容量操作3.3 string类对象的访问及遍历操作3.4 string类对象的修改操作3.5 string类对象的字符串操作3.6 string类的非成员函数 4. string类的模拟实现 1. 前言 C语言中&#xff0c;字符串是…

如何在 Ubuntu / Raspbian 上安装 MariaDB

Raspberry Pi OS&#xff08;原为Raspbian&#xff09;是为树莓派基于Debian开发的操作系统。 从2015年起&#xff0c;树莓派基金会正式将其作为树莓派的官方操作系统。 Raspbian是由Mike Thompson和Peter Green创建的一个独立项目。第一个版本于2012年6月发布&#xff0c;至…

php基础学习之变量

php使用变量的必要性 PHP 是一种动态网站开发的脚本语言&#xff0c;动态语言特点是交互性&#xff0c;会有数据的传递&#xff0c;而 PHP作为“中间人”&#xff0c;需要进行数据的传递&#xff0c;传递的前提就是 PHP 能自己存储数据(临时存储) php变量的命名规则 必须以do…

Android Studio 之 菜单 Menu

选项菜单 OptionsMenu 用xml添加&#xff08;更建议使用&#xff09; 创建一个菜单布局 : 在 res文件下新建一个menu 目录&#xff0c;此时的菜单id为&#xff1a;R.menu.option <?xml version"1.0" encoding"utf-8"?> <menu xmlns:android&…

从一到无穷大 #21 从基于多数据模型分析负载的Benchmark讨论多模数据库的发展方向

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作)&#xff0c;由 李兆龙 确认&#xff0c;转载请注明版权。 文章目录 引言M2Bench测试结果从Lindorm看待多模的发展方向总结 引言 《M2Bench: A Database …

Java 面向对象 03 就近原则和this关键字

对于起名字需要见名知意&#xff0c;所以这个String n 不太合适&#xff1a; 但是如果将n改为name&#xff0c;会与第五行代码的name重复&#xff1a; 运行代码发现&#xff0c;获取后的姓名为默认值&#xff0c;是null 引入就近原则&#xff1a; 此处打印的是age10&#xff0c…

CPU相关专业名词介绍

CPU相关专业名词 1、CPU 中央处理器CPU&#xff08;Central Processing Unit&#xff09;是计算机的运算和控制核心&#xff0c;可以理解为PC及服务器的大脑CPU与内部存储器和输入/输出设备合称为电子计算机三大核心部件CPU的本质是一块超大规模的集成电路&#xff0c;主要功…

2024.1.21周报

目录 摘要 ABSTRACT 一、文献阅读 一、题目 二、摘要 三、Introduction 四、模型 一、连续时间模型 二、离散时间模型 五、结论 二、实验代码 Navier–Stokes equation 总结 摘要 本周我阅读了一篇题目为Physics-informed neural networks: A deep learning fra…

IDEA2023.2 将普通项目转Maven项目

1、选中一个普通工程&#xff1a; 2、快捷键&#xff1a;ctrlshift a&#xff0c;搜索&#xff1a;Add Framework Support… 3、勾选maven&#xff0c;点击ok。

信息安全概述

信息安全&#xff1a;防止任何对数据进行未授权访问的措施&#xff0c;或者防止造成信息有意无意泄漏、破坏、丢失等问题的发生&#xff0c;让数据处于远离危险、免于威胁的状态或特性。 网络安全&#xff1a;计算机网络环境下的信息安全。 信息安全现状及挑战 数字化时代威…

分布式 session

分布式 session 种 session 的时候需要注意范围&#xff0c;也就是 cookie.domain。 比如两个域名&#xff1a;a.heo.com&#xff0c;b.heo.com。如果要共享 cookie&#xff0c;可以种一个更高层的公共域名&#xff0c;比如 heo.com。 当服务器 A &#xff08;localhost:808…

构建高可用消息队列系统 01

构建高可用消息队列系统 01 引言1. RabbitMQ简介介绍1.1 什么是RabbitMQ1.2 RabbitMQ的核心特性1.3 RabbitMQ与AMQP 2.安装RabbitMQ3.消息队列实践总结 引言 在当今互联网时代&#xff0c;消息队列系统扮演着至关重要的角色&#xff0c;它们被广泛应用于分布式系统、微服务架构…

黑马Java——ArrayList集合

目录 1.ArrayList 集合和数组的优势对比&#xff1a; 1.1 ArrayList类概述 1.2 ArrayList类常用方法 1.2.1 构造方法 1.2.2 成员方法 2.练习 2.1添加字符串和数组并遍历 2.1.1添加字符串 2.1.2添加数字 2.2添加学生对象并遍历 2.2.1直接给字符串赋值 2.2.2对象的数…

【Unity学习笔记】Unity TestRunner使用

转载请注明出处&#xff1a;&#x1f517;https://blog.csdn.net/weixin_44013533/article/details/135733479 作者&#xff1a;CSDN|Ringleader| 参考&#xff1a; Input testingGetting started with Unity Test FrameworkHowToRunUnityUnitTest如果对Unity的newInputSystem感…

STM32 Hal库FreeRtos查看所有任务的内存栈信息使用情况剩余空间 仅需一个函数搞定 超简单

STM32F103 基于Hal库跑FreeRtos&#xff0c;查看所有任务的栈的信息&#xff0c;包括任务名&#xff0c;任务状态&#xff0c;任务优先级&#xff0c;空闲栈&#xff0c;任务号。 运行结果如下 只需要使用一个函数vTaskList &#xff1a;获得任务的统计信息&#xff0c;形式为…

2024年,给程序员的六点建议

作为程序员&#xff0c;持续进步和发展是至关重要的。除了技术能力的提升&#xff0c;还有一些关键的行为和思维方式可以帮助工程师在职业生涯中取得更大的成功。本文将提供六个重要的建议&#xff0c;这些建议将帮助程序员在职业生涯中迈出成功的步伐。 走出舒适区 走出舒适区…

HarmonyOS【应用服务开发】在模块中添加Ability

Ability是应用/服务所具备的能力的抽象&#xff0c;一个Module可以包含一个或多个Ability。应用/服务先后提供了两种应用模型&#xff1a; FA&#xff08;Feature Ability&#xff09;模型&#xff1a; API 7开始支持的模型&#xff0c;已经不再主推。Stage模型&#xff1a;AP…

CMU15-445-Spring-2023-分布式DBMS初探(lec21-24)

Lecture #21_ Introduction to Distributed Databases Distributed DBMSs 分布式 DBMS 将单个逻辑数据库划分为多个物理资源。应用程序&#xff08;通常&#xff09;并不知道数据被分割在不同的硬件上。系统依靠单节点 DBMS 的技术和算法来支持分布式环境中的事务处理和查询执…

企业SRC挖掘个人看法

昨晚上课网安的老师带我们现场挖掘漏洞&#xff0c;可谓是一场视觉盛宴&#xff01;&#xff01;&#xff01; <---老师 我--> 真的没有对比就没有伤害&#x1f62d;&#x1f62d;&#x1f62d;&#xff0c;其间他也分享了一些漏洞挖掘的思路&#xff0c;让我来回顾…

Mysql-全局锁、表锁、行锁

本文已收录于专栏 《数据库》 目录 全局锁概述说明开启方式应用场景 表锁概念说明实现方式意向锁 开启方式 行锁概念说明实现方式记录锁&#xff1a;间隙锁临键锁 总结提升 全局锁 概述说明 全局锁是是对整个数据库实例加锁&#xff0c;加锁后整个实例就处于只读状态&#xff…