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

前言:大家好,我是小威,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.135port: 5672username: xiaoweipassword: 123456virtual-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;@Testpublic 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.135port: 5672username: xiaoweipassword: 123456virtual-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.mzph.cn/news/118846.shtml

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

相关文章

Springboot日志记录方案—官方原版

一、概述 Spring Boot在所有内部日志中使用 Commons Logging &#xff0c;但对底层日志的实现保持开放。 为 Java Util Logging 、 Log4j2 、 Logback 提供了默认配置。 在每一种情况下&#xff0c;记录器&#xff08;logger&#xff09;都被预设为使用控制台输出&#xff0c;也…

binutils 2.40 Linker (ld) 官方文档下载

前言 最近需要熟悉 elf 与 共享库 的链接与加载流程&#xff0c;需要先了解 elf 文件 是怎么链接的&#xff0c;链接脚本如何阅读 最有效的方式是查看 GNU 官方的 Linker (ld) 文档&#xff0c;通过查找&#xff0c;这个 Linker (ld) 属于 GNU binutils&#xff0c;当前的较新…

Godot 官方2D C#重构(3):TileMap使用

文章目录 前言Godot Tilemap使用Tilemap使用TileSet和TilemapTilemap 图片资源添加TileSet&#xff0c;开始切图导入图片切图 简单添加TileMap如何使用 Auto Tilemap使用Auto Tilemap 前言 Godot 官方 教程 Godot 2d 官方案例C#重构 专栏 Godot 2d 重构 github地址 Godot Tilem…

MFC 注册表

文章目录 打开注册表对注册表的键的操作创建子键删除子键遍历子键 对注册表值的操作读取值设置值 打开注册表 void CREGDemoDlg::OnBnClickedBtnOpen() {//打开注册表HKEY hKey;if (ERROR_SUCCESS ! RegOpenKeyEx(HKEY_CURRENT_USER, L"SOFTWARE\\Baidu.com", 0, KEY…

[算法训练营] 回溯算法专题(二)

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的…

Android笔记(七)Android JetPack Compose组件搭建Scaffold脚手架

在去年2022年曾发布一篇关于脚手架的文章&#xff1a;“Android JetPack Compose组件中Scaffold的应用” 。但是Android的版本从12变更到13及以上版本&#xff0c;导致一些细节的实现存在不同。在本文中&#xff0c;将从头开始介绍整个脚手架的搭建过程。 一、新建项目模块 在…

基于Laravel封装一个强大的请求响应日志记录中间件

为何强大 记录全面&#xff1a; 包含请求路径、请求方法、客户端IP、设备标识、荷载数据、文件上传、请求头、业务逻辑处理时间、业务逻辑所耗内存、用户id、以及响应数据。配置简单&#xff1a; 默认不需要写任何逻辑可开箱即用&#xff0c;靠前4个方法&#xff0c;就可指定某…

从0到1配置TensorRT环境

根据博文&#xff1a;TensorFlow2.x模型转onnx、TensorRT给出的环境来配置。 以下是该博文中给出的版本信息 TensorFlow 2.4 CUDA 11.1 CUDNN 8 TensorRT 8.2.1.8 tf2onnx 1.13.0 onnx 1.12.0 下载地址 包下载地址TensorRT 8.2.1.8https://developer.nvidia.com/nvidia-tenso…

Lua 事件触发机制(注册,触发)

日常工作中经常会用到触发机制&#xff0c;这里就提供一个注册触发机制&#xff0c;在代码中在也不用专门去调用各个模块的接口&#xff1b;只需要触发即可&#xff0c;触发后会自动调用接口 直接上代码 local _EventHandle {}; _EventHandle.listenerHandleIndex 0 _EventH…

【Overload游戏引擎细节分析】standard材质Shader

提示&#xff1a;Shader属于GPU编程&#xff0c;难写难调试&#xff0c;阅读本文需有一定的OpenGL基础&#xff0c;可以写简单的Shader&#xff0c;不适合不会OpenGL的朋友 一、Blinn-Phong光照模型 Blinn-Phong光照模型&#xff0c;又称为Blinn-phong反射模型&#xff08;Bli…

腾讯云抱歉不满足产品首购条件解决方法

购买腾讯云服务器提示“抱歉&#xff0c;检测到相同实名认证主体已购买&#xff0c;不满足产品首购条件&#xff0c;您可了解其他商品。”&#xff0c;购买腾讯云特价云服务器是有新用户首购限制的&#xff0c;说当前腾讯云认证主体的其他账号已经购买过云服务器&#xff0c;一…

【wespeaker】模型ECAPA_TDNN介绍

本次主要介绍开源项目wespeaker模型介绍 1. 模型超参数 model_args: feat_dim: 80 embed_dim: 192 pooling_func: “ASTP” projection_args: project_type: “softmax” # add_margin, arc_margin, sphere, softmax scale: 32.0 easy_margin: False 2. 模型结构 2.1 Layer…

【Python机器学习】零基础掌握FeatureHasher特征提取

如何高效地处理海量特征数据? 在大数据和机器学习的时代,处理海量的数据特征是一个常见但棘手的问题。特别是在文本分析、社交媒体挖掘或电子商务推荐系统中,数据维度经常会非常高。那么,如何在不损失太多信息的情况下,高效地处理这些高维数据呢? 想象一下,一个社交媒…

node-red常用包分析

node-red-contrib-opcua Use OpcUa-Item to define variables. Use OpcUa-Client to read / write / subscribe / browse OPC UA server. 需要想通过OpcUa-Item节点来指定一个数据点。 触发器-->opcua_item----->opcua_client opcua_client的Action项解析&#xff1a; …

【前端设计模式】之抽象工厂模式

抽象工厂模式是一种创建型设计模式&#xff0c;它提供了一种创建一系列相关或相互依赖对象的接口&#xff0c;而无需指定具体类。在前端开发中&#xff0c;抽象工厂模式可以帮助我们更好地组织和管理代码&#xff0c;提高代码的可维护性和可扩展性。 抽象工厂模式特性 抽象工…

HugeGraph Hubble 配置 https 协议的操作步骤

背景 HugeGraph 图数据库的 Server 端支持 https 配置&#xff0c;官方文档中有说明相对比较容易&#xff0c;而 Hubble 部署过程都是 http的。 我们有一个应用要嵌入 hubble 页面&#xff0c;而且部署为 https &#xff0c;那么 Hubble 是否支持配置 https 呢&#xff1f;网…

大数据技术学习笔记(三)—— Hadoop 的运行模式

目录 1 本地模式2 伪分布式模式3 完全分布式模式3.1 准备3台客户机3.2 同步分发内容3.2.1 分发命令3.2.2 执行分发操作 3.3 集群配置3.3.1 集群部署规划3.3.2 配置文件说明3.3.3 修改配置文件3.3.4 分发配置信息 3.4 SSH无密登录配置3.4.1 配置ssh3.4.2 无密钥配置 3.5 单点启动…

python的多线程介绍之thread

python的多线程介绍之thread Python的thread模块是Python标准库中的一个模块&#xff0c;用于创建和管理线程。它是Python早期支持多线程的方式之一&#xff0c;但在Python 2.4之后&#xff0c;推荐使用threading模块来实现多线程。 以下是thread模块的一些基本功能和用法&…

随笔 | 写在剑桥学习一个月的这一天

目录 来剑桥的第一天各种意外正式的冒险社恐直接表达放轻松&#xff0c;勇敢面对后记. 来剑桥的第一天 来剑桥的第一天&#xff0c;还是那么印象深刻。 那是来英国的第二天&#xff0c;伦敦的天气还行&#xff0c;偶尔多云偶尔天晴。 和他纠结半天&#xff0c;最终还是选择了…

C++【多态】

文章目录&#xff1a; C 多态1. 多态的概念2. 多态的定义和实现2.1 构成多态的必要条件2.2 虚函数和重写2.3 虚函数重写的两个例外2.4 例题运用2.5 final 和 override2.6 重载、重写、重定义 3. 抽象类4. 多态的原理4.1 虚表指针4.2 多态和非多态调用4.3 回想满足条件4.4 虚函数…