MQ(消息队列)体系详解
消息队列(MQ,Message Queue) 是一种基于消息传递的异步通信机制,用于不同系统、服务之间进行数据传递和交互。它通常用来解耦生产者和消费者,提供高可用、高吞吐量和可靠的消息传递。
一、消息队列用途
1.系统解耦
消息队列使得发送消息的应用和接收消息的应用解耦,生产者与消费者不需要直接联系,降低了系统之间的耦合度,增强了系统的灵活性。
2.异步处理
消息队列支持异步通信,生产者发送消息后无需等待消费者处理完成,从而提高了系统的吞吐量和响应速度。
3.流量削峰
在系统高峰期,生产者发送消息到队列后,消费者可以按需处理,避免系统瞬间的流量压力。
4.任务调度
消息队列常用于分布式系统中的任务调度,如定时任务、延时任务等。
5.数据缓冲
消息队列可以作为数据缓冲区,存储临时数据,处理异步事件,保障系统的稳定性。
6.数据同步
消息队列可以实现跨系统、跨服务的数据一致性同步。
二、消息队列架构
消息队列架构主要由以下几个组件组成:
1.消息生产者(Producer)
生产并发送消息到消息队列的应用或服务。
2.消息队列(Broker)
负责接收、存储消息并将其传递给消费者。
也可以有多个消息队列集群,分担负载、提高可用性。
3.消息消费者(Consumer)
从消息队列中消费消息的应用或服务,处理消息并进行相应操作。
4.消息中间件
是一种代理服务,帮助实现消息队列的功能,通常是消息传递的中介。
三、消息队列拓扑结构
1.点对点(Queue)
消息被发送到一个队列,消费者按顺序消费消息,通常是负载均衡的消费模式。
2.发布/订阅(Topic)
生产者将消息发送到一个主题,多个消费者可以订阅该主题并接收消息。
四、常用消息队列系统
五、消息队列常见问题与解决方案
1. 消息丢失
(1)原因
生产者发送失败、Broker宕机未持久化、消费者提交Offset后处理失败。
(2)解决方案
生产者:启用acks=all(Kafka)、事务消息(RocketMQ)。
Broker:多副本同步、持久化到磁盘。
消费者:手动提交Offset,处理完成后再提交。
2. 消息重复消费
(1)原因
生产者重试、消费者重平衡、消费者Offset提交失败。
(2)解决方案
幂等性设计:业务唯一ID + 数据库唯一约束、Redis原子操作。
MQ内置去重:Kafka生产者幂等(enable.idempotence=true)、RocketMQ的Message ID去重。
3.消息顺序错乱
(1)原因
多分区并行消费、消费者多线程处理。
(2)解决方案
单分区有序:相同Key的消息发送到同一分区(Kafka),消费者单线程消费。
业务层排序:缓存消息并按时间戳/序列号排序后处理。
4.消息堆积
(1)原因
生产速率 > 消费速率。
(2)解决方案
扩容消费者:增加消费者实例或线程数(不超过分区数)。
过滤消息:消费者跳过非关键消息。
限流降级:生产者限流。
消息清理策略:设置消息TTL(过期时间)、临时扩容存储。
5.高可用性不足
(1)原因
Broker单点故障、网络分区。
(2)解决方案
集群部署:Kafka集群 + ZooKeeper协调(或KRaft模式)。
多副本同步:ISR机制(Kafka)、镜像队列(RabbitMQ)。
6.事务消息一致性
(1)原因
本地事务与消息发送状态不一致。
(2)解决方案
本地事务表:业务与消息落库,定时任务补偿。
MQ事务消息:RocketMQ两阶段提交(Half消息 + 事务状态回查)。
六、消息队列选型建议
七、消息队列未来趋势
云原生集成:Kubernetes原生支持(如Strimzi管理Kafka集群)。
Serverless MQ:按需自动扩缩容,如AWS SQS、Azure Service Bus。
流批一体:Kafka + Flink实现实时与离线数据统一处理。
AIOps:通过AI监控MQ健康状态,自动优化吞吐和延迟。
八、总结
消息队列是现代分布式系统中不可或缺的组件,具有解耦、异步处理、流量削峰等优点。在实际应用中,选择合适的消息队列系统并处理常见问题(如消息丢失、重复消费、堆积等)是保证系统高效、可靠运行的关键。了解不同消息队列系统的特点以及如何解决常见问题,可以帮助开发者更好地设计和优化分布式系统。
相关文章:
MQ(消息队列)体系详解
消息队列(MQ,Message Queue) 是一种基于消息传递的异步通信机制,用于不同系统、服务之间进行数据传递和交互。它通常用来解耦生产者和消费者,提供高可用、高吞吐量和可靠的消息传递。 一、消息队列用途 1.系统解耦 …...
【GESP真题解析】第 3 集 GESP一级样题卷编程题 2:闰年求和
大家好,我是莫小特。 这篇文章给大家分享 GESP 一级样题卷编程题第 2 题:闰年求和。 题目链接 洛谷链接:B3846 闰年求和 一、完成输入 根据题目要求,我们需要输入两个整数,分别表示起始年份和终止年份。 要求计算…...
Windows Server 2019 安装 Docker 完整指南
博主本人使用的是离线安装 1. 安装前准备 系统要求 操作系统:Windows Server 2019(或 2016/2022)权限:管理员权限的 PowerShell网络:可访问互联网(或离线安装包) 启用容器功能 Install-Win…...
JetBrains PhpStorm v2024.3.1 Mac PHP开发工具
JetBrains PhpStorm v2024.3.1 Mac PHP开发工具 一、介绍 JetBrains PhpStorm 2024 mac,是一款PHP开发工具,直接开始编码,无需安装和配置大量插件。PhpStorm 从一开始就已包含 PHP、JavaScript 和 TypeScript 开发所需的一切,还…...
机器学习(ML)在AI驱动测试通过数据驱动的智能决策显著提升测试效率、覆盖率和准确性。
机器学习(ML)在AI驱动测试中扮演着 核心引擎 的角色,通过数据驱动的智能决策显著提升测试效率、覆盖率和准确性。以下是机器学习在测试各环节的具体作用及实现方案: 一、机器学习在测试生命周期中的作用 #mermaid-svg-u4vgPE6O2jugiZFB {font-family:"trebuchet ms&qu…...
0x06.Redis 中常见的数据类型有哪些?
回答重点 Redis 常见的数据结构主要有五种,这五种类型分别为:String(字符串)、List(列表)、Hash、Set(集合)、Zset(有序集合,也叫sorted set)。 String 字符串是Redis中最基本的数据类型,可以存储任何类型的数据,包括文本、数字和二进制数据。它的最大长度为512MB。 使…...
本地缓存方案Guava Cache
Guava Cache 是 Google 的 Guava 库提供的一个高效内存缓存解决方案,适用于需要快速访问且不频繁变更的数据。 // 普通缓存 Cache<Key, Value> cache CacheBuilder.newBuilder().maximumSize(1000) // 最大条目数.expireAfterWrite(10, TimeUnit.MINUTES) /…...
A Causal Inference Look at Unsupervised Video Anomaly Detection
标题:无监督视频异常检测的因果推断视角 原文链接:https://ojs.aaai.org/index.php/AAAI/article/view/20053 发表:AAAI-2022 文章目录 摘要引言相关工作无监督视频异常检测因果推断 方法问题公式化一般设置强基线模型 无监督视频异常检测的因…...
MQ(RabbitMQ.1)
MQ的含义及面试题 MQMQ的含义MQ之间的调用的方式MQ的作用MQ的几种产品RabbitMQRabbitMQ的安装RabbitMQ的使用RabbitMQ⼯作流程 AMQPWeb界面操作用户相关操作虚拟主机相关操作 RabbitMQ的代码应用编写生产者代码编写消费者代码 生产者代码消费者代码 MQ MQ的含义 MQ࿰…...
cursor+高德MCP:制作一份旅游攻略
高德开放平台 | 高德地图API (amap.com) 1.注册成为开发者 2.进入控制台选择应用管理----->我的应用 3.新建应用 4.点击添加Key 5.在高德开发平台找到MCP的文档 6.按照快速接入的步骤,进行操作 一定要按照最新版的cursor, 如果之前已经安装旧的版本卸载掉重新安…...
FPGA时序分析与约束(11)——时钟组
目录 一、同步时钟与异步时钟 二、逻辑与物理独立时钟 2.1 逻辑独立时钟 2.2 物理独立时钟 三、如何设置时钟组 四、注意事项 专栏目录: FPGA时序分析与约束(0)——目录与传送门https://ztzhang.blog.csdn.net/article/details/134893…...
opencv 识别运动物体
import cv2 import numpy as npcap cv2.VideoCapture(video.mp4) try:import cv2backSub cv2.createBackgroundSubtractorMOG2() except AttributeError:backSub cv2.bgsegm.createBackgroundSubtractorMOG()#形态学kernel kernel cv2.getStructuringElement(cv2.MORPH_REC…...
opencv实际应用--银行卡号识别
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,主要用于图像和视频处理、目标检测、特征提取、3D重建以及机器学习任务。它支持多种编程语言(如C、Python),提供丰富的算法和工具&a…...
【软考系统架构设计师】系统架构设计知识点
1、 从需求分析到软件设计之间的过渡过程称为软件架构。 软件架构为软件系统提供了一个结构、行为和属性的高级抽象,由构件的描述、构件的相互作用(连接件)、指导构件集成的模式以及这些模式的约束组成。 软件架构不仅指定了系统的组织结构和…...
GPT - 2 文本生成任务全流程
数据集下载 数据预处理 import json import pandas as pdall_data []with open("part-00018.jsonl",encoding"utf-8") as f:for line in f.readlines():data json.loads(line)all_data.append(data["text"])batch_size 10000for i in ran…...
重返JAVA之路——面向对象
目录 面向对象 1.什么是面向对象? 2.面向对象的特点有哪些? 3.什么是对象? 4.什么是类? 5.什么是构造方法? 6.构造方法的特性有哪些? 封装 1.什么是封装? 2.封装有哪些特点? 数据隐…...
docker 安装 jenkins
拉取镜像 docker pull jenkins/jenkins:2.426.3-lts-jdk17 创建数据卷 # 创建时即设置安全权限(SGID确保组权限继承) sudo mkdir -p /var/jenkins_home sudo chmod -R 777 /var/jenkins_home 拉取镜像并运行容器 # 生产环境推荐(JDK17…...
sql 向Java的映射
优化建议,可以在SQL中控制它的类型 在 MyBatis 中,如果返回值类型设置为 java.util.Map,默认情况下可以返回 多行多列的数据...
探索Streamlit在测试领域的高效应用:文档读取与大模型用例生成的完美前奏
大模型用例生成前置工作之文档读取——构建你的自动化测试基础 在群友的极力推荐下,开始了streamlit的学习之旅。本文将介绍如何使用Streamlit开发一个多功能文档处理工具,支持读取、预览、格式转换和导出多种测试相关文档(YAML、JSON、DOCX…...
Python中数值计算、表格处理和可视化的应用
1.数值计算:Numpy import numpy as np 1.1创建数组 import numpy as np arr1 np.array([[1,2,3,4,5]]) print(arr1) print(type(arr1)) print("数组形状",arr1.shape) arr2 np.array([[1,2,3],[2,3,4]]) print(arr2) print(type(arr1)) print("…...
【数据可视化艺术·实战篇】视频AI+人流可视化:如何让数据“动”起来?
景区游玩,密密麻麻全是人,想找个拍照的好位置都难;上下班高峰挤地铁,被汹涌的人潮裹挟着,只能被动 “随波逐流”。这样的场景,相信很多人都再熟悉不过。其实,这些看似杂乱无章的人群流动现象&am…...
038-flatbuffers
flatbuffers FlatBuffers技术调研报告 一、核心原理与优势 FlatBuffers通过内存直接访问技术实现零拷贝序列化,其核心优势如下: 内存布局:数据以连续二进制块存储,包含VTable(虚拟表)和Data Object&…...
探索 Go 与 Python:性能、适用场景与开发效率对比
1 性能对比:执行速度与资源占用 1.1 Go 的性能优势 Go 语言被设计为具有高效的执行速度和低资源占用。它编译后生成的是机器码,能够直接在硬件上运行,避免了 Python 解释执行的开销。 以下是一个用 Go 实现的简单循环计算代码: …...
Pinia最基本用法
1. 定义 Store 首先,定义一个 Pinia Store,使用组合式 API 风格和 ref 来管理状态。 示例:stores/ids.js import { defineStore } from pinia; import { ref } from vue;export const useIdsStore defineStore(ids, () > {const ids …...
MySQL中的UNION和UNION ALL【简单易懂】
一、前言 UNION 和 UNION ALL 是 SQL 中用于合并多个查询结果集的关键字。 二、核心作用 两者均用于将多个 SELECT 语句的结果集纵向合并(列结构需相同),但行为存在关键差异: 三、使用场景对比 需要去重时:例如合并…...
ConcurrentHashMap 源码分析
摘要 介绍线程安全集合类 ConcurrentHashMap 源码,包括扩容,协助扩容,红黑树节点读写线程同步,插入元素后累加键值对数量操作原子性实现。 1 成员变量及其对应的数据结构 底层由数组红黑树链表实现volatile long baseCount 和 v…...
一种基于学习的多尺度方法及其在非弹性碰撞问题中的应用
A learning-based multiscale method and its application to inelastic impact problems 摘要: 我们在工程应用中观察和利用的材料宏观特性,源于电子、原子、缺陷、域等多尺度物理机制间复杂的相互作用。多尺度建模旨在通过利用固有的层次化结构来理解…...
【DE2-115】Verilog实现DDS+Quartus仿真波形
【DE2-115】Verilog实现DDSQuartus仿真波形 一、任务要求二、实现步骤2.1 相位累加器2.2 波形存储器ROM2.2.1 方波模块2.2.2 正弦波形存储器 2.3 3锁相环倍频电路2.4 顶层电路设计 三、设计实现四、实验总结 一、任务要求 采用数字频率合成(Direct Digital Frequen…...
StickyNotes,简单便签超实用
日常工作中是不是经常需要记点东西,但又不想用太复杂的工具?今天给你推荐一款超简单的桌面便签软件——StickyNotes。 下面是动图: 简单到极致的便签工具 StickyNotes真的是简单到不能再简单了。打开软件,直接输入你的便签内容&a…...
深度探索 C 语言:指针与内存管理的精妙艺术
C 语言作为一门历史悠久且功能强大的编程语言,以其高效的性能和灵活的底层控制能力,在计算机科学领域占据着举足轻重的地位。 指针和内存管理是 C 语言的核心特性,也是其最具挑战性和魅力的部分。深入理解指针与内存管理,不仅能够…...
【C++】深拷贝与浅拷贝
重开也不是不可能 ~.~ 浅拷贝 #include <iostream> #include <cstring>class ShallowCopyExample { public:int m_nValue;int* m_pData;// 构造函数,初始化指针成员ShallowCopyExample(int value) : m_nValue(value) {m_pData new int(0);*m_pData va…...
【3】k8s集群管理系列--包应用管理器helm之chart资源打包并推送到harbor镜像仓库
一、chart资源打包 helm package ./web-chart # 当前目录会生成一个tgz的压缩文件二、安装help push插件(用于推送前面打包的文件,到镜像仓库) .1 下载help-push二进制文件 wget https://github.com/chartmuseum/helm-push/releases/down…...
React与Vue:选择哪个框架入门?
React与Vue:选择哪个框架入门? 作为前端开发者,我在React和Vue两个框架间切换多次,常被新手问到应该从哪个入手。不同于网上那些详尽的技术比较,这里我想从实用角度给你一个简明对比。 两大框架核心差异 特性ReactV…...
pycharm已有python3.7,如何新增Run Configurations中的Python interpreter为python 3.9
在 PyCharm 中,如果你已经安装了 Python 3.9,并且希望在 Run Configurations 中新增一个 Python 3.9 的解释器,可以按照以下步骤操作: 步骤 1:打开 PyCharm 设置 点击 PyCharm 左上角的 File 菜单。选择 Settings&am…...
STL之迭代器(iterator)
迭代器的基本概念 迭代器(iterator)模式又称为游标(Cursor)模式,用于提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。或者这样说可能更容易理解:Iterator模式是运用于聚合对象的一种模式,通过运用该模式&#…...
Mysql5.7配置文件
Mysql5.7配置文件 初始化数据库之前修改my.cnf----配置持久化键(persistence key) 初始化数据库之前修改my.cnf----配置持久化键(persistence key) 使用utf8mb4而不是utf8: https://blog.csdn.net/omaidb/article/details/106481406 https://blog.csdn.net/fdipzo…...
HarmonyOS-ArkUI V2装饰器: @Provider和@Consumer装饰器:跨组件层级双向同步
作用 我们在之前学习的那些控件中,各有特点,也各有缺陷,至今没有痛痛快快的出现过真正能跨组件的双向绑定的装饰器。 比如 @Local装饰器,不能跨组件@Param装饰器呢,能跨组件传递,但是仅仅就是下一层组件接收参数。另外,它是单向传递,不可被重新赋值。如果您非要改值则…...
【HarmonyOS 5】敏感信息本地存储详解
【HarmonyOS 5】敏感信息本地存储详解 前言 鸿蒙其实自身已经通过多层次的安全机制,确保用户敏感信息本地存储安全。不过再此基础上,用户敏感信息一般三方应用还需要再进行加密存储。 本文章会从鸿蒙自身的安全机制进行展开,最后再说明本地…...
0x03.Redis 通常应用于哪些场景?
回答重点 1)缓存(Cache): Redis 最常用的场景是作为缓存层,以减少数据库的负载,提高数据读取速度。例如,常用的用户会话数据和页面渲染结果可以存储在 Redis 中。2)分布式锁(Distributed Lock): Redis 可以用作分布式锁的实现,确保在分布式系统中资源的安全访问,避免…...
Keil创建自定义的STM32标准库工程
注:以下工程创建将以STM32F103ZET6为例 1 下载需要的资料包 1.1 下载 Keil 的 STM32F103 芯片支持包 1.1.1 手动下载安装包 Keil官网:https://www.keil.com/ (1)进入官网,点击 Download。 (2…...
React(1)基础入门
React(1)基础入门 Author: Once Day Date: 2025年4月10日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: FullStack开发_Once-Day的博客-CSDN博客 …...
Mysql8配置文件
Mysql8配置文件 修改my.cnf----配置持久化键(persistence key)配置表名不区分大小写 修改my.cnf----配置持久化键(persistence key) MySQL8初始化数据库之前配置好这些变量值,初始化数据库之后可能无法修改这个值。 # 服务端配置 [mysqld] ######## 数据目录和基…...
c/c++ 使用libgeotiff读取全球高程数据ETOPO
#include <geotiff.h> #include <geotiffio.h> #include <tiffio.h> #include <iostream> #include <xtiffio.h> void MyTIFFErrorHandler(const char* module, const char* fmt, va_list args) {// 格式化错误消息char buffer[1024];vsnprintf(…...
Spring Boot集成Nacos
1. 添加依赖 在pom.xml文件中添加Nacos相关依赖。根据Spring Boot版本选择合适的依赖版本: Spring Boot 3.2.x版本 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artif…...
CAP理论 与 BASE理论
一、分布式系统存在的问题 1.分布式系统 20世纪90年代,随着互联网应用的快速扩张,传统单机系统难以支撑高并发、跨地域的数据处理需求。分布式系统(Distributed System) 逐渐成为主流架构,分布式系统是由多台计算机&…...
C++(21)—类和对象(下) ⑥匿名对象
文章目录 一、匿名对象的定义与基本特性二、匿名对象与有名对象的对比1. 有名对象2. 匿名对象 三、匿名对象的构造与析构时机1. 构造与析构规则2. 示例分析 四、匿名对象的适用场景1. 临时调用对象方法2. 作为函数参数 五、总结 一、匿名对象的定义与基本特性 匿名对象&#x…...
Go环境变量配置
Go环境变量配置 一、下载 进入The Go Programming Language 点击下载对应操作系统的 安装成功界面如下图,默认安装到: usr/local/go/ 安装完成之后,在终端运行 go version,如果显示类似下面的信息,表明安装成功(备注:darwin(其实…...
AI推理强,思维模型也有功劳【58】二八定律思维
giszz的理解:二八定律,我们说的和听的都比较多。20%的关键,是事物本质,做人不要贪心,也不要胡子眉毛一把抓。当然,也不要轻视那80%。 一、定义 二八定律思维模型,也被称为帕累托法则࿰…...
文件上传靶场
文件上传靶场 项目结构 upload-lab/ ├── Dockerfile └── www├── index.php└── upload└── flag.txt执行命令流程(逐行执行) 创建目录结构 # 创建目录结构 mkdir upload-lab;cd upload-lab mkdir -p www/upload# 创建flag文件 echo &qu…...
RV1106 OCR 识别算法
一 题记 目标是在某款 RV1106 低算力小板下跑通OCR文字识别算法,做个简单的应用,RK 官方模型库rk_model_zoo 有PP-OCR 的例子,但在 rv1106 上尚未支持。于是便打算折腾一吧。 二 方案甄选 参考国外某大佬的比较: 对比了几种方案…...