Java知识复习(十一)RabbitMQ

news2025/1/4 19:01:13

1、RabbitMQ简介

  • RabbitMQ 是采用 Erlang 语言实现 AMQP(Advanced Message Queuing Protocol,高级消息队列协议)的消息中间件

2、RabbitMQ核心概念

  • RabbitMQ 整体上是一个生产者与消费者模型,主要负责接收、存储和转发消息
    在这里插入图片描述

3、Producer和Consumer

  • Producer(生产者) :生产消息的一方,消息一般包含两个部分:消息体(payload)和标签(Label)
  • Consumer(消费者) :消费消息的一方,消费者连接到 RabbitMQ 服务器,并订阅到队列上。消费消息时只消费消息体,丢弃标签
  • 生产者把消息交由 RabbitMQ 后,RabbitMQ 会根据消息头把消息发送给感兴趣的 Consumer(消费者)

4、Exchange(交换器)

  • 在 RabbitMQ 中,消息并不是直接被投递到 Queue(消息队列) 中的,中间还必须经过 Exchange(交换器) 这一层,Exchange(交换器) 会把我们的消息分配到对应的 Queue(消息队列) 中
  • 生产者将消息发给交换器的时候,一般会指定一个 RoutingKey(路由键),用来指定这个消息的路由规则,而这个 RoutingKey 需要与交换器类型和绑定键(BindingKey)联合使用才能最终生效
  • RabbitMQ 中通过 Binding(绑定) 将 Exchange(交换器) 与 Queue(消息队列) 关联起来,在绑定的时候一般会指定一个 BindingKey(绑定建) ,这样 RabbitMQ 就知道如何正确将消息路由到队列了
  • 一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则,所以可以将交换器理解成一个由绑定构成的路由表

5、Queue(消息队列)

  • Queue(消息队列) 用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者连接到这个队列将其取走
  • 多个消费者可以订阅同一个队列,这时队列中的消息会被平均分摊(Round-Robin,即轮询)给多个消费者进行处理,而不是每个消费者都收到所有的消息并处理,这样避免消息被重复消费
  • RabbitMQ 不支持队列层面的广播消费,如果有广播消费的需求,需要在其上进行二次开发,这样会很麻烦,不建议这样做

6、Broker(消息中间件的服务节点)

  • 对于 RabbitMQ 来说,一个 RabbitMQ Broker 可以简单地看作一个 RabbitMQ 服务节点,或者RabbitMQ服务实例,就像下面这样
    在这里插入图片描述

7、Exchange Types(交换器类型)

1、fanout:它会把所有发送到该Exchange的消息路由到所有与它绑定的Queue中,不需要做任何判断操作,所以 fanout 类型是所有的交换机类型里面速度最快的。fanout 类型常用来广播消息

2、direct:它会把消息路由到那些 Bindingkey 与 RoutingKey 完全匹配的 Queue 中

3、topic:它与 direct 类型的交换器相似,也是将消息路由到 BindingKey 和 RoutingKey 相匹配的队列中,但这里的匹配规则有些不同

  • RoutingKey 为一个点号“.”分隔的字符串(被点号“.”分隔开的每一段独立的字符串称为一个单词),如 “com.rabbitmq.client”、“java.util.concurrent”、“com.hidden.client”;
  • BindingKey 和 RoutingKey 一样也是点号“.”分隔的字符串;
  • BindingKey 中可以存在两种特殊字符串“”和“#”,用于做模糊匹配,其中“”用于匹配一个单词,“#”用于匹配多个单词(可以是零个)

4、headers(不推荐):headers 类型的交换器不依赖于路由键的匹配规则来路由消息,而是根据发送的消息内容中的 headers 属性进行匹配

8、高级特性

1、死信队列

  • DLX,全称为 Dead-Letter-Exchange,死信交换器,死信邮箱。当消息在一个队列中变成死信 (dead message) 之后,它能被重新被发送到另一个交换器中,这个交换器就是 DLX,绑定 DLX 的队列就称之为死信队列
  • 导致死信的几个原因:消息被拒且 requeue = false;消息 TTL 过期;队列满了,无法再添加

2、延迟队列

  • 延迟队列指的是存储对应的延迟消息,消息被发送以后,并不想让消费者立刻拿到消息,而是等待特定时间后,消费者才能拿到这个消息进行消费
  • AMQP 协议以及RabbitMQ本身没有直接支持延迟队列的功能,但是可以通过TTL和DLX模拟出延迟队列的功能

3、过期时间

  • Time To Live,也就是生存时间,是一条消息在队列中的最大存活时间,单位是毫秒
  • RabbitMQ可以对消息和队列设置TTL

4、消息确认

  • 为了保证消息从队列可靠地到达消费者,RabbitMQ提供了消息确认机制
  • 消费者订阅队列的时候,可以指定autoAck参数,当autoAck为true的时候,RabbitMQ采用自动确认模式,RabbitMQ自动把发送出去的消息设置为确认,然后从内存或者硬盘中删除,而不管消费者是否真正消费到了这些消息
  • 当autoAck为false的时候,RabbitMQ会等待消费者回复的确认信号,收到确认信号之后才从内存或者磁盘中删除消息

5、持久化

  • 持久化可以防止在异常情况下丢失数据。RabbitMQ的持久化分为三个部分:交换器持久化、队列持久化和消息的持久化。
  • 交换器持久化可以通过在声明队列时将durable参数设置为true。如果交换器不设置持久化,那么在RabbitMQ服务重启之后,相关的交换器元数据会丢失,不过消息不会丢失,只是不能将消息发送到这个交换器了
  • 队列的持久化能保证其本身的元数据不会因异常情况而丢失,但是不能保证内部所存储的消息不会丢失。要确保消息不会丢失,需要将其设置为持久化。队列的持久化可以通过在声明队列时将durable参数设置为true
  • 设置了队列和消息的持久化,当RabbitMQ服务重启之后,消息依然存在。如果只设置队列持久化或者消息持久化,重启之后消息都会消失

9、RabbitMQ的五种队列模式

  • 简单模式:一个生产者对应一个消费者
  • Work模式:一个生产者对应多个消费者,但是只能有一个消费者获得消息(排他)
  • 发布/订阅模式:一个消费者将消息首先发送到fanout交换器,交换器绑定到多个队列,然后与之对应的所有消费者都能接收到消息(不排他)
  • 路由模式:生产者将消息发送到direct交换器,交换器按照关键字(Key),把消息路由到某个队列
  • 主题模式:生产者将消息发送到Topic交换器,交换器按照复杂的规则,把消息路由到某个队列

10、Channel(信道)

  • 由于 TCP 链接的创建和销毁开销较大,且并发数受系统资源限制,会造成性能瓶颈,所以 RabbitMQ 使用信道的方式来传输数据
  • 信道(Channel)是生产者、消费者与 RabbitMQ 通信的渠道,信道是建立在 TCP 链接上的虚拟链接,且每条 TCP 链接上的信道数量没有限制
  • 就是说 RabbitMQ 在一条 TCP 链接上建立成百上千个信道来达到多个线程处理,这个 TCP 被多个线程共享,每个信道在 RabbitMQ 都有唯一的 ID,保证了信道私有性,每个信道对应一个线程使用

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

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

相关文章

Zookeeper3.5.7版本——集群部署(linux环境-centos7)

目录一、三台服务器信息二、Zookeeper3.5.7官网下载2.1、官网下载地址2.2、下载步骤三、三台服务器都安装jdk11(Zookeeper需要jdk支持)四、Zookeeper3.5.7集群部署4.1、centos7虚拟机1 (192.168.136.27)服务器安装步骤4.1.1、解压…

day23_多线程基础

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、作业 二、进程与线程 三、创建线程 四、线程的API 五、线程状态 六、线程同步 零、 复习昨日 晨考 一、作业 见答案 二、进程与线程[了解] 一个进程就…

上海分时电价机制调整对储能项目的影响分析

安科瑞 耿敏花 2022年12月16日,上海市发改委发布《关于进一步完善我市分时电价机制有关事项的通知》(沪发改价管〔2022〕50号)。通知明确上海分时电价机制,一般工商业及其他两部制、大工业两部制用电夏季(7、8、9月)和冬季&#x…

MyBatis底层原理【源码运行时序图】

MyBatis初始化流程🛷 以下代码为例🎉 🎇可对应源码阅读 MyBatis初始化流程✨ #mermaid-svg-yoG1e8Dnp3UIAOUW {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-yoG1e8Dnp3UIAOU…

robotframework 常用关键字

ctrl shift 空格:自动补全关键字 F5:搜索关键字 F8:执行用例 ctrl shift s:保存整个工程 ctrl r:查看报告 ctrl 鼠标悬浮:显示关键字的信息 ctrl #:屏蔽代码 ctrl $:…

4-spring篇

ApplicationContext refresh的流程 12个步骤 prepareRefresh 这一步创建和准备了Environment对象,并赋值给了ApplicationContext的成员变量 要理解Environment对象的作用 obtainFreshBeanFactory ApplicationContext 里面有一个成员变量,Beanfactory b…

Navicat 现已支持 OceanBase 全线数据库产品

Navicat 作为 OceanBase 生态工具的合作伙伴,这是双方产品适配第三个里程碑。2022 年 7 月的首个里程碑,Navicat 实现了 OceanBase 社区版的功能性兼容。同年10 月,进一步实现了针对 OceanBase 企业版( 兼容 MySQL 模式&#xff0…

一文图解|I/O 调度层

当我们使用 read() 和 write() 系统调用向内核提交读写文件操作时,内核并不会立刻向硬盘发送 I/O 请求,而是先将 I/O 请求交给 I/O 调度层进行排序和合并处理。经过 I/O 调度层加工处理后,才会将 I/O 请求发送给块设备驱动进行最终的 I/O 操作…

【强烈建议收藏:MySQL面试必问系列之慢SQL优化专题】

一.知识回顾 学习本篇文章之前呢,我们可以先看一下【强烈建议收藏:MySQL面试必问系列之SQL语句执行专题】,看完这篇文章再来学习本篇文章可谓是如虎添翼。好的,那我们也不讲太多的废话,直接开始。 二.如何做慢SQL查询优化呢&…

《uniapp基础知识》学习笔记Day38-(Period2)全局文件一些常用的配置

如果进行开发的话,首先要配置路由页面 page.json 页面路由 pages.json 文件用来对 uni-app 进行全局配置,决定页面文件的路径、窗口样式、原生的导航栏、底部的原生tabbar 等。 {"pages": [{"path": "pages/component/index…

Centos7搭建DHCP

1.简介DHCP服务器又叫动态主机协议,由服务器划分一段地址池,客户端地址池中获取IP地址及掩码等信息端口:UDP 67/68主配置文件:/etc/dhcp/dhcpd.conf租约时间文件:/etc/sysconfig/dhcpd2.简单搭建DHCP服务PS&#xff1a…

离线数据仓库项目--技术选择

文章目录(一)技术选型1)数据采集工具2)数据存储3)数据计算4)数据可视化(二)整体架构设计(三)服务器资源规划(一)技术选型 1&#xff…

MySQL索引事务

1.索引1.1概念索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结果实现。(这里只用通俗的语言和图片进行介绍)1.2作用数据库中的表…

洗地机哪个牌子好?口碑最好的洗地机

选择洗地机,最关键的当然是清洁力度啦,这就要看洗地机的吸力如何了,一般情况下,吸力越大,越能够吸附顽固污渍,清洁力度就越好。然后杀菌功能也是必不可少的,毕竟是要清洁整个家的地面卫生&#…

Android 圆弧形 SeekBar

效果预览package com.gcssloop.widget;import android.annotation.SuppressLint;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Matrix;import android.graph…

ViT(Vision Transformer) TNT(Transformer in Transformer)

ViT(Vision Transformer) ViT的结构 ViT将输入图片分为多个patch(16x16),再将每个patch投影为固定长度的向量送入Transformer,后续encoder的操作和原始Transformer中完全相同。但是因为对图片分类,因此在输入序列中加…

论文复现-3

模型构建中的运算 数据集是CONLL03 这个数据集共有4种实体类型,所以,在做实体描述的embedding时,得到的语义表示的Tensor大小为 : 4*max_len, 具体指的是: type_input_ids: torch.LongTensor None, type_attention_m…

2023年中职组网络安全竞赛——web服务渗透测试解析

web服务渗透测试(100分) 题目如下: 解析如下: PS:任务环境可以私信博主,求个三连吧! 通过本地PC中的渗透测试平台KALI2020对靶机进行WEB渗透,找到页面内的文件上传漏洞并且尝试进行上传攻击,将文件上传成功后的页面回显字符串作为FLAG提交(如:点击超链接查看上传文…

Python自动化测试之requests库【发送json数据类型 】(六)

目录:导读 数据类型 application/json: application/x-www-form-urlencoded text/xml requests发送json 写在最后 我们都知道post请求中的body有4种数据类型,今天我们来写一篇关于requests请求json这种数据类型。 数据类型 我们都知道…

使用JSON.stringify的第三个参数,美化序列化后的值

事情是这样的,我在使用tiptap富文本编辑器,展示JSON代码,效果图肯定是这样的假设我有一个javascript对象如下const data {a: test }想要实现上面的效果,肯定需要使用JSON.stringifyconst editorData JSON.stringify(data)editor…