都2023年了,诸佬们肯定熟知RabbitMQ了吧

news2024/12/24 11:26:23

前言:大家好,我是小威,24届毕业生,曾经在某央企公司实习,目前入职某税务公司。本篇文章将记录和分享RabbitMQ相关的知识点。
本篇文章记录的基础知识,适合在学Java的小白,也适合复习中,面试中的大佬🤩🤩。
如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
小威在此先感谢各位大佬啦~~🤞🤞
在这里插入图片描述

🏠个人主页:小威要向诸佬学习呀
🧑个人简介:大家好,我是小威,一个想要与大家共同进步的男人😉😉
目前状况🎉:24届毕业生,曾经在某央企公司实习,目前在某税务公司实习👏👏

💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘

在这里插入图片描述

以下正文开始

在这里插入图片描述

文章目录

  • 🎉初始RabbitMQ
  • 🎇RabbitMQ的优点
    • 🎈应用解耦
    • 🎈流量削峰
    • 🎈异步处理
  • 🎊MQ的种类
  • 🧨RabbitMQ组件架构
  • 🎍SpringAMQP

🎉初始RabbitMQ

我们接触过队列的时候还是在介绍AQS的时候,在AQS的内部,维护了一个基于FIFO(First Input First Output)的等待队列。对于今天记录的rabbitmq知识,也是一个先进先出的队列,只不过这个队列是存放消息的队列。

RabbitMQ(message queue)消息队列,是RabbitMQ公司基于Erlang开发语言来创建的,其支持多种协议,如AMQP协议,XMPP协议,SMTP协议,STOMP协议等等。

我们在项目中进行同步调用的时候,会遇到很多问题,比如,当服务的生产者出现某些问题,调用这些服务提供者的消费者也会出现问题导致项目不可用;而且同步调用会使得项目的耦合度比较高,当每次加入新的需求时,都需要对源代码进行改造;同步调用的性能也不是那么的好,因为同步调用的上一个步骤完成后,才会进行下一步,如果调用的时间比较长,则需要等待很长的时间。

而异步通信恰好可以解决这些问题。其中,RabbitMQ消息队列,就是异步通信中的一种。
在这里插入图片描述

🎇RabbitMQ的优点

上面我们了解到了同步调用的缺点,异步通信的优点,接着我们了解一下RabbitMQ的优点。

🎈应用解耦

以我们平时做的电商项目为例,在电商项目中,我们通常会有支付服务,订单服务,库存系统,物流服务等。比如用户在下完单后,如果耦合地调用订单服务,库存服务,其中如果有一个系统发生故障,都会导致用户下单操作失败。但是如果基于消息队列的方式异步调用时,如果物流服务发生故障,我们只需要花时间来处理物流服务即可,不会影响到用户的下单支付服务。当物流服务的bug处理完成后即可恢复正常。

🎈流量削峰

以我们的生活为例,通常在双十一,双十二时购物优惠力度会很大,在此期间用户订单会很多,如果不对订单流量进行控制,服务器很容易崩掉。因此我们可以将消息队列用来做缓冲,限制订单的个数,或者将某段时间内的订单分散成一段时间处理,一些用户在下完单后的一小段时间内收到下单成功的提醒,这样可以有效地控制极大流量的情况。

🎈异步处理

同步调用需要一步一步地去执行系统,总执行的时间是各子系统模块花销的时间之和,而异步处理可以使得子系统从对应的消息队列中消费自己对应的消息,在自己本地执行相对应的操作。因此异步处理可以极大提升系统的响应速度和吞吐量。

🎊MQ的种类

消息队列的种类有很多,比如为我们所熟知的RabbitMQ,RocketMQ,ActiveMQ,KafKa,接下来简单介绍一下吧。

RabbitMQ公司基于Erlang开发语言来创建的,其支持多种协议,如AMQP协议,XMPP协议,SMTP协议,STOMP协议等等。其可用性比非常高,单机吞吐量一般,消息延迟微秒级别,消息可靠性比较高。

ActiveMQ是有Apache研发的开源中间件,开发语言是用Java来开发的,支持多种编程语言,支持多种协议,如OpenWire协议,STOMP协议,RESY协议,AMQP协议,XMPP协议等,其可用性一般,单机吞吐量略差,消息延迟为毫秒级,消息可靠性一般。

RocketMQ是阿里巴巴公司研发的消息队列的一种,也是由Java语言开发的,RocketMQ的协议支持自定义,高吞吐量,可用性非常高,消息可靠性也比较高,时效性能延迟在毫秒级别。

KafKa是由Apache社区使用Scala和Java语言开发的消息队列,其支持自定义协议,可用性非常高,单机吞吐量非常高,多用于分布式架构,是由阿里开源的,之后交付给了Apache社区,消息可靠性一般。

RabbitMQ在各个方面都表现的挺不错,因此我们可以选择RabbitMQ来学习的。

🧨RabbitMQ组件架构

在这里插入图片描述

Publisher :消息的生产者。

Consumer :消息的消费者。

Broker:主要用于接收和分发消息,RabbitMQ Server 就是 Message Broker。

Virtual host:顾名思义,虚拟主机,类似于nacos中的 namespace(命名空间) 概念。当多个不同的用户使用同一个 RabbitMQ server 提供的服务时,可以划分出多个 vhost,每个用户在自己的 vhost 创建 exchange/queue 等。vhost在连接的时候需要指定,默认的vhost是/。

Connection:生产者和消费者与 broker 之间建立的 TCP 连接。

Channel:中文意思为管道,用于数据双向流通。不管是发布消息、订阅队列还是接收消息,这些动作都是通过管道完成。因为对于操作系统来说,建立和销毁TCP都是非常昂贵的开销,因此引入了管道的概念,以复用一条TCP连接。

Exchange:exchange为交换机,用来接收生产者发送的消息并将这些消息路由给服务器中的队列。

Queue:消息队列,用来保存消息直到发送给消费者。它是存放消息的容器。一个消息可投入一个或多个队列消息,最终被送到这里等待 consumer 取走。

Binding:绑定关系,主要用于交换机和队列之间的关联,binding 中可以包含 routing key,通过路由键(Routing Key)将交换机和消息队列关联起来。
在这里插入图片描述

🎍SpringAMQP

我们先来看一下官方给出的SpringAMQP介绍:

Spring AMQP项目将Spring的核心概念应用于基于AMQP的消息传递解决方案的开发。它提供了一个“模板”作为发送和接收消息的高级抽象。它还为带有“监听器容器”的消息驱动的 POJO 提供支持。这些库有助于管理 AMQP 资源,同时促进依赖关系注入和声明性配置的使用。在所有这些情况下,您都会看到与 Spring 框架中的 JMS 支持的相似之处。

特征
用于异步处理入站消息的监听器容器

发送和接收消息的模板

RabbitAdmin,用于自动声明队列,交换和绑定

我们利用SpringAMQP来实现HelloWorld中的基础消息队列功能:
我们首先创建两个模块,publisher生产者模块和consumer消费者,通过在生产者中发送消息,消费者对消息进行处理。
由于publisher模块和consumer模块都需要SpringAMQP依赖,所以在父过程的pom文件中引入依赖:

     <!--AMQP依赖,包含RabbitMQ-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

接着在publisher模块的yaml中配置RabbitMQ的相关地址信息:

logging:
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS
spring:
  rabbitmq:
    host: 192.168.220.135
    port: 5672
    username: xiaowei
    password: 123456
    virtual-host: /

然后在publisher模块的测试类中编写代码:

package cn.itcast.mq.spring;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@SpringBootTest
@RunWith(SpringRunner.class)
public class SpringAmqpTest {
    @Autowired //自动装配,和我们使用的RedisTemplate相似
    private RabbitTemplate rabbitTemplate;
    @Test
    public void testSendMessage2SimpleQueue() {
        String queueName="simple.queue";
        String message = "hello, spring amqp!";
        rabbitTemplate.convertAndSend(queueName,message);
    }
}

直到此刻,生产者就可以发送消息了,启动项目,登录RabbitMQ官网可看到队列中有一条消息:
在这里插入图片描述
之后配置consumer模块的依赖和application.yaml,这个是和生产者一样的:

     <!--AMQP依赖,包含RabbitMQ-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
logging:
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS
spring:
  rabbitmq:
    host: 192.168.220.135
    port: 5672
    username: xiaowei
    password: 123456
    virtual-host: /

接着编写来接收生产者消息的类:

package cn.itcast.mq.listener;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component  //加上注解,交给spring容器来管理
public class SpringRabbitListener {
    @RabbitListener(queues="simple.queue") //simple.queue是创建的队列名称
     public void listenSimpleQueue(String msg){  //由于生产者那里是string类型,因此这里一样类型
        System.out.println("消费者已经接收到simple.queue的消息:[" + msg +  "]");
     }
}

启动consumer模块项目,运行,查看控制台可以看到消费者这里可以得到生产者那里发送的消息:
在这里插入图片描述
我们再次打开官网的界面,刷新后会发现,那条消息已经被消费了:
在这里插入图片描述
由于篇幅原因,本篇文章就先分享到这里了,后续会继续分享其他的知识,感谢大佬认真读完支持咯~
在这里插入图片描述

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起讨论🍻
希望能和诸佬们一起努力,今后进入到心仪的公司
再次感谢各位小伙伴儿们的支持🤞

在这里插入图片描述

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

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

相关文章

EXCEL的查找:如何按 行号+列号 进行查询, 可用indirect() + match() 或 index() + match()

0 首先用match()等取得行号&#xff0c;列号 如果想根据行号列号&#xff0c;精确查找&#xff0c;另外一个区域的数据&#xff0c;可以用如下方法 INDIRECT("Sheet2!r"&MATCH($C11,Sheet2!$A:$A,0)&"C"&MATCH(D$10,Sheet2!$1:$1,0),FALSE) …

ERR_UNSAFE_PORT浏览器安全问题导致无法访问的解决方案

前言 出发点是Java Agent内存马的自动分析与查杀&#xff0c;实际上其他内存马都可以通过这种方式查杀 本文主要的难点主要是以下三个&#xff0c;我会在文中逐个解答 1.如何dump出JVM中真正的当前的字节码 2.如何解决由于LAMBDA表达式导致非法字节码无法分析的问题 3.如何对…

短视频带货流程话术

现在短视频热度高涨&#xff0c;已经成为人们娱乐休闲的一种方式。短视频人流量大&#xff0c;已经衍生出了直播带货、橱窗链接带货等方式&#xff0c;也吸引了一批想要带货的用户。前言现在短视频热度高涨&#xff0c;已经成为人们娱乐休闲的一种方式。短视频人流量大&#xf…

JDBC(使用java语言操作数据库)

JDBC概念&#xff1a;使用Java语言操作关系型数据库的一套api&#xff08;可以用一套标准的jdbc操作所有类型的数据库&#xff0c;jdbc是接口&#xff0c;每一个数据库&#xff08;mysql、oracle、db2...&#xff09;都去实现jdbc的接口&#xff0c;每个数据库的实现类都不一样…

LeetCode:11. 盛最多水的容器

11. 盛最多水的容器1&#xff09;题目2&#xff09;思路3&#xff09;代码4&#xff09;结果1&#xff09;题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x …

2023年1月4日:fastadminApi接口开发项目时遇到的问题

SelectPage selectpage(官方文档&#xff1a;动态下拉(SelectPage) - FastAdmin框架文档 - FastAdmin开发文档) 常规用法 下面介绍一个基础的动态下拉列表示例&#xff0c;如下 <input id"c-name" data-rule"required" data-source"category/sel…

AVS3变换之IST和ISTS

IST&#xff08;Implicit Selected Transform&#xff09;是AVS3中新增的针对intra块的变换工具&#xff0c;IST对intra块提供了两种可分离的变换核&#xff0c;编码器根据RDO选择最优的变换核&#xff0c;但是对于选中的变换核不在码流中传输其索引&#xff0c;而是将其索引隐…

day34【代码随想录】贪心算法之跳跃游戏、跳跃游戏||、K次取反后最大化的数组和

文章目录前言一、跳跃游戏&#xff08;力扣55&#xff09;二、跳跃游戏 II&#xff08;力扣45&#xff09;三、K次取反后最大化的数组和&#xff08;力扣1005&#xff09;前言 1、跳跃游戏 2、跳跃游戏|| 3、K次取反后最大化的数组和 一、跳跃游戏&#xff08;力扣55&#xff…

火热的低代码到底是什么?

低代码风头正紧&#xff0c;也是最近一段时间跟云原生一起被热捧&#xff0c;不管你是做后端开发、还是前端设计、销售、售前&#xff0c;如果你没接触过低代码你都不好意思说自己在软件领域工作&#xff0c;这边文章从我的角度聊聊低代码是什么、以怎么样的方式开发、及低代码…

react笔记_05函数组件与类组件的区别之capture value特性

函数组件与类组件在写法没有好坏之分&#xff0c;性能差距也几乎可以忽略&#xff0c;而且 React 会长期支持这两种写法。 React的函数式组件和类组件之间的根本区别 在心智模型上。 函数式组件具有 capture value 特性。 capture value特性 Capture Value 从字面上可以理解…

【已解决】office提示你的许可证不是正版,你可能是盗版软件的受害者?

三步即可先看效果步骤1、下载工具2、找到 修复Office许可证明问题3、填入KMS主机&#xff0c;点击修复如何查看正在使用的 KMS 主机地址&#xff1f;先看效果 步骤 1、下载工具 工具下载&#xff1a;https://otp.landian.vip/zh-cn/ 2、找到 修复Office许可证明问题 3、填入…

PEM格式RSA密钥解析(一)

Base64转16进制格式 后缀是.PEM 的数字证书是 BASE64 编码的&#xff0c;以 ASCII 码来表示。常见的证书如下所示&#xff08;以 RSA1024 为例&#xff09;&#xff1a; 私钥&#xff1a; ----BEGIN RSA PRIVATE KEY----- MIICWwIBAAKBgHU4CF6yvqb5WBhwcYfvh/o3NpwcSJlcfj0nIZ…

下载神器IDM安装与使用(保姆级教程)

下载神器IDM安装与使用&#xff08;保姆级教程&#xff09; 文章目录下载神器IDM安装与使用&#xff08;保姆级教程&#xff09;前言一、下载地址二、IDM是什么&#xff1f;三、作用与特点四、安装步骤总结前言 众所周知&#xff0c;下载工具是大家电脑里必装的软件之一。 但大…

大数据时代,制造业人要知道,为什么有ERP还要上SRM系统

每个公司都是在一个供应链中&#xff0c;每个公司都有自己的上下游。如今&#xff0c;企业间的竞争已不再是单一企业的单打独斗&#xff0c;而是由价值链与价值链、供应链与供应链的较量。上游厂商&#xff08;供应商&#xff09;直接影响到公司的产品与服务的价格及竞争能力。…

零售企业全域数据打通最佳实践

在数字化转型的实战中&#xff0c;零售企业面临着巨大的挑战&#xff0c;过去三年线下流量锐减&#xff0c;甚至不少门店关停&#xff0c;不少零售企业布局线上&#xff0c;但是这个也给零售企业带来另外一个挑战&#xff1a;IT资源有限的情况下&#xff0c;线上&线下的流量…

密码学_RC4算法

在密码学中&#xff0c;RC4&#xff08;来自Rivest Cipher 4的缩写&#xff09;是一种流加密算法&#xff0c;密钥长度可变。它加解密使用相同的密钥&#xff0c;因此也属于对称加密算法。RC4是有线等效加密&#xff08;WEP&#xff09;中采用的加密算法&#xff0c;也曾经是TL…

电脑看不了视频?视频恢复,3个方案解决

一般电脑播放不了视频&#xff0c;原因大多是Flash插件损坏了&#xff0c;因为电脑上的视频和所有的Flash都需要Flash插件才可以正常使用。电脑看不了视频怎么办&#xff1f;你需要对Flash进行修复或者重新安装它。一起来看看下面三个方案&#xff0c;解决电脑视频看不了的问题…

传输系统WSON倒换时的路由震荡问题【脱敏版】

【摘要】在省干传输OXC系统中使用WSON倒换时&#xff0c;测试过程中发现WSON倒换时存在电路频繁up down的现象&#xff0c;研究发现倒换时光信道建立时间过程中光信号不是一个稳定的状态&#xff0c;设备的色散补偿模块会在这个不稳态下出现异常&#xff0c;导致色散补偿模块不…

2023,出海企业,数据跨境传输如何实现合规?

随着防疫政策的优化&#xff0c;2023年出海企业开始加速海外业务&#xff0c;此前&#xff0c;浙江、四川、广东、江苏等地政府都纷纷出手“包机出海抢订单“。而伴随着企业的全球业务拓展&#xff0c;数据跨境活动日益频繁&#xff0c;跨境数据的安全风险也日益凸显&#xff0…

通过反射机制调用方法

package com.javase.reflect;import com.javase.service.UserService;import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ResourceBundle;/*** 通过反射机制调用方法&#xff08;必须掌握&#xff0c;五颗星*****&#…