中间件-消息队列
消息队列基础知识
什么是消息队列
本处提到的消息队列是指各个服务以及系统组件/模块之间的通信,属于一种中间件。参与消息传递的双方称为生产者和消费者,生产者负责发送消息,消费者负责处理消息。

消息队列作用
- 通过异步处理,提高系统性能(减少响应所需时间)
- 削峰/限流
- 降低系统耦合性
消息队列如何降低耦合性
消息队列使用发布-订阅模式工作,消息发送者(生产者)发布消息,一个或多个消息接受者(消费者)订阅消息。 从上图可以看到消息发送者(生产者)和消息接受者(消费者)之间没有直接耦合,消息发送者将消息发送至分布式消息队列即结束对消息的处理,消息接受者从分布式消息队列获取该消息后进行后续处理,并不需要知道该消息从何而来。对新增业务,只要对该类消息感兴趣,即可订阅该消息,对原有系统和业务没有任何影响,从而实现网站业务的可扩展性设计。
消息队列带来的问题
- 系统可用性下降
- 系统复杂度提高
- 一致性问题
JMS Java消息服务
JMS(JAVA Message Service)API是一个消息服务的标准或者说是规范,允许应用程序组件基于JavaEE平台创建、发送、接收和读取消息。
JMS的两种消息模型
-
点到点(P2P)模型
使用队列(Queue)作为消息通信载体;满足生产者与消费者模式,一条消息只能被一个消费者使用,未被消费的消息在队列中保留直到被消费或超时。

-
发布/订阅(Pub/Sub)模型
使用主题(Topic)作为消息通信载体,类似于广播模式;发布者发布一条消息,该消息通过主题传递给所有的订阅者。

RPC与消息队列区别
- 用途:RPC是用于解决两个服务之间的远程通信问题,用于调用远程计算机上某个服务的方法;消息队列主要用来降低系统耦合性、实现任务异步、进行流量削峰。
- 通信方式:RPC是双向直接网络通讯,消息队列是单向引入中间载体的网络通讯。
- 架构:消息队列是需要把消息存储起来,RPC则没有相关需求。
- 请求处理的时效性:通过RPC发出的调配用一般会被处理,放在消息队列中的消息不一定会被处理。
RabbitMQ
RabbitMQ 如何保证信息不丢失
- 开启生产者确认机制,确保生产者的消息能到达队列
- 开启持久化功能,确保消息未消费前在队列中不会丢失
- 开启消费者确认机制为auto,由spring确认消息处理成功后完成ack
- 开启消费者失败重试机制,多次失败后将消息投递到异常交换机,交由人工处理
RabbitMQ消息重复消费问题怎么解决
- 设置一个唯一的标识符,处理消息时,先到数据库查询一下,如果不存在就正常处理,如果存在就不用再消费
- 幂等方案:利用redis分布式锁、数据库的锁等
RabbitMQ中的死信交换机?(RabbitMQ延迟队列了解过吗?)
当一个消息在一个队列中变为死信后,可以被重新发送到另一个交换机中,这个交换机就是死信交换机。导致死信的几种原因有:
- 消息被拒(Basic.Reject / Basic.Nack)且requeue = false
- 消息TTL过期
- 队列满了,无法再添加。
什么是延迟队列?RabbitMQ如何实现延迟队列?
延迟队列指的是存储对应的延迟消息,消息被发送以后,并不想让消费者立刻拿到消息,而是等待特定时间后,消费者才能拿到这个消息进行消费。
实现方式:
- 利用RabbitMQ的死信交换机和消息存活时间TTL来实现
- 安装死信插件(具体没用过)
RabbitMQ如果有100万消息堆积在MQ中,如何解决(消息堆积怎么解决)?
当生产者发送消息的速度超过了消费者处理消息的速度,就会导致队列中的消息堆积,直到存储消息达到上限。之后发送的消息就会变为死信,肯会被抛弃,这就是消息堆积。
解决消息堆积有三种思路
- 增加更多消费者
- 消费者使用线程池,多线程处理消息
- 使用惰性队列,扩大堆积上线
惰性队列
- 在声明队列的时候设置属性x-queue-mode为lazy,即惰性队列
- 基于磁盘存储,消息上限高
- 性能比较稳定,但基于磁盘存储,受限于磁盘IO,时效性会降低。
RabbitMQ的高可用机制
在生产环境中,使用集群来保证高可用性
普通集群
又称标准集群,具备以下特征:
- 会在集群的各个节点减共享部分数据,包括:交换机、队列元信息。不包含队列中的信息。
- 当访问集群某个节点时,如果队列不在该节点,会从数据所在节点传递到当前节点在返回
- 队列所在节点宕机,队列中的消息就会消失
镜像集群
本质是主从模式,具备下面的特征
- 交换机、队列、队列中的消息 会在各个mq的镜像节点之间同步备份
- 创建队列的节点被称为该队列的主节点,备份到的其他节点叫做该队列的镜像节点
- 一个队列的主节点可能是另一个队列的镜像节点
- 所有操作都是主节点完成,然后同步给镜像节点
- 主节点宕机后,镜像节点会替代成为新的主节点
仲裁队列
- 与镜像队列一样,都是主从模式,支持主从数据同步
- 使用简单,没有复杂配置,只需在声明队列的时候指定使用仲裁队列
- 主从同步基于Raft协议,强一致性
Kafka
Kafka如何保证消息不丢失
生产者发送消息到Brocker丢失
- 设置异步发送
消息在Brocker丢失
Kafka如何保证消费顺序性
kafka默认存储和消费信息,是不能保证顺序性的。因为一个topic数据可能存储在不同的分区中,每个分区都有一个按照顺序存储的偏移量。如果消费者关联了多个分区,不能保证顺序性。
但是通过把消息存储到一个分区下可以解决。方法有两种:1)发送消息时指定分区号。2)发送消息时,按照相同的业务设置相同的key。因为默认情况下,分区也是通过key的hashcode值来选择分区的。hash值如果一样的话,分区一定一样。
相关文章:
中间件-消息队列
消息队列基础知识 什么是消息队列 本处提到的消息队列是指各个服务以及系统组件/模块之间的通信,属于一种中间件。参与消息传递的双方称为生产者和消费者,生产者负责发送消息,消费者负责处理消息。 消息队列作用 通过异步处理࿰…...
一文get,最容易碰上的接口自动化测试问题汇总
本篇文章分享几个接口自动化用例编写过程遇到的问题总结,希望能对初次探索接口自动化测试的小伙伴们解决问题上提供一小部分思路。 sql语句内容出现错误 空格:由于有些字段判断是变量,需要将sql拼接起来,但是在拼接字符串时没有…...
Oracle:ORA-01830错误-更改数据库时间格式
1,先把报错SQL语句拿出来执行,看看是不是报的这个错 ORA-01830: 日期格式图片在转换整个输入字符串之前结束 2,然后查看默认日期格式是不是“YYYY-MM-DD HH24:MI:SS”(正确格式)。; 执行: SELECT * FRO…...
树状数组及应用
目录 1.树状数组的概念与基本编码 1.1.引导 1.2.lowbit(x) 1.3.树状数组的编码 2.树状数组的基本应用 2.1.单点修改+区间查询 2.2.区间修改单点查询 例题: 2.3.区间修改+区间查询 例题: 如果数列A是静态不变的ÿ…...
HarmonyOS 应用开发案例
本帖下方集中了HarmonyOS Next应用开发时,会遇到的常见应用案例。后续会持续更新大量案例,帮助开发者快速学习。欢迎感兴趣的同学加入Q:454901491 72.手写绘制及保存图片案例(0319更新)(点此查看源码实现&…...
【C++ leetcode】双指针(专题完结)
15. 三数之和 题目 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的…...
动态代理大总结
1.开启EnableAspectJAutoProxy注解 @EnableAspectJAutoProxy注解【相当于加了个BeanPostProcessor】,会导入AspectJAutoProxyReqistrar这个类,会把AnnotationAwareAspectJAutoProxyCreator注册进spring容器中,注册进容器后还会看这两个属性的值【proxyTargetClass,exposeP…...
理解Harris角点检测的数学原理
Harris角点检测的数学原理 Harris角点检测基于图像的局部自相似性,它通过分析图像窗口在各个方向上移动时灰度变化的程度来识别角点,它通过计算每个像素点的Harris响应值来评估该点是否为角点。数学上,这种变化可以通过构建一个二次型函数来量化,该函数基于图像在x和y方向上…...
ETIM -国际贸易的产品分类标准
ETIM 是除了XML 国际交流标准BMEcat之外的国际贸易的产品分类标准。 什么是ETIM ? ETIM是一种基于分类识别共享和交换产品数据的格式。这种广泛使用的技术产品分类标准是为了构建 B2B 专业人员之间的信息流而制定的。 为什么选择ETIM? ETIM分类模型的开…...
MySQL高阶SQL语句
文章目录 MySQL高阶SQL语句MySQL常用查询1、按关键字排序1.1 语法1.2 ASC和DESC1.3 对数据表中信息进行排序1.3.1 普通排序1.3.2 结合where进行条件过滤1.3.3 对多个字段进行排序 2、区间判断及查询不重复记录2.1 and/or —— 且/或2.1.1 普通查询2.1.2 嵌套/多条件查询 2.2 di…...
聊聊CSS
css 的介绍 学习目标 能够知道css的作用 1. css 的定义 css(Cascading Style Sheet)层叠样式表,它是用来美化页面的一种语言。 没有使用css的效果图 使用css的效果图 2. css 的作用 美化界面, 比如: 设置标签文字大小、颜色、字体加粗等样式。 控制页面布局, 比如…...
C语言 青蛙跳台阶问题
目录 编辑 1.问题描述 2.问题分析 3.全部代码 4.结语 1.问题描述 一只青蛙可以一次跳一级台阶,也可以一次跳两级台阶,如果青蛙要跳上n级台阶有多少种跳法? 2.问题分析 当台阶只有一级时,只能跳一级,所以只有一…...
【Django开发】前后端分离美多商城项目第3篇:用户部分,1. 后端接口设计:【附代码文档】
美多商城项目4.0文档完整教程(附代码资料)主要内容讲述:美多商城,项目准备1.B2B–企业对企业,2.C2C–个人对个人,3.B2C–企业对个人,4.C2B–个人对企业。项目准备,配置1. 修改settings/dev.py 文件中的路径信息,2. INS…...
DHCP snooping、DHCP安全及威胁防范
DHCP snooping、DHCP安全及威胁防范 [SW1]display dhcp snooping user-bind all,查看DHCP snooping表项。 DHCP snooping: 表项是通过服务器发送给客户端的ACK报文生成的。 只能在交换机上开启,路由器不支持,并且建议在接入交…...
用eclipse创建Web项目,通过Servlet实现Web访问的功能。
要使用Eclipse和Tomcat 10创建一个简单的Web项目,并通过Servlet实现Web访问功能,你需要遵循以下详细步骤: 1. 安装和配置Eclipse和Tomcat 10 确保你已经安装了Eclipse IDE for Java EE Developers和Tomcat 10。如果还没有安装,请…...
tools.jar下载 Unable to create schema compiler
网上查找了一堆下载tools.jar的都是忽悠人的,在这我就直接告诉大家,直接在电脑的JDK安装路径下的lib文件下复制就可以了。如果没有的话可以diss我我发给你...
【0278】checkpointer 共享内存(CheckpointerShmem)初始化(3)
0. 关于checkpointer 检查指针是Postgres 9.2的新特性。它处理所有检查点。自上次检查点以来,检查点在经过一定时间后自动分发,并且还可以发出信号来执行请求的检查点。(GUC参数要求每隔这么多WAL段就有一个检查点,这是通过后端在填充WAL段时发出信号来实现的; checkpointer…...
算法打卡day29|贪心算法篇03|Leetcode 1005.K次取反后最大化的数组和、134. 加油站、135. 分发糖果
算法题 Leetcode 1005.K次取反后最大化的数组和 题目链接:1005.K次取反后最大化的数组和 大佬视频讲解:K次取反后最大化的数组和视频讲解 个人思路 思路清晰,因为是取反当然是取越小的负数越好,那么先按绝对值排序。如果是负数就取反&#…...
【hexo博客6】自定义域名 购买、配置、更新部署
【hexo博客6】自定义域名 购买、配置、更新部署 写在最前面自定义域名购买域名DNS配置Github 配置 更新部署博客 🌈你好呀!我是 是Yu欸 🌌 2024每日百字篆刻时光,感谢你的陪伴与支持 ~ 🚀 欢迎一起踏上探险之旅&#…...
Django使用pyJwt进行token校验
1.登录成功后返回token,这里使用authenticate进行校验是否存在该用户 def login(request):try:data json.loads(request.body)username data.get(username)password data.get(password)if not all([username, password]):return to_response(status400, msg参数…...
ngx_http_set_virtual_server
1 定义 ngx_http_set_virtual_server 函数 定义在 ./nginx-1.24.0/src/http/ngx_http_request.cstatic ngx_int_t ngx_http_set_virtual_server(ngx_http_request_t *r, ngx_str_t *host) {ngx_int_t rc;ngx_http_connection_t *hc;ngx_http_core_loc_con…...
graph-autofusion:算子自动融合框架,让模型性能提升30%
前言 算子融合就像把多个快递包裹合并成一个,减少送货次数。 你有没有想过,为什么模型推理时,每个算子都要单独读写HBM(High Bandwidth Memory)?明明LayerNorm后面紧跟Add,为什么要分开算&#…...
2026年国内镜像站安全与效率评测:GPT-5.5的真实体验
在国内访问海外大模型,延迟高、连接不稳、支付合规是老生常谈的三座大山。为了完成本次GPT-5.5的全流程实测,我借助库拉AI聚合平台完成了所有调用——该平台支持国内外主流AI模型的统一对接,国内可直连访问,注册用户每日提供可用额…...
AI 时代,C# 程序员学 Python 到底值不值?| C#转Python
关键词:C#转Python、Python入门、AI时代、C#程序员、Python学习刷技术社区的时候,你一定见过这种标题:"Python 已成 AI 时代唯一语言""C# 已死,.NET 没未来""不会 Python 的程序员正在被淘汰"说实话…...
Linux grep 文本过滤与正则实战——日志筛选、文本匹配神器
前言grep 是 Linux 最核心的文本搜索、日志过滤命令,排查报错、筛选日志、过滤配置、批量匹配全部靠它。本文从基础用法到正则实战,全覆盖工作高频场景,看完彻底掌握 grep。一、grep 核心作用从文件/管道流中匹配包含指定关键词的行ÿ…...
SQL 最常用技能详解与实战示例
引言 SQL(Structured Query Language,结构化查询语言)是与关系型数据库交互的核心工具。无论是数据分析师、后端开发工程师还是产品经理,掌握 SQL 的核心技能都至关重要。本文将系统性地介绍 SQL 中最常用、最核心的技能ÿ…...
基于Spring Security与JWT的权限认证技术研究
在高校信息化管理系统中,数据安全与权限隔离是系统设计的核心重点。学生奖惩信息属于高校学生核心隐私数据,包含学生奖励记录、违纪处分记录、档案信息、审批流程信息等敏感内容,若缺乏完善的权限管控机制,极易出现数据泄露、越权…...
MySQL 高频面试题-01
在去面试之前,很多人天天背“八股文”,结果一到现场被面试官稍微一变形就问懵了。比如:“你天天说 B 树,那为什么不用 B 树?不用红黑树?它俩到底差在哪?”“既然索引能加速,那我把所…...
大模型MoE架构揭秘:稀疏激活与专家路由原理
1. 这不是“参数越多越强”的简单故事:拆解大模型里被悄悄激活的那2% 你可能已经看过不少标题党文章,说“GPT-4有1.8万亿参数”,然后配上一张CPU满载、风扇狂转的动图,仿佛这串数字本身就在燃烧算力。但真实情况恰恰相反——它只用…...
兜兜转转又回到大浪浪的S05,遥看当年黑丝在,今朝尽染满头霜。
偶然翻看CSDN头像,恍然惊觉已是十五载光阴。2011年拍照于此设头像。初来S05,一路辗转S01,兜兜转转,历经浮沉,如今终究重回最初的S05。这十几年来,方寸代码天地,见证了我的所有成长与蜕变。一路行…...
