RabbitMQ入门概念

目录

一、RabbitMQ入门

1.1 rabbitmq是啥?

1.2 应用场景

1.3 AMQP协议与RabbitMQ工作流程

1.4 Docker安装部署RabbitMQ

二、SpringBoot连接MQ配置

2.1 示例1

 2.1 示例2 —— 发送实体


一、RabbitMQ入门

1.1 rabbitmq是啥?

MQ(Message queue 释义):消息队列,本质上就是一个队列。

  • 服务之间最常见的通信方式是直接调用彼此来通信,消息从一端发出后立即就可以达到另一端,称为即时消息通讯(同步通信)
  • 消息从某一端发出后,首先进入一个容器进行临时存储,当达到某种条件后,再由这个容器发送给另一端,称为延迟消息通讯(异步通信)

        而消息队列(Message Queue)是在消息的传输过程中保存消息的容器。在消息队列中,通常有生产者和消费者两个角色。生产者只负责发送数据到消息队列,谁从消息队列中取出数据处理,他不管。消费者只负责从消息队列中取出数据处理,他不管这是谁发送的数据。

1.2 应用场景

        RabbitMQ是一个消息代理 - 一个消息系统的媒介。它可以为你的应用提供一个通用的消息发送和接收平台,并且保证消息在传输过程中的安全。

ribbitmq主要解决异步处理、应用解耦、流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构

  • 异步处理

如图所示:当一个用户购买了商品,订单开始发送发货通知——>刷新商品推荐(重新计算用户的喜好)——>增加会员积分,这些时间加一起就要150ms。而使用的RabbitMQ之后,将订单的求情放到rabbitmq容器中,不需要等待其他服务处理完再返回结果,让他们自己去rabbitmq排队处理。

  • 解耦 

如图所示:假设有系统B、C、D都需要系统A的数据,于是系统A调用三个方法发送数据到B、C、D。这时,系统D不需要了,那就需要在系统A把相关的代码删掉。假设这时有个新的系统E需要数据,这时系统A又要增加调用系统E的代码。为了降低这种强耦合,就可以使用MQ,系统A只需要把数据发送到MQ,其他系统如果需要数据,则从MQ中获取即可。 

  • 削峰 

应用场景:秒杀活动,一般会因为流量过大,导致流量暴增,应用挂掉。为解决这个问题,一般需要在应用前端加入消息队列

  1. 可以控制活动的人数
  2. 可以缓解短时间内高流量压垮应用 

如图所示:这其实是MQ一个很重要的应用。假设用户在某一段时间请求数暴增,有5000个请求发送过来,系统这时就会发送5000条SQL进入MySQL进行执行,MySQL对于如此庞大的请求当然处理不过来,MySQL就会崩溃,导致系统瘫痪。如果使用MQ,系统不再是直接发送SQL到数据库,而是把数据发送到MQ,MQ短时间积压数据,然后由消费者每次拉取2000条进行处理,防止在请求峰值时期大量的请求直接发送到MySQL导致系统崩溃

1.3 AMQP协议与RabbitMQ工作流程

        AMQP:一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。

像RabbitMQ这样的消息队列实现是基于AMQP协议的,如果先了解一条消息从投递到消息队列到被消费者消费的生命周期,再来深入了解RabbitMQ的使用那就很easy。

  • 消息(Message):即客户端与消息中间件传送的数据。
  • 生产者(Publisher):消息发起人。
  • 消费者(Consumer):消息消费者。
  • 交换机(Exchange):接收消息,并将消息路由转发给消息队列。
  • 虚拟主机(Virtual Host):进行逻辑隔离,一个虚拟主机可以创建若干个交换机和队列。
  • 绑定(Binding):交换机和队列之间的虚拟连接。
  • 路由键(Routing Key):路由规则,虚拟机可以用来确定如何路由一个特定的消息。
  • 队列(Queue):存储即将被消费者消费掉的消息。
  • 中间件(Broker ):实现AMQP实体服务,比如常见的RabbitMQ、Azure Service Bus等。
  • 信道(Channel):网络信道,是建立在Connection连接之上的一种轻量级的连接,可以创建多个信道。
  • 连接(Connection):一个网络连接,比如TCP/IP连接。AMQP连接通常是长连接,当一个应用不再需要连接到AMQP代理的时候,需要释放掉 AMQP 连接,而不是直接将TCP连接关闭。

工作过程:

1.生产者发布消息,经由交换机。
2.交换机根据路由规则将收到的消息分发给与该交换机绑定的队列。
3.最后消息中间件会将消息投递给订阅了此队列的消费者,或者消费者按照需求自行获取。

4.消费者在成功处理消息后向 RabbitMQ 发送确认(ACK)。这告诉 RabbitMQ 可以安全地从队列中删除该消息。如果消费者在处理消息时发生错误,RabbitMQ 可以将消息重新分发给其他消费者。

可靠性与持久性:RabbitMQ 提供了消息的持久性选项,允许将消息和队列标记为持久的。这确保即使 RabbitMQ 服务器重启,消息和队列也不会丢失。

技术选型:

1.4 Docker安装部署RabbitMQ

  •  拉取镜像
docker pull rabbitmq:management

注意获取镜像的时候要获取management版本的,不要获取last版本的,management版本的才带有管理界面。

  •  创建容器

1、创建宿主机目录

防火墙开放端口:

firewall-cmd --zone=public --add-port=5672(15672)/tcp --permanent

docker run -itd \
--name my-rabbitmq \
-p 5672:5672 -p 15672:15672 \
-v /home/rabbitmq:/var/lib/rabbitmq \
--hostname my-rabbitmq-host \
-e RABBITMQ_DEFAULT_VHOST=my_vhost \
-e RABBITMQ_DEFAULT_USER=ycxw \
-e RABBITMQ_DEFAULT_PASS=123 \
--restart=always \
rabbitmq:management

--hostname:主机名(RabbitMQ的一个重要注意事项是它根据所谓的 “节点名称” 存储数据,默认为主机名)

-e:指定环境变量:

  • RABBITMQ_DEFAULT_VHOST:默认虚拟机名
  • RABBITMQ_DEFAULT_USER:默认的用户名
  • RABBITMQ_DEFAULT_PASS:默认用户名的密码
  • 访问RabbitMQ管理平台

 登录进入之后就可看到一些用户数据、所管理的虚拟主机、队列等等。。。这里不做详细讲解,简单了解请看目录:1.3

二、SpringBoot连接MQ配置

2.1 示例1

1、创建项目:publisher 生成者 , consumer 消费者

rabbitmq需要导入amqp依赖

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

 2、rabbitmq连接配置

生产者端口:8888        消费者端口:6666

注意!!!

        需等生产者创建队列后并发送过一次信息被rabbitmq接受,消费者才能启动项目,不然会报错找不到连接的队列名

server:
  port: 8888
spring:
  rabbitmq:
    #虚拟机地址
    host: 192.168.83.129
    port: 5672
    #rabbitmq注册用户与密码
    username: ycxw
    password: 123
    virtual-host: my_vhost
  • 生产者(publisher) 

3、创建Rabbit配置类RabbitConfig,配置类主要用来配置队列、交换器、路由等高级信息

package com.ycxw.publisher.demos;

import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@SuppressWarnings("all")
public class RabbitConfig {
    @Bean
    public Queue firstQueue() {
        return new Queue("firstQueue");
    }
}

4、创建消息产生者类

package com.ycxw.publisher.demos;

import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class Sender {
    @Autowired
    private AmqpTemplate rabbitTemplate;

    @RequestMapping("/send1")
    public String sendFirst() {
        /*向消息队列发送消息 converAndSend(队列名,发送的信息)*/
        rabbitTemplate.convertAndSend("firstQueue", "Hello World");
        return "🫶";
    }
}

  • 消费者

5、编写接受队列的消息方法

package com.ycxw.consumer.demos;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues = "firstQueue") //监听消息队列
public class Receiver {

    //处理接受的信息
    @RabbitHandler
    public void process(String msg) {
        log.warn("接收到:" + msg);
    }
}

 6、测试

生产者发起请求:

rabbitmq管理界面查看数据:

消费者接受信息:

 2.1 示例2 —— 发送实体

注意!!!

  1. 处理不同请求许再创建一个队列
  2. 实体需进行序列化才可发送
  3. 发送实体,需要两个模块的实体必须同名同包下         

1、创建实体类

package com.ycxw.publisher.demos;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

//实现spring自带序列化接口
@SuppressWarnings("all")
@AllArgsConstructor
@NoArgsConstructor
@Data
public class User implements Serializable {
    private String username;
    private String userpwd;
}

 

 2、创建队列(生产者)

3、 编写发送信息方法

注入ObjectMapper类将实体装换成json格式的数据进行发送 

 4、接受信息(消费者)

package com.ycxw.consumer.demos;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues = "secondQueue") //监听消息队列
public class Receiver2 {

    @Autowired
    private ObjectMapper objectMapper;

    //处理接受的信息
    @RabbitHandler
    public void process(String json) throws JsonProcessingException {
        //将接受的json数据转换成实体
        User ycxw = objectMapper.readValue(json, User.class);
        log.warn("接收到:" + ycxw);
    }
}

5、测试

消费者接受的信息

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

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

相关文章

solidworks 焊接型材库

型材库中有大部分型材 H型钢有49种 八角钢有40种 扁钢有60种 不等边钢有84种 槽钢有41种 也可以按照自己需要的去添加 下载地址https://download.csdn.net/download/jintaihu/19347986

opencv——将2张图片合并

效果演示: 带有绿幕的图片的狮子提取出来,放到另一种风景图片里! 1. 首先我们要先口出绿色绿幕,比如: 这里将绿色绿色绿幕先转为HSV,通过修改颜色的明暗度,抠出狮子的轮廓。 代码 : import cv2 as cv import numpy as np import matplotlib.pyplot as plt def showI…

3671系列矢量网络分析仪

01 3671系列矢量网络分析仪 产品综述&#xff1a; 3671系列矢量网络分析仪产品包括3671C&#xff08;100kHz&#xff5e;14GHz&#xff09;、3671D&#xff08;100kHz&#xff5e;20GHz&#xff09;、3671E&#xff08;100kHz&#xff5e;26.5GHz&#xff09;、3671G&#x…

幻兽帕鲁服务器多少钱?幻兽帕鲁服务器价格,2月最新

2024年幻兽帕鲁服务器价格表更新&#xff0c;阿里云、腾讯云和华为云Palworld服务器报价大全&#xff0c;4核16G幻兽帕鲁专用服务器阿里云26元、腾讯云32元、华为云26元&#xff0c;阿腾云atengyun.com分享幻兽帕鲁服务器优惠价格表&#xff0c;多配置报价&#xff1a; 幻兽帕鲁…

(HAL)STM32F407ZGT6——10-4 高级定时器 PWM 输入模式实验

一、高级定时器简介 高级定时器的框图和通用定时器框图很类似&#xff0c;只是添加了其它的一些功能&#xff0c;如&#xff1a;重复计数器、带死区控制的互补输出通道、断路输入等。 高级定时器的时钟来自APB2, 而PCLK2 168Mhz, 我们设置PPRE2不分频, 因此高级定时器时钟 …

RTC实时时钟之读取时间

1. RTC 基本介绍 RTC(Real Time Clock) 即实时时钟&#xff0c;它是一个可以为系统提供精确的时间基准的元器件&#xff0c;RTC一般采用精度较高的晶振作为时钟源&#xff0c;有些RTC为了在主电源掉电时还可以工作&#xff0c;需要外加电池供电 2. RTC 控制器 2.1 RTC的特点是:…

NC248:左叶子之和(C++)

1.题目描述 2.题目分析 我们以一个二叉树为例 左叶子的特点是什么&#xff1f; 是左节点并且没有左右孩子节点 所以我们用leftnode保存root->lefe节点&#xff0c;判断条件为leftnode存在&#xff0c;并且不存在leftnode->left和leftnode->right&#xff0c;如果满…

[力扣 Hot100]Day18 矩阵置零

题目描述 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 出处 思路 在原数组上直接操作势必会出现“冗余”的0&#xff0c;即原本[i,j]处不是0&#xff0c;例如由于i行的其他位置有0导致[i,j]…

Kali Linux初识

Kali Linux&#xff08;以前称为 BackTrack Linux&#xff09;是一个开源的、基于 Debian 的 Linux 发行版&#xff0c;旨在进行高级渗透测试和安全审计。它通过提供通用工具、配置和自动化来做到这一点&#xff0c;使用户能够专注于需要完成的任务。 包括 600 多种渗透测试工…

LeetCode 使循环数组所有元素相等的最少秒数

地址&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 难度&#xff1a;中等 题目描述&#xff1a;给你一个下标从 0 开始长度为 n 的数组 nums 。 每一秒&#xff0c;你可以对数组执行以下操作&#xff1a; 对于范围在 [0, n - 1] 内的每…

【中关村开源生态论坛暨大模型智能应用技术大会】—— 探索AI和开源在未来的应用

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-9ttR7rpX3BzyF2C4 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

任务悬赏系统搭建开发定制,任务分销系统

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、任务悬赏系统功能和运营方式 总结 前言 任务悬赏系统就是在小程序内可以做任务赚取佣金&#xff0c;这款系统主要针对手上有达人资源的用户可以冲一下这个项目…

(自用)learnOpenGL学习总结-高级OpenGL-几何着色器

在顶点着色器和片段着色器中间还有一个几何着色器。 几何着色器的输入是一个图元的一组顶点&#xff0c;在几何着色器中进行任意变换之后再给片段着色器&#xff0c;可以变成完全不一样的图元、可以生成更多的顶点。 #version 330 core layout (points) in; layout (line_str…

MySql 慢SQL配置,查询,处理

一.慢SQL配置相关 1.查看慢SQL是否开启 执行下面命令查看是否开启慢SQL show variables like %slow_query_log; 复制代码 OFF: 未开启ON: 2.打开慢SQL配置 执行下面的命令开启慢查询日志 set global slow_query_logON; 复制代码 3.修改慢查询阈值 前面介绍了SQL执行到达了…

Elasticsearch Windows版安装配置

Elasticsearch简介 Elasticsearch是一个开源的搜索文献的引擎&#xff0c;大概含义就是你通过Rest请求告诉它关键字&#xff0c;他给你返回对应的内容&#xff0c;就这么简单。 Elasticsearch封装了Lucene&#xff0c;Lucene是apache软件基金会一个开放源代码的全文检索引擎工…

已解决,引入外部文件,element-plus中的分页组件,当其位置在页面底部时,layout中的sizes(下拉框)始终向下弹出,且显示不完整,期望向上弹出

已解决&#xff1a;由于引入了外部样式&#xff0c;定位的问题导致的 解决办法&#xff1a; .el-select-dropdown {position: initial;margin: 0px;}排查问题的方法&#xff1a; 注释引入的外部文件&#xff0c;逐级排查问题所在&#xff0c;再新的css文件中重写样式&#xff…

第5章 python深度学习——波斯美女

第5章 深度学习用于计算机视觉 本章包括以下内容&#xff1a; 理解卷积神经网络&#xff08;convnet&#xff09; 使用数据增强来降低过拟合 使用预训练的卷积神经网络进行特征提取 微调预训练的卷积神经网络 将卷积神经网络学到的内容及其如何做出分类决策可视化 本章将…

用 CanvasKit 实现超级丝滑的原神地图(已开源)!!!

首先给大家送上预览地址&#xff1a; 官网地址&#xff1a;https://webstatic.mihoyo.com/ys/app/interactive-map/index.html canvaskit地址&#xff1a;http://106.55.55.247/ky-genshin-map/ 为什么 canvaskit 有如此高的性能&#xff1f; 第一个问题&#xff0c;官方网页…

【数据结构 07】AVL树

目录 一、二叉搜索树 二、AVL树 2.1 左单旋 2.2 右单旋 2.3 左右双旋 2.4 右左双旋 三、AVL.h 四、test.cpp 一、二叉搜索树 二叉搜索树&#xff0c;又称二叉排序树&#xff08;Binary Search Tree&#xff09;&#xff0c;相比于普通二叉树&#xff0c;BST的特性有&a…

Python学习--一个逻辑推理的猜数字的游戏

修订Pico Fermi Bagels猜数字游戏代码&#xff0c;仅用于学习Python。 运行界面如下&#xff1a; 修订的代码如下&#xff1a; # // # 提升逻辑思维猜数字小游戏 # BY&#xff1a;Al Sweigart alinventwithpython.com # 翻译&#xff1a;诚外无物 # 说明&#xff1a;一个逻辑…