Rabbitmq消息队列,安装,使用,三种工作模式

news2024/11/15 11:16:25

产品

消息队列技术介绍
消息队列概述

消息队列中间件是分布式系统中重要的组件,主要解决应用耦合、异步消息、流量削锋等问题。实现高性能、高可用、可伸缩和最终一致性架构。是大型分布式系统不可缺少的中间件。

目前在生产环境,使用较多的消息队列有ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ、RocketMQ等。

MQ概述

MQ全称 Message Queue([kjuː])(消息队列),是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信。

(队列是一种容器,用于存放数据的都是容器,存放消息的就是消息队列)

分布式系统的调用:

方式一:直接调用

order

product

account

方式二:间接调用

A将数据存放到中间一个系统,通过中间的系统发送到B

中间系统可以成为中间件MQ

生产者-》中间件《--消费者

MQ是用于存放消息的中间件

被调用者叫生产者 调用者是消费者(微服务中说过)

MQ的优势和劣势

优势

应用解耦:提高系统容错性和可维护性。

异步提速:提升用户体验和系统吞吐量。

削峰填谷:提高系统稳定性。

应用解耦

系统的耦合性越高,容错性就越低,可维护性就越低。

例:订单系统 的时候 依赖于库存系统 支付系统 物流系统 当库存系统发生异常,就有可能导致订单系统发生异常 下单失败

追加系统 x 就只能修改订单系统更改代码 导致维护性比较低

使用 MQ 使得应用间解耦,提升容错性和可维护性

库存系统宕机订单系统影响不大,因为消息已经发送到mq了当库存系统恢复的时候就可以正常使用了。

追加系统的时候跟订单系统无关

已将数据发送到MQ了,直接从MQ中拿就行了,无需更改订单中的代码,可维护性提高

异步提速

一个下单操作耗时:20 + 300 + 300 + 300 = 920ms

用户点击完下单按钮后,需要等待920ms才能得到下单响应,太慢!

用户点击完下单按钮后,只需等待25ms就能得到下单响应 (20 + 5 = 25ms)。

提升用户体验和系统吞吐量(单位时间内处理请求的数目)。

以前920ms处理一个请求,现在25ms处理一个请求,系统的吞吐量(单位时间内访问量)增加

削峰填谷(削峰)

使用了 MQ 之后,限制消费消息的速度为1000,这样一来,高峰期产生的数据势必会被积压在 MQ 中,高峰就被“削”掉了,但是因为消息积压,在高峰期过后的一段时间内,消费消息的速度还是会维持在1000,直到消费完积压的消息,这就叫做“填谷”。

使用MQ后,可以提高系统稳定性。

安装rabbitmq

安装依赖环境

yum -y install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c++ kernel-devel m4 ncurses-devel tk tc xz
方式一

使用rpm安装

创建好要放入的文件夹

把我们需要的包都放进文件夹里

然后用rpm命令安装

rpm -ivh socat-1.7.3.2-2.el7.x86_64.rpm
rpm -ivh erlang-22.0.7-1.el7.x86_64.rpm
rpm -ivh rabbitmq-server-3.7.18-1.el7.noarch.rpm

安装完毕

启动

systemctl start rabbitmq-server

开启管理页面

rabbitmq-plugins enable rabbitmq_management

修改配置文件

vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.7.18/ebin/rabbit.app 

将原来39行的内容改为

保存退出

重启

 systemctl restart rabbitmq-server

浏览器访问管理页面

http://192.168.184.34:15672/

默认用户密码都为guest

方式二

安装

yum install -y erlang
yum install -y rabbitmq-server

只需要这两条命令

配置管理页面

开启管理页面

rabbitmq-plugins enable rabbitmq_management

不需要修改配置文件直接使用guest/guest 就可以登录

启动

systemctl start rabbitmq-server

访问

http://192.168.184.34:15672/

注意:

Rabbitmq 端口号是:5672

管理端端口号是:15672

操作管理

添加用户

想给这个用户设置可以操作的虚拟主机

添加虚拟主机

把/yyl虚拟主机 赋给yyl用户进行操作

出现下图就是成功

添加消息队列

添加了一个队列后我们可以生产一条消息

点进我们刚创好的队列里

找到Publish message 生产一条消息然后点击Publish message 发送

可以看到我们的队列这里多了一条消息

消费消息

添加依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

编写配置类

package com.example.rabbitmq01.listener;
​
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
​
@Component
public class MyListener {
​
    @RabbitListener(queues = "test-one1")
    public void listen(Message message){
        byte[] body = message.getBody();
        String s = new String(body);
        System.out.println("监听到的消息是:"+s);
    }
​
​
}

yml文件

spring:
  rabbitmq:
    host: 192.168.227.99
    username: guest
    password: guest
    virtual-host: /cxy
server:
  port: 8090

启动

消费消息

成功监听到消息

消息被消费

添加交换机

创建好交换机,绑定我们的两个队列

绑定好之后交换机这里会显示,也可以看到绑定成功

因为我们默认交换机创建时是广播模式,所以交换机发送消息时会像广播一样所有的队列都能收到发送的消息

交换机发送消息,点击我们刚创建好的交换机

发送消息

可以看到,发送完消息后,因为我们的交换机的模式为广播模式,跟它绑定的队列都会收到消息

我们再次消费一下消息

可以看到,两个队列接收到的消息都是一样的

工作模式

可以看到,上面我们演示了三种工作模式,也分别对应了下面这三种

  1. 简单工作模式

生产者 队列 消费者

生产出一个消息给我们的队列,然后我们用工具去消费我们的消息

  1. 工作模式

队列之后

一个队列和两个消费者,两个消费者轮询接收消息

3.发布订阅模式

将我们的消息给交换机,交换机有三种模式:

Fanout: 广播模式 没有routingkey

没有key值,能给所有绑定的队列发送消息

Direct: 路由模式 有routingkey 值是固定的

有固定的key值,发送消息时可以选择key值发送,

也就是指定发送消息到哪个队列

Topic:主题模式 有routingkey 值是有通配符

没有固定的key值,但是有固定的格式,按消息的格式指定发送到哪个队列里

消息的可靠性传递

确认模式

Confirm

确认消费者是否接收到消息

回退模式

Return

查看交换机中的消息是否传递到队列里面

springboot整合rabbitmq

用代码创建一个交换机和两个队列,并且让两个队列绑定在交换机上,交换机的模式为路由模式,选择key值给两个中某个key值匹配的队列发消息,并且监听到消息

创建微服务,也就是在外面创建一个项目,里面有多个模块,我们只需在里面创建两个模块即可,一个作为生产者去生产消息,一个作为消费者去消费我们的数据

创建微服务

外面的项目只需留一个pom文件就好,在添加两个module模块,

右键创建模块

添加依赖(注:只需要在最外层的父项目添加依赖即可,子项目也可以使用夫项目的依赖)

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.2</version>
    </parent>
        <!--web项目-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
​
        <!-- 测试-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

两个子项目的yml文件

spring:
  rabbitmq:
    host: 192.168.227.99
    username: guest
    password: guest
    virtual-host: /cxy

生产者

创建交换机和两个队列

绑定

将两个队列绑定到交换机上并且附上了对应的key

package com.example.producter.config;
​
​
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
​
@Configuration
public class RabbitConfig {
​
    // 声明一个交换价
​
    public static final String EXCHANGE_NAME = "ROUTING_EXCAHNGE";
    public static final String QUEUE_NAME_1 = "ROUTING_QUEUE_1";
    public static final String QUEUE_NAME_2 = "ROUTING_QUEUE_2";
    public static final String ROUTING_KEY = "a";
​
    @Bean("exchange")
    public Exchange getExchange() {
        return ExchangeBuilder.directExchange(EXCHANGE_NAME).durable(false).build();
​
    }
​
    @Bean("queue1")
    public Queue getQueue1() {
        // 创建了一个队列  队列的名字是ROUTING_QUEUE_1 不持久化
        return QueueBuilder.nonDurable(QUEUE_NAME_1).build();
​
    }
​
    @Bean("queue2")
    public Queue getQueue2() {
        // 创建了一个队列  队列的名字是ROUTING_QUEUE_1 不持久化
        return QueueBuilder.nonDurable(QUEUE_NAME_2).build();
​
    }
​
    //绑定
    @Bean
    public Binding getBinding1(@Qualifier("exchange") Exchange exchange, @Qualifier("queue1")Queue queue) {
        // 交换机和队列进行绑定
        return BindingBuilder.bind(queue).to(exchange).with(ROUTING_KEY).noargs();
​
    }
​
    @Bean
    public Binding getBinding2(@Qualifier("exchange") Exchange exchange, @Qualifier("queue2")Queue queue) {
        // 交换机和队列进行绑定
        return BindingBuilder.bind(queue).to(exchange).with("b").noargs();
    }
​
    @Bean
    public Binding getBinding3(@Qualifier("exchange") Exchange exchange, @Qualifier("queue2")Queue queue) {
        // 交换机和队列进行绑定
        return BindingBuilder.bind(queue).to(exchange).with("c").noargs();
    }
}
生产消息

package com.example.producter;
​
import com.example.producter.config.RabbitConfig;
import org.junit.jupiter.api.Test;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.boot.test.context.SpringBootTest;
​
import javax.annotation.Resource;
​
@SpringBootTest
class ProducterApplicationTests {
​
    @Resource
    private RabbitTemplate rabbitTemplate;
    @Test
    void contextLoads() {
        rabbitTemplate.convertAndSend(RabbitConfig.EXCHANGE_NAME,"b","这是给消息队列b发的消息");
    }
​
}
启动这个子项目

添加成功

绑定成功

消息发送成功

消费者

接收消息

启动消费者项目

可以看到成功消费掉队列的消息

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

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

相关文章

基于51单片机的汽车倒车防撞报警器系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 本课题基于微控制器控制器&#xff0c; 设计一款汽车倒车防撞报警器系统。 要求&#xff1a; 要求&#xff1a;1.配有距离&#xff0c; 用于把车和障碍物之间的距离信号送入控制器。 2.配有报警系…

2024AI做PPT软件如何重塑演示文稿的创作

现在AI技术的发展已经可以帮我们写作、绘画&#xff0c;最近我发现了不少ai做ppt的工具&#xff01;不体验不知道&#xff0c;原来合理使用AI工具可以有效的帮我们进行一些办公文件的编写&#xff0c;提高了不少工作效率。如果你也有这方面的需求就接着往下看吧。 1.笔灵AIPPT…

内网穿透out了?黑群晖+IPv6+NAS公网助手的访问体验

科技宅最带折腾黑群晖&#xff0c;这不&#xff0c;尝试一下ipv6动态域名解析&#xff0c;远程访问群晖NAS的方法千千万&#xff0c;这个方法我早就想到了&#xff0c;今天终于体验了一把&#xff0c;把经验分享一下&#xff1a; 目录 黑群晖的魅力 IPv6的加入&#xff1a;无…

Python办公自动化教程(003):PDF的加密

【1】代码 from PyPDF2 import PdfReader, PdfWriter# 读取PDF文件 pdf_reader PdfReader(./file/Python教程_1.pdf) pdf_writer PdfWriter()# 对第1页进行加密 page pdf_reader.pages[0]pdf_writer.add_page(page) # 设置密码 pdf_writer.encrypt(3535)with open(./file/P…

上位机图像处理和嵌入式模块部署(linux小系统开发)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 和若干年前相比较&#xff0c;现在嵌入式linux开发要简单得多。稍微贵一点的有树莓派&#xff0c;国产的有各种水果派&#xff0c;基本上都可以按照…

苍穹外卖学习日志 -----20天项目从零到完结-----含软件下载,环境配置,框架学习,代码编写,报错处理,测试联调,每日总结,心路历程等等......

年份 2024 基础&#xff1a;Javase Javaweb 已完结 2024 8.25---9.14 20天 Day-01 8.25 今天开始学习已经晚了&#xff0c;网盘下载了一下文件&#xff0c;做了一些开始项目的准备工作。 本来其实打算用notepad来写学习日志的&#xff0c;但是那个传…

如何给bat文件替换好看的图标

最近遇到软件运行在Windows系统&#xff0c;通过bat文件启动&#xff0c;但是bat文件的图标不好看&#xff0c;而且作为启动快捷方式放桌面看上去跟其他软件不搭调&#xff0c;于是得给bat文件换个软件图标。 软件ico图标 Windows系统下使用.ico文件作为软件图标。另外favicon…

go libreoffice word 转pdf

一、main.go 关键代码 完整代码 package mainimport ("fmt""github.com/jmoiron/sqlx""github.com/tealeg/xlsx""log""os/exec""path/filepath" ) import _ "github.com/go-sql-driver/mysql"import &q…

Python练习宝典:Day 1 - 选择题 - 基础知识

目录 一、踏上Python之旅二、Python语言基础三、流程控制语句四、序列的应用 一、踏上Python之旅 1.想要输出 I Love Python,应该使用()函数。 A.printf() B.print() C.println() D.Print()2.Python安装成功的标志是在控制台(终端)输入python/python3后,命令提示符变为: A.&…

数业智能心大陆:职场倦怠的新解法

什么是职业倦怠&#xff1f; 在职场中&#xff0c;职业倦怠的表现形式丰富多样。从数业智能心大陆 AI 心理咨询平台的数据来看&#xff0c;职业倦怠呈现出多种状态。教师可能对教学不再满怀热情&#xff0c;精心备课也成为过去式&#xff1b;情绪上容易烦躁、易怒&#xff0c;在…

【d47_2】【Java】【力扣】1791.找出星型图的中心节点

思路 直接判断 edges[0][0] edges[0][1] edges[1][0] edges[1][1] 谁重复了 例如&#xff1a; [ [1,2] [2,3] ....],那么中心节点一定是2 代码 class Solution {public int findCenter(int[][] edges) {for (int i0;i<1;i){if (edges[1][0]edges[0][i]) {return edg…

车载软件调试工具系列---Trace32简介UI界面简介

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

java项目之常规应急物资管理系统(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的常规应急物资管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息。 项目简介&#xff1a; 基于SpringBootVue的…

TikTok流量不佳:是网络环境选择不当还是其他原因?

TikTok&#xff0c;作为全球短视频社交平台的佼佼者&#xff0c;每天都有海量的内容被上传和分享。然而&#xff0c;很多用户和内容创作者发现&#xff0c;他们的TikTok视频流量并不理想。这引发了一个问题&#xff1a;TikTok流量不佳&#xff0c;是因为网络环境选择不当&#…

S3C2440定时器

ee一、构造 二、设置相关位 1、MPLLCON寄存器&#xff08;配置MPLL寄存器&#xff0c;进行倍频&#xff09; 根据下列表格的想要输出的频率进行选择&#xff0c;选择完毕之后&#xff0c;对该寄存器进行设置 2、时钟分频控制&#xff08;CLKDIVN&#xff09;寄存器 根据不…

AD19基础应用技巧:交叉选择/跳转到器件/镜像粘贴/元器件矩形区域排列/选择过滤器/捕捉对象等设置

目录 1. 原理图<>PCB跳转2. 镜像粘贴3. 矩形区域排列4.选择过滤器5. 捕捉的对象Object for Snapping的设置 6.Grids/Guides/Axes1. **Grids&#xff08;网格&#xff09;**2. **Guides&#xff08;参考线&#xff09;**3. **Axes&#xff08;坐标轴&#xff09;**捕捉模式…

基于python的文本聚类分析与可视化实现,使用kmeans聚类,手肘法分析

1、数据预处理 由于在数据分析之前数据集通常都存在数据重复、脏数据等问题&#xff0c;所以为了提高 数据分析结果的质量&#xff0c;在应用之前就必须对数据集进行数据预处理。数据预处理的方法通常有清洗、集成、转换、规约这四个方面&#xff0c;接下来详细介绍这对爬取…

学习记录:js算法(四十二): 寻找两个正序数组的中位数

文章目录 寻找两个正序数组的中位数我的思路网上思路 总结 寻找两个正序数组的中位数 给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,3], n…

力扣72-编辑距离(Java详细题解)

题目链接&#xff1a;力扣72-编辑距离 前情提要&#xff1a; 因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。 dp五部曲。 1.确定dp数组和i下标的含义。 2.确定递推公式。 3.dp初始化。 4.确定dp的遍历顺序。 5.如果没有ac打印dp数组 利于debug。 每一个dp…

网络层协议 —— IP协议

目录 0.前言 1.IP协议的格式 2.IP地址 2.1IP地址的划分 国际间IP地址的划分 公有IP 私有IP 特殊的IP地址 国内IP地址的划分 2.2IP地址不足问题 2.3IP地址的功能 2.4如何使用IP地址 2.5IP地址的构成 3.网段划分 以前的方案 现在的方案 4.认识宏观网络 5.路由 …