初始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:

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

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

相关文章

【2023】java使用WebClient实现chatGPT调用建立web socket连接

&#x1f4bb;目录 一、介绍1、使用技术2、效果 二、代码1、前端代码2、后端代码2.1、maven依赖2.2、model2.2.1、请求接口的格式2.2.2、响应数据对象 2.3、工具类2.3.1、&#x1f534;使用WebClient调用chatgpt方法2.3.2、&#x1f7e0; webSocket连接对话方法 2.4、Controlle…

使用 OpenLLM 构建和部署大模型应用

原文&#xff1a;使用 OpenLLM 构建和部署大模型应用 - 知乎 分享主题为&#xff1a;使用 OpenLLM 快速构建和部署大语言模型的应用。OpenLLM 是一个开源的大语言模型&#xff08;LLM&#xff09;开发框架。它支持多种开源的 LLM 模型&#xff0c;并且具有内建的两个关键的 LL…

自然语言处理研究的内容

一.基础技术 1.1 词法分析 词法分析&#xff08;Lexical Analysis&#xff09;&#xff0c;也称为词法扫描或扫描器&#xff0c;是自然语言处理&#xff08;NLP&#xff09;中的基础步骤之一&#xff0c;用于将输入的文本分割成词法单元&#xff08;Token&#xff09;。词法单…

vulnhub-dc2靶场

DC2 配置环境vmware17 nat网络配置 下载地址:DC and Five86 Series Challenges - DC-1 &#xff08;似乎从2024/1/18左右找不到这个资源了&#xff09; 攻击机kali与其在同一网段下 ip:192.168.52.130 信息收集 arp-scan -l #内网探测&#xff0c;扫描目标ip发现目标ip1…

【服务器】搭建一台属于自己的服务器

​🌈个人主页:Sarapines Programmer🔥 系列专栏:【服务器】搭建网站⏰诗赋清音:云生高巅梦远游, 星光点缀碧海愁。 山川深邃情难晤, 剑气凌云志自修。 目录 1. 购买服务器和域名 1.1 购买服务器 1.1.1 阿里云服务器 1.1.2 香草云服务器 1.2 购买域名 2. 安装宝塔…

Blender——将模型及其所有纹理与材质导入unity

前期准备 参考视频&#xff1a;7分钟教会你如何将Blender的模型材质导入unity_哔哩哔哩_bilibili 实验模型官网下载地址&#xff1a;Hoi An Ancient House Model free VR / AR / low-poly 3D model CSDN下载链接&#xff1a; 【免费】Blender三维模型-古代房屋模型&#xff…

【Linux】第三十三站:日志

文章目录 一、实现一个简单的日志1.简介2.可变参数3.错误等级4.时间5.打印每一条参数6.与前面的一些代码搭配使用 二、完整代码 一、实现一个简单的日志 1.简介 我们运行代码的时候&#xff0c;我们希望有各种各样的运行时候的一些信息。这也就是日志 它一半有日志时间&…

【GitHub项目推荐--老照片变清晰】【转载】

先来看一个效果图&#xff0c;这个开源项目能把模糊爆浆的老照片 1 s 内变成清晰、高清的有色照片。 而以上这些效果&#xff0c;无需专业 PS 技能&#xff0c;只用一个网页端的 Demo、点点鼠标上传图片就能搞定。 这个修复神器&#xff0c;由腾讯 PCG ARC 实验室研发&#xf…

结构体大揭秘:代码中的时尚之选(上)

目录 结构结构的声明结构成员的类型结构体变量的定义和初始化结构体成员的访问结构体传参 结构 结构是一些值的集合&#xff0c;这些值被称为成员变量。之前说过数组是相同类型元素的集合。结构的每个成员可以是不同类型的变量&#xff0c;当然也可以是相同类型的。 我们在生活…

【系统调用IO】open、close、read、write、lseek

目录 3 系统调用IO3.1 文件描述符3.1.1 FILE结构体3.2.2 文件描述符 3.3 open、close、read、write、lseek3.3.1 文件权限3.3.2 open3.3.3 close3.3.4 read3.3.5 write3.3.6 lseek3.3.7 代码示例 文件io和标准io的区别 橙色 3 系统调用IO 3.1 文件描述符 3.1.1 FILE结构体 …

多线程编程1

一、线程的引入 上节&#xff0c;我们介绍了进程的概念&#xff0c;以及操作系统内核是如何管理进程的&#xff08;描述组织&#xff09;&#xff0c;PCB中的核心属性有哪些&#xff0c; 引入进程这个概念&#xff0c;最主要的目的&#xff0c;就是为了解决“并发编程”这样的…

JavaScript语法摘要

JavaScript语法摘要 JavaScript语法通过各种规则和组合&#xff0c;就能创建出丰富多彩的程序呢&#xff01;它包括了怎么声明和使用变量、如何定义和赋值&#xff0c;还有怎么用运算符和表达式等等。另外&#xff0c;我还发现了一些有趣的概念&#xff0c;比如关键字、注释、…

Python学习从0到1 day7 Python判断语句

路远殊途&#xff0c;祝你得偿所愿 ——24.1.21 前言 进行逻辑判断&#xff0c;是生活中常见的行为&#xff0c;同样&#xff0c;在程序中&#xff0c;进行逻辑判断也是最为基础的功能 一、布尔类型和比较运算符 1.布尔类型 进行判断&#xff0c;有两个结果&#xff0c;True、…

springboot集成COS对象存储

1.申请腾讯云存储桶 新建密钥&#xff08;后面配置要用到&#xff09; 2.编写工具类 此处使用工具类进行基本属性配置&#xff0c;也可选择在yml中配置 package com.sfy.util;import com.qcloud.cos.COSClient; import com.qcloud.cos.ClientConfig; import com.qcloud.cos.a…

基于xgboost-LGBM-SVM的病人哮喘病识别检测 数据+代码

基于xgboost-LGBM-SVM的病人哮喘病识别检测-完整代码可直接运行_哔哩哔哩_bilibili 代码: from sklearn import preprocessing import random from sklearn.model_selection import train_test_split from sklearn.preprocessing import MinMaxScaler from sklearn import pr…

声明式注解对XXL-JOB的定时任务代码生效吗?

说明&#xff1a;源于博主的思考&#xff0c;本文验证一下声明式注解&#xff0c;即Transactional注解&#xff0c;对XXL-JOB的定时任务是否生效。 准备 首先&#xff0c;创建一个需要事务的场景。有两张表&#xff0c;一张部门表&#xff0c;一张用户表&#xff0c;用户隶属…

基于YOLOv8的目标识别、计数、电子围栏的项目开发过程

0 前言 用于生产环境中物体检测、识别、跟踪&#xff0c;人、车流量统计&#xff0c;越界安全识别 1 YOLOv8概述 YOLOv8 是Ultralytics的YOLO的最新版本。作为一种前沿、最先进(SOTA)的模型&#xff0c;YOLOv8在之前版本的成功基础上引入了新功能和改进&#xff0c;以提高性…

cupy,一个超级实用的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个超级实用的 Python 库 - cupy。 Github地址&#xff1a;https://github.com/cupy/cupy 深度学习和科学计算需要处理大规模的数据和复杂的计算任务&#xff0c;而Python是一…

tag 标签

tag 标签 在使用 Git 版本控制的过程中&#xff0c;会产生大量的版本。如果我们想对某些重要版本进行记录&#xff0c;就可以给仓库历史中的某一个commit 打上标签&#xff0c;用于标识。 在本章中&#xff0c;我们将会学习如何列出已有的标签、如何创建和删除新的标签、以及…

20240116使用Firefly的AIO-3399J的预编译的Android10固件确认RT5640声卡信息

20240116使用Firefly的AIO-3399J的预编译的Android10固件确认RT5640声卡信息 2024/1/16 17:55 百度&#xff1a;RK3399 ALC5640 RK3399 RT5640 BING&#xff1a;RK3399 ALC5640 LINE-IN接麦克风不会有声音的。 耳机只有右边有声音&#xff0c;但是偏小&#xff0c;可以通过音量…