RabbitMQ基础知识

一.什么是RabbitMQ

      RabbitMQ是一个开源的、高性能的消息队列系统,用于在应用程序之间实现异步通信。它实现了AMQP(Advanced Message Queuing Protocol)协议,可以在分布式系统中传递和存储消息。

     消息队列是一种将消息发送者和接收者解耦的机制。发送者将消息发送到队列中,然后接收者从队列中获取消息并进行处理。这种方式可以提高系统的可靠性、扩展性和灵活性。

    RabbitMQ使用生产者-消费者模型,其中生产者将消息发送到队列中,消费者从队列中获取消息并进行处理。它支持多种消息传递模式,如发布/订阅、路由、主题等。

    RabbitMQ具有很高的性能和可靠性,可以处理大量的消息,并具有故障恢复机制,以确保消息不会丢失。它还提供了可扩展性和灵活的配置选项,可以根据需要调整系统的吞吐量和延迟。

    RabbitMQ广泛应用于各种领域,如金融、电子商务、电信、物联网等,用于构建分布式系统、异步处理、事件驱动架构等。

二.RabbitMQ的作用是什么 

     RabbitMQ是一个消息队列中间件,其作用是实现异步通信。它可以在不同的应用程序之间传递消息,使得应用程序能够解耦,以提高系统的可伸缩性和可靠性。

   具体来说,RabbitMQ可以将消息发送到一个队列中,并立即返回给发送者,而不需要等待消息被处理。其他应用程序可以从该队列中获取消息,并进行处理。这种异步通信模式使得应用程序能够以自己的节奏进行处理,并且不会直接依赖于其他应用程序的可用性。

   RabbitMQ支持多种消息传递模式,包括点对点方式(one-to-one)、发布/订阅方式(one-to-many)和请求/应答方式(request/reply)。这些模式使得开发者能够根据特定的需求选择合适的模式来实现消息的传递。

   RabbitMQ的主要作用是提供一种可靠的异步通信机制,使得不同的应用程序能够进行解耦和高效地进行消息传递。

三.RabbitMQ的模型

      RabbitMQ的模型基于以下几个重要的概念:

生产者(Producer)

    负责创建和发送消息到RabbitMQ中的Exchange。生产者将消息发送到Exchange,Exchange根据一定的规则将消息路由到绑定的队列。

消息(Message)

     消息是生产者发送给RabbitMQ的基本数据单元。它包含了要传输的数据以及相关的元数据,例如消息的ID、优先级、时间戳等。

Exchange:

    Exchange是消息的接收和分发中心。它接收生产者发送的消息,根据预定义的规则将消息路由到一个或多个绑定的队列中。Exchange有四种类型:direct、fanout、topic和headers,不同的类型规定了不同的消息路由规则。

队列(Queue)

     队列是消息的存储区域,用于存放Exchange分发的消息。消费者从队列中获取消息进行处理。每个消息都会被发送到一个或多个队列中,消息在队列中按照先进先出的原则进行处理。

消费者(Consumer)

    负责从队列中获取消息并进行处理。消费者向RabbitMQ注册自己监听的队列,当有消息到达队列时,消费者会接收并处理消息。

绑定(Binding)

    绑定是Exchange和队列之间的关系。它定义了Exchange将消息路由到哪些队列中。绑定可以指定路由规则,例如根据消息的关键字、标签等进行路由。

RabbitMQ支持多种消息模型,下面是一些常见的消息模型:

  1. 点对点模型:也被称为队列模型,消息发送者发送消息到一个队列,消息接收者从队列中获取消息。每个消息只能被一个接收者消费。

  2. 发布/订阅模型:消息发送者将消息发送到一个交换机(exchange),交换机将消息广播给所有绑定到它的队列,每个队列都有一个接收者。

  3. 主题模式:类似于发布/订阅模型,但是消息发送者可以指定一个主题(topic),接收者可以使用通配符来订阅感兴趣的主题。

  4. RPC模型:Remote Procedure Call(远程过程调用)模型,允许应用程序之间进行远程调用。客户端发送请求到RPC队列,服务端接收请求并处理,然后将结果返回给客户端。

四.RabbitMQ的优势       

   RabbitMQ的优势包括:

  • 灵活性:RabbitMQ支持多种消息传递模式,包括点对点、发布/订阅、工作队列等,能够满足不同应用场景的需求。
  • 可靠性:RabbitMQ使用消息确认机制,确保消息的可靠传递。它还支持持久化消息和镜像队列,提高了消息的可靠性和可用性。

  • 扩展性:RabbitMQ支持横向扩展,可以通过添加多个服务器来增加消息处理的能力。它还支持集群模式,提供了高可用性和负载均衡的能力。

  • 消息优先级:RabbitMQ支持消息优先级,可以根据消息的重要性进行优先处理。

  • 插件机制:RabbitMQ提供了丰富的插件机制,可以扩展其功能,如支持消息转发、消息过滤、消息持久化等。

  • 多语言支持:RabbitMQ支持多种编程语言,包括Java、Python、Ruby、C#等,可以方便地与不同语言的应用程序进行集成。

  • 开源和社区支持:RabbitMQ是开源软件,拥有活跃的社区支持,用户可以获取到大量的文档、示例代码和社区帮助。

五.RabbitMQ的基本使用         

      在Spring Boot项目中使用RabbitMQ,需要添加以下依赖:

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

    然后,创建一个配置类来配置RabbitMQ连接和队列等信息:

import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
import org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RabbitMQConfig {private static final String QUEUE_NAME = "my-queue";@Beanpublic Queue queue() {return new Queue(QUEUE_NAME, false);}@Beanpublic SimpleMessageListenerContainer container(ConnectionFactory connectionFactory,MessageListenerAdapter listenerAdapter) {SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();container.setConnectionFactory(connectionFactory);container.setQueueNames(QUEUE_NAME);container.setMessageListener(listenerAdapter);return container;}@Beanpublic MessageListenerAdapter listenerAdapter(RabbitMQReceiver receiver) {return new MessageListenerAdapter(receiver, "receiveMessage");}}

     接下来,创建一个消息接收者类:

import org.springframework.stereotype.Component;@Component
public class RabbitMQReceiver {public void receiveMessage(String message) {System.out.println("Received message: " + message);}}

     最后,在你需要发送消息的地方,注入一个RabbitTemplate对象,然后使用convertAndSend方法发送消息:

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
public class RabbitMQSender {private RabbitTemplate rabbitTemplate;@Autowiredpublic RabbitMQSender(RabbitTemplate rabbitTemplate) {this.rabbitTemplate = rabbitTemplate;}public void sendMessage(String message) {rabbitTemplate.convertAndSend("my-queue", message);System.out.println("Sent message: " + message);}}

这样,就完成了RabbitMQ的基本使用。当消息发送时,RabbitMQ会将消息发送到队列中,然后接收者会从队列中接收并处理消息。

六.RabbitMQ的使用场景

     以下是一些常见的RabbitMQ使用场景:

  1. 异步任务处理:RabbitMQ可以用于处理异步任务,将任务放入消息队列中,然后由后台的工作进程异步消费并处理这些任务。这可以提高系统的响应速度和吞吐量。

  2. 解耦系统组件:当一个系统由多个组件构成时,可以使用RabbitMQ作为这些组件之间的消息通信桥梁。每个组件通过发布和订阅特定的消息队列来进行通信,从而实现了系统组件的解耦,提高了系统的可扩展性和灵活性。

  3. 日志收集:通过将日志消息发送到RabbitMQ中的一个队列,可以实现日志的集中收集和处理。这样可以更轻松地对日志进行分析和监控,同时减少了对日志产生方的影响。

  4. 广播和通知:发布/订阅模型使得RabbitMQ能够很方便地进行广播和通知。一个生产者可以将消息发布到一个交换机,然后所有绑定到该交换机的消费者都将接收到该消息。

  5. 系统解耦和消息重试:通过使用RabbitMQ作为中间件,不同的系统可以互相独立地进行开发和部署。如果一个系统发生故障或者出现错误,可以将错误消息发送到RabbitMQ中,然后由其他系统进行消费和处理,从而实现了系统解耦和消息重试的功能。

  6. 负载均衡:RabbitMQ可以将任务分发到多个消费者上,从而实现负载均衡。不同的消费者可以通过消费同一个队列上的消息来处理任务,实现任务的并行处理和提高系统的吞吐量。

       

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

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

相关文章

NE555学习笔记-2024

实物图片 NE555引脚图 内部时序图 示列1&#xff0c;红外接收电路 红外接收电路的工作原理&#xff1a;在上述电路中&#xff0c;TSOP1738构成了该电路的主要组成部分&#xff0c;旨在检测来自任何来源的红外信号。这用于检测38 KHz范围的信号&#xff0c;因此命名为“TSOP173…

aps审核-模电英文稿

模拟电子线路 Analog circuit 需要熟悉课程名&#xff0c;一句话简单概括课程内容&#xff0c;准备一些重点内容介绍。 This course mainly introduces the properties(n.性质) of semiconductors(半导体) and transistors, and then analyzes and masters amplification circ…

利用Spring Cloud和Java系统设置优化工程项目管理系统源码的二次开发体验

工程项目管理涉及众多环节和角色&#xff0c;如何实现高效协同和信息共享是关键。本文将介绍一个采用先进技术框架的Java版工程项目管理系统&#xff0c;该系统支持前后端分离&#xff0c;功能全面&#xff0c;可满足不同角色的需求。从项目进度图表到施工地图&#xff0c;再到…

Element-ui自定义input框非空校验

1、vue自定义非空指令&#xff1a; main.js中自定义非空指令 当input框或下拉框中数据更新时&#xff0c;触发校验 Vue.directive(isEmpty,{update:function(el,binding,vnode){if(vnode.componentInstance.value""){el.classList.add("is-required");}e…

C#中汉字转区位码

目录 一、关于区位码 1.区位码定义 2.算法 二、实例 三、生成效果 四、程序中的知识点 1.byte[] GetBytes(string s) 2.字节数组转short类型 一、关于区位码 1.区位码定义 区位码是一个4位的十进制数&#xff0c;每个区位码都对应着一个唯一的汉字&#xff0c;区位码…

大文件断点下载Range下载zip包显示文件损坏

问题&#xff1a;大文件下载&#xff0c;其它格式的文件及rar格式的压缩包正常下载但是 之后zip包下载后解压失败 原因分析: 1. 查看上传文件的属性值 如图&#xff0c;10.4kb是已经约去小数点的值&#xff0c;准确的大小应该是10663字节10.4130859375KB&#xff0c;所以用10.…

基于ssm的剧本杀预约系统+vue论文

摘 要 如今社会上各行各业&#xff0c;都在用属于自己专用的软件来进行工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。互联网的发展&#xff0c;离不开一些新的技术&#xff0c;而新技术的产生往往是为了解决现有问题而产生的。针对于剧本杀预…

git使用(完整流程)

1. 新建仓库 1.右击 git bash 后 输入 git init (仓库为:当前目录) git init name (仓库为:name文件夹) git clone https://github.com/Winnie996/calculate.git //https2.工作区域 工作目录 3. 添加 提交 git add . //工作区添加至暂存区 git commit -m "注释内容&q…

小球自由下落-第11届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第23讲。 小球自由下落&…

基于矩阵乘的CUDA编程优化过程

背景&#xff1a;网上很多关于矩阵乘的编程优化思路&#xff0c;本着看理论分析万遍&#xff0c;不如实际代码写一遍的想法&#xff0c;大概过一下优化思路。 矩阵乘的定义如下&#xff0c;约定矩阵的形状及存储方式为: A[M, K], B[K, N], C[M, N]。 CPU篇 朴素实现方法 按照…

刷算法-- leetcode 96. 不同的二叉搜索树

思路 观察树的组成&#xff0c;可以发现n3时的二叉搜索树可以由&#xff0c;头节点分别为1、2、3时的所有结果组成&#xff01;定义dp[i]为由i个节点组成的二叉搜索树的个数。确定递推公式&#xff0c;dp[i] 由1为头节点组成的二叉搜索树个数由2为头组成的个数…由i为头节点组…

使用 go-elasticsearch v8 基本请求

使用 go-elasticsearch 请求示例 你可以通过参考Go 官方文档找到简单的示例&#xff0c;所以我认为先看看这个是个好主意。 连接客户端有两种方式&#xff0c;如下图。 至于两者的特点&#xff0c;TypedClient有类型&#xff0c;更容易编写&#xff0c;但文档较少。另外&…

Linux文件的扩展属性 attr cap

文件属性 Linux文件属性分为常规属性与扩展属性&#xff0c;其中扩展属性有两种&#xff1a;attr与xattr. 一般常规的文件属性由stat API 读取&#xff0c;一般是三种权限&#xff0c;ower, group&#xff0c;时间等。 扩展属性attr 用户态API ioctl(fd, FS_IOC32_SETFLAGS…

QQ邮件发送(PHP的Laravel)

1. 开启 QQ 邮箱的 SMTP 支持 2.里面会一个类似于密码之类&#xff08;复制一下&#xff09; 3.然后再 .env文件里面配置一下 MAIL_DRIVERsmtp —— 使用支持 ESMTP 的 SMTP 服务器发送邮件&#xff1b; MAIL_HOSTsmtp.qq.com —— QQ 邮箱的 SMTP 服务器地址&#xff0c;必…

OCP NVME SSD规范解读-3.NVMe管理命令-part2

NVMe-AD-8&#xff1a;在某些情况下&#xff08;如Sanitize命令、Format NVM命令或TCG Revert方法后数据被清除&#xff09;&#xff0c;设备应允许读取已清除的LBAs而不产生错误&#xff0c;并在最后一次清除完成后&#xff0c;对未写入LBAs的读取返回所有零值给主机 NVMe-AD…

什么牌子的护眼灯好用?2024好用护眼台灯分享

不良的光线、长时间的用眼都会给眼睛带来压力&#xff0c;影响视力健康&#xff01; 本人就是一个因为工作原因需要长时间坐电脑前码字和P图的打工人&#xff0c;对于出现眼睛酸痛、疲劳以及眼球出现红血丝的情况有多难受我是深有体会&#xff0c;在此之前我搜索了好多缓解眼睛…

golang并发编程-channel

在golang 并发编程里&#xff0c;经常会听到一句话&#xff1a;不要通过共享内存进行通信&#xff0c;通过通信来共享内存。下面我们会介绍下channel, 通过源码的方式去了解channel是怎么工作的。 基本结构 流程图 代码解读 type hchan struct {qcount uint // …

(NeRF学习)NeRFStudio安装win11

参考&#xff1a; 【深度学习】【三维重建】windows11环境配置tiny-cuda-nn详细教程nerfstudio介绍及在windows上的配置、使用NeRFStudio官网githubRuntimeError: PytorchStreamReader failed reading zip archive: failed finding central directory原因及解决 目录 requireme…

不同角度深入探讨Maya和Blender这两款软件的差异

当我们面对三维建模软件的选择时&#xff0c;许多初学者可能会感到迷茫。今天&#xff0c;我们将从不同角度深入探讨Maya和Blender这两款软件的差异&#xff0c;特别是对于游戏建模领域的用户来说&#xff0c;这将有助于您更好地理解两者之间的区别。 软件授权与开发背景&#…

Python爬虫中的协程

协程 基本概念 协程&#xff1a;当程序执行的某一个任务遇到了IO操作时&#xff08;处于阻塞状态&#xff09;&#xff0c;不让CPU切换走&#xff08;就是不让CPU去执行其他程序&#xff09;&#xff0c;而是选择性的切换到其他任务上&#xff0c;让CPU执行新的任务&#xff…