消息中间件
零、文章目录
消息中间件
1、中间件
(1)概述
- 中间件(Middleware)是位于操作系统、网络与数据库之上,应用软件之下的一层独立软件或服务程序,其核心作用是连接不同系统、屏蔽底层差异,并为应用提供统一的开发与运行环境。
(2)核心作用
- **解耦与通信:**中间件作为“桥梁”,帮助不同技术架构的应用实现数据交互和资源共享,例如消息队列(如Kafka)处理异步通信,数据库中间件(如Sharding-JDBC)简化分库分表操作。
- **屏蔽底层复杂性:**通过标准化接口协议(如HTTP、RPC),中间件隐藏操作系统、硬件和网络协议的差异,开发者无需关注底层实现,只需专注于业务逻辑。
- **提升系统可靠性:**提供事务管理、负载均衡、故障恢复等功能。例如,交易中间件(如Tuxedo)确保分布式事务的原子性和一致性,消息中间件在接收方不可用时缓存数据避免丢失。
(3)主要分类
类型 | 功能与典型应用 | 代表产品/技术 |
---|---|---|
通信处理中间件 | 实现跨平台数据传输,如消息队列、RPC框架 | RabbitMQ、gRPC、Kafka |
数据库中间件 | 统一数据访问接口,支持分库分表、读写分离 | MyCAT、Sharding-JDBC |
事务中间件 | 管理分布式事务,保障ACID特性 | Seata、Atomikos |
Web服务中间件 | 处理HTTP请求、会话管理,如Web服务器和API网关 | Tomcat、Nginx、Spring Cloud Gateway |
安全中间件 | 提供认证、授权和加密服务 | OAuth、JWT |
缓存中间件 | 提供缓存服务 | Redis、Memcached |
(4)核心特征
- 标准化协议:支持跨平台交互(如RPC、RESTful API)。
- 链式处理:多个中间件可串联形成处理流水线,例如请求日志→身份验证→业务逻辑。
- 高可用设计:通过集群、副本机制(如Kafka的ISR副本同步)保障容灾。
(5)优缺点分析
- 优势
- 开发高效:通过通用服务(如日志记录、身份验证)减少重复代码。
- 灵活扩展:支持动态扩容和云原生架构,适应高并发场景。
- 局限
- 复杂性增加:引入中间件可能带来性能瓶颈和调试难度。
- 厂商锁定风险:部分中间件使用专有协议,导致跨平台迁移困难。
2、消息中间件
(1)概述
- 消息中间件是一种在分布式系统中实现异步通信的核心组件,其核心功能是通过消息队列机制在不同系统或模块间传递数据,同时提供可靠性、解耦性和扩展性支持。
(2)核心作用
- **系统解耦:**通过生产者-消费者模型,将消息发送方与接收方隔离。例如,电商系统中订单服务生成消息后,库存、物流等服务可独立消费消息,避免直接接口调用带来的强耦合。
- **异步处理:**允许耗时操作异步执行。如用户支付成功后,订单服务只需发送消息到队列,短信通知、积分计算等后续操作由消费者异步处理,提升系统响应速度。
- **流量削峰:**在高并发场景(如秒杀活动)中,消息中间件作为“缓冲池”堆积请求,按后端处理能力逐步消费,防止系统过载崩溃。
- **数据持久化与可靠性:**支持消息持久化存储,即使系统故障或重启,消息也不会丢失。例如Kafka通过副本机制保证数据高可靠。
(3)工作原理
- 消息模型
- **点对点模式:**消息发送到指定队列,仅一个消费者能消费(如银行交易通知)。
- **发布/订阅模式:**消息广播到主题(Topic),多个消费者可同时订阅(如新闻推送)。
- **核心组件 **
- **Producer:**消息生产者(如订单系统)。
- **Broker:**消息代理服务器(如Kafka集群)。
- **Consumer:**消息消费者(如物流系统)。
- 核心功能
- 消息的协议
- 消息的持久化机制
- 消息的分发策略
- 消息的高可用,高可靠
- 消息的容错机制
(4)常见类型与选型
类型 | 特点与应用场景 | 代表产品 |
---|---|---|
高吞吐场景 | 适合日志收集、大数据处理,支持百万级TPS | Kafka |
事务场景 | 强调消息一致性,适用于金融交易、订单处理 | RocketMQ |
灵活路由 | 支持复杂消息路由规则,适合企业级系统集成 | RabbitMQ |
传统企业 | 兼容JMS规范,适合中小型系统 | ActiveMQ |
(5)典型应用场景
- 电商系统:使用RocketMQ处理订单创建、支付回调等流程,确保分布式事务的原子性。
- 实时日志分析:Kafka收集服务器日志,供Flink/Spark进行流式计算。
- 微服务通信:RabbitMQ通过API网关实现服务间的异步通信和流量控制。
(6)技术选型建议
- 性能优先:选择Kafka或RocketMQ,支持高并发和水平扩展。
- 协议兼容:需支持AMQP或JMS时,优先考虑RabbitMQ或ActiveMQ。
- 云原生需求:RocketMQ与Kafka更适合容器化部署和云环境。
3、消息中间件产生原因
- 消息中间件的产生源于分布式系统发展中对通信效率、可靠性和复杂业务场景的迫切需求
(1)技术背景:同步通信的局限性
- HTTP同步调用的阻塞问题
传统HTTP请求采用同步模式,客户端需等待服务端响应才能继续执行。当服务端出现网络延迟或宕机时,客户端进程会被迫阻塞,导致系统整体吞吐量下降。 - 异构系统整合困难
随着企业信息化发展,不同技术栈(如Java、.NET)和数据库(MySQL、Oracle)的系统间通信需求激增,但直接接口调用面临协议不兼容、数据格式差异等问题。 - 数据一致性与可靠传输需求
分布式系统中,服务间的数据传递需要保证不丢失、不重复。传统补偿机制(如定时Job重试)存在效率低、幂等性处理复杂等问题。
(2)业务需求:复杂场景的解决方案
- 系统解耦
在电商、金融等场景中,订单、库存、物流等模块通过消息队列实现松耦合。例如,订单服务生成消息后,无需关注下游服务的处理状态,避免因某一服务故障导致整体瘫痪。 - 异步处理与流量削峰
高并发场景(如秒杀)中,消息中间件作为缓冲层堆积请求,按后端处理能力逐步消费。例如京东秒杀系统通过RocketMQ将瞬时百万级请求异步化处理,避免数据库过载。 - 跨地域与跨平台协作
企业级应用中,消息中间件支持多语言协议(如AMQP、JMS),实现不同技术架构的系统间数据交换,例如银行系统通过IBM MQ完成跨分行交易。
(3)架构演进:分布式系统的必然选择
- 微服务架构的普及
微服务拆分后,服务间通信频次剧增。消息中间件通过发布/订阅模型(如Kafka)实现服务发现、事件驱动等机制,替代传统的HTTP轮询。 - 可靠性与事务管理需求
金融场景中,消息中间件通过持久化存储和ACK确认机制,确保消息在传输、存储、消费过程中不丢失。例如RocketMQ支持分布式事务消息,保障支付与库存扣减的一致性。 - 云原生与弹性扩展
容器化部署环境下,消息中间件(如Kafka)支持动态扩容,通过分区机制实现水平扩展,适应云计算资源弹性调度的特性。
(4)其他关键驱动因素
因素 | 作用机制 |
---|---|
资源利用率优化 | 通过消息堆积和批量处理,减少CPU/IO资源的空闲等待时间 |
开发效率提升 | 标准化通信协议(如JMS)减少开发者重复编码,专注业务逻辑 |
运维复杂度降低 | 提供统一监控、重试策略和死信队列管理,替代人工干预 |
(5)技术演化路径
同步阻塞 → 异步解耦 → 可靠传输 → 分布式扩展 → 云原生适配
- 消息中间件从早期简单的队列模型(如ActiveMQ)发展到支持高吞吐、强一致性的新一代架构(如Pulsar),本质是技术演化和业务需求共同推动的结果。
4、消息队列协议
(1)协议是什么
- 协议是双方或多方为实现特定目标,通过协商达成的共同遵守的规则或文件。
- 在网络通信中,协议是设备交互的“语言”;
- 在法律层面,协议是明确权利义务关系的合同。
(2)网络协议三要素
- **语法:**数据格式与结构(如HTTP请求的报文格式);
- **语义:**控制信息的含义(如TCP确认机制确保数据完整);
- **时序:**事件执行顺序(如TCP三次握手建立连接)。
(3)消息队列协议对比
协议 | 核心特性 | 性能 | 功能复杂度 | 适用场景 | 代表产品/技术 | 优势与局限 |
---|---|---|---|---|---|---|
AMQP | 支持事务管理、持久化、路由键绑定;定义标准化组件(Broker/Exchange/Queue) | 中高 | 高 | 金融交易、企业级复杂路由 | RabbitMQ | 高可靠性,但实现较重量级 |
MQTT | 轻量级二进制协议,低带宽/弱网适应;提供至少一次、最多一次投递保障 | 高 | 低 | 物联网(IoT)、移动设备通信 | EMQX、HiveMQ | 资源消耗低,但功能简单 |
STOMP | 基于文本的简单协议,支持ACK机制;无事务支持 | 中 | 低 | WebSocket通信、跨语言简单交互 | ActiveMQ | 易调试,但数据可靠性弱 |
Kafka协议 | 高吞吐设计(百万级TPS);支持分区和副本机制实现水平扩展 | 极高 | 中 | 大数据日志收集、实时流处理 | Apache Kafka | 吞吐量高,但协议非开放标准 |
JMS | Java平台API规范,定义P2P和Pub/Sub模型;与底层协议解耦 | 中 | 中 | Java生态企业应用集成 | ActiveMQ、IBM MQ | 标准化接口,但局限于Java生态 |
(4)扩展说明
- 为什么不用HTTP协议
- HTTP头复杂且为短连接设计,难以满足消息队列的高性能、长连接需求。
- 新兴协议
- OpenMessage(阿里参与制定):支持事务和持久化,适合云原生场景。
- XMPP:基于XML的即时通讯协议,适用于跨平台消息推送,但协议头大。
5、消息队列持久化
- 消息队列持久化是确保消息在传输、存储和消费过程中不丢失的关键机制,其核心目的是在系统故障或重启后仍能恢复数据,保障业务连续性。
(1)核心目的
- **数据可靠性保障:**防止因服务器宕机、网络中断等异常情况导致消息丢失,确保消息至少被消费一次(At Least Once Delivery)。
- **系统高可用性:**通过持久化存储实现消息队列的容错能力,支持故障恢复后自动重建队列和消息状态。
(2)持久化策略
- 同步持久化
消息发送前先写入磁盘,确保数据强一致性,但吞吐量较低(如RabbitMQ的delivery_mode=2
)。 - 异步持久化
消息先发送到内存队列,再异步刷盘,提升性能但存在短暂数据丢失风险(如Kafka的异步刷盘策略)。 - 混合持久化
结合同步和异步,如先写入磁盘日志(WAL),再批量处理(Kafka的日志分段存储)。
(3)实现机制
- 消息代理层持久化
- **RabbitMQ:**需显式声明队列(
durable=true
)、交换机(durable=true
)和消息(delivery_mode=2
)三重持久化。 - **Kafka:**默认将消息以日志形式写入磁盘分区,通过副本机制(Replication)实现数据冗余。
- **RabbitMQ:**需显式声明队列(
- **存储技术 **
- **日志追加(WAL):**记录所有操作日志,重启后重放日志恢复状态(如Redis的AOF持久化)。
- **快照(Snapshot):**定期保存系统完整状态,结合检查点(Checkpoint)加速恢复(如RocketMQ的CommitLog)。
(4)优缺点分析
优势 | 局限 |
---|---|
1. 保障关键业务数据不丢失(如支付、订单) | 1. 同步持久化导致吞吐量下降(约30%-50%) |
2. 支持分布式事务(如Seata通过消息表实现最终一致性) | 2. 异步持久化存在短暂数据不一致风险 |
3. 适应高并发场景(如秒杀流量削峰) | 3. 日志文件膨胀需定期清理(如Kafka的日志保留策略) |
(5)典型应用场景
- **电商订单系统:**使用RocketMQ持久化订单消息,确保支付成功后库存扣减、物流通知等操作可靠执行。
- **金融交易:**RabbitMQ通过事务消息和持久化队列,保障转账、清算等操作的数据一致性。
- **物联网(IoT):**MQTT协议结合消息持久化,应对设备断线重连后的数据补发。
(6)技术选型建议
- **高吞吐场景:**优先选择Kafka(分区+副本机制)或Pulsar(分层存储)。
- **强一致事务场景:**选用RocketMQ(事务消息)或RabbitMQ(ACK确认机制)。
- **资源受限环境:**Redis Streams(AOF+RDB混合持久化)适合轻量级消息队列。
(7)最佳实践
- **合理配置刷盘间隔:**平衡性能与可靠性(如Kafka设置
flush.ms=1000
)。 - **启用非阻塞IO:**使用零拷贝(Zero-Copy)技术减少磁盘操作对CPU的占用。
- **监控与告警:**通过RabbitMQ Management插件或Kafka Eagle监控持久化队列状态。
6、消息分发策略
- 消息队列的消息分发策略决定了消息如何在生产者和消费者之间传递,直接影响系统的负载均衡、可靠性和处理效率。
(1)基础分发模式
- 推(Push)模式
- 机制:消息队列主动将消息推送给消费者,消费者被动接收。
- 优点:实时性强,适合高吞吐场景。
- 缺点:消费者处理能力不足时可能导致消息堆积或系统崩溃。
- 适用场景:实时日志收集(如Kafka)、即时通知(如RocketMQ)。
- 拉(Pull)模式
- 机制:消费者主动从队列中拉取消息。
- 优点:消费者按需处理,避免过载。
- 缺点:增加网络开销,实时性较低。
- 适用场景:资源受限的物联网设备(如MQTT协议)。
(2)核心分发策略
策略 | 机制与特点 | 适用场景 | 典型中间件支持 |
---|---|---|---|
轮询分发 | 消息平均分配给所有消费者(Round-Robin),不考虑处理能力差异。 | 负载均衡场景(如普通任务分发) | RabbitMQ、ActiveMQ |
公平分发 | 动态调整分发频率,根据消费者处理能力(如未确认消息数)分配消息,避免单节点积压。 | 消费者处理能力不均的场景 | RabbitMQ(设置prefetch_count ) |
广播分发(Pub/Sub) | 消息发送到主题(Topic),所有订阅者均可接收。 | 事件通知、日志广播 | Kafka、RabbitMQ |
严格顺序分发 | 确保消息按发送顺序被消费,需单消费者或同步锁机制。 | 需强顺序保障的场景(如金融交易) | ActiveMQ(strictOrderDispatch ) |
优先级分发 | 按消费者或消息的优先级分配,高优先级消费者/消息优先处理。 | 重要任务优先处理(如告警系统) | ActiveMQ、RabbitMQ |
键控路由 | 根据路由键(Routing Key)匹配队列,支持精确匹配(Direct)或模糊匹配(Topic)。 | 灵活路由需求(如分类消息处理) | RabbitMQ、RocketMQ |
(3)高级策略与容错机制
- 优先级分发
- 机制:为消息或队列设置优先级,高优先级消息优先处理。
- 实现:RabbitMQ通过
x-max-priority
参数定义队列优先级。
- 重试与死信队列
- 消费者处理失败时,消息进入重试队列(最多N次)。
- 超过重试次数后,消息转入死信队列(DLQ)人工干预。
- 严格顺序分发(Strict Order)
- 机制:同一队列的消息按顺序被单个消费者处理,避免并发乱序。
- 适用场景:金融交易(如ActiveMQ的
strictOrderDispatch=true
配置)。
(4)策略对比与选型建议
维度 | 轮询分发 | 公平分发 | 广播分发 | 严格顺序分发 |
---|---|---|---|---|
吞吐量 | 高 | 中高 | 高 | 低 |
消息顺序性 | 无保障 | 无保障 | 无保障 | 强保障 |
资源利用率 | 均衡 | 动态优化 | 高 | 低 |
适用场景 | 通用任务 | 处理能力不均 | 多订阅者通知 | 金融、订单系统 |
- 选型建议:
- **高吞吐场景:**优先选择轮询分发(如Kafka分区轮询)或广播分发。
- **顺序敏感场景:**采用严格顺序分发或单分区消费(如RocketMQ顺序消息)。
- **动态负载均衡:**使用公平分发(如RabbitMQ的
prefetch
机制)。
(5)性能优化实践
- **预取(Prefetch)控制:**设置合理的
prefetch_count
(如RabbitMQ)避免消费者过载。 - **批量拉取:**Kafka消费者可配置
max.poll.records
批量获取消息,减少网络开销。 - **异步ACK确认:**消息处理完成后异步发送确认,提升吞吐量(如RocketMQ)。
相关文章:
消息中间件
零、文章目录 消息中间件 1、中间件 (1)概述 中间件(Middleware)是位于操作系统、网络与数据库之上,应用软件之下的一层独立软件或服务程序,其核心作用是连接不同系统、屏蔽底层差异,并为应…...
vue3直接操作微信小程序云开发数据库,web网页对云数据库进行增删改查
我们开发好小程序以后,有时候需要编写一个管理后台网页对数据库进行管理,之前我们只能借助云开发自带的cms网页,但是cms网页设计的比较丑,工作量和代码量也不够,所以我们今天就来带大家实现用vue3编写管理后台直接管理…...
重塑编程体验边界:明基RD280U显示器深度体验
重塑编程体验边界:明基RD280U显示器深度体验 写在前面 本文将以明基RD280U为核心,通过技术解析、实战体验与创新案例,揭示专业显示器如何重构开发者的数字工作台。 前言:当像素成为生产力的催化剂 在GitHub的年度开发者调查中&…...
Linux命令-iostat
iostat 命令介绍 iostat 是一个用于监控 Linux 系统输入/输出设备加载情况的工具。它可以显示 CPU 的使用情况以及设备和分区的输入/输出统计信息,对于诊断系统性能瓶颈(如磁盘或网络活动缓慢)特别有用。 语法: iostat [options…...
Hyper-V安装Win10系统,报错“No operating system was loaded“
环境: Win10专业版 Hyper-V 问题描述: Hyper-V安装Win10系统,报错"No operating system was loaded" 已挂载ISO但仍无法启动的深度解决方案 🔧如果已确认ISO正确挂载且启动顺序已调整,但虚拟机仍提…...
Zabbix
zabbix官网: https://www.zabbix.com zabbix中文操作手册:https://www.zabbix.com/documentation/5.0/zh/manual/introduction/features 1、SERVER Zabbix server 是 Zabbix 软件的核心组件。Zabbix Agent 向Zabbix server报告可用性、系统完整性信息和统计信息。…...
NEPCON China 2025 | 具身智能时代来临,灵途科技助力人形机器人“感知升级”
4月22日至24日,生产设备暨微电子工业展(NEPCON China 2025)在上海如期开展。本届展会重磅推出“人形机器人拆解展区”,汇聚35家具身智能产业链领军企业,围绕机械结构、传感器布局、驱动系统与AI算法的落地应用…...
css响应式布局设置子元素高度和宽度一样
css响应式布局设置子元素高度和宽度一样 常常遇到响应式布局 其中父元素(类名为.list)包含多个子元素(类名为.item),每个子元素中显示一张图片,并且这些图片能够根据子元素的宽度和高度进行自适应调整。 …...
【AI论文】RefVNLI:迈向可扩展的主题驱动文本到图像生成评估
摘要:主题驱动的文本到图像(T2I)生成旨在生成与给定文本描述一致的图像,同时保留参考主题图像的视觉特征。 尽管该领域具有广泛的下游适用性——从增强图像生成的个性化到视频渲染中一致的角色表示——但该领域的进展受到缺乏可靠…...
信创系统 sudoers 权限配置实战!从小白到高手
好文链接:实战!银河麒麟 KYSEC 安全中心执行控制高级配置指南 Hello,大家好啊!今天给大家带来一篇关于信创终端操作系统中 sudoers 文件详解的实用文章!在 Linux 系统中,sudo 是一项非常重要的权限控制机制…...
用户行为检测技术解析:从请求头到流量模式的对抗与防御
用户行为检测是反爬机制的核心环节,网站通过分析请求特征、交互轨迹和时间模式,识别异常流量并阻断爬虫。本文从基础特征检测与高级策略分析两个维度,深入解析用户行为检测的技术原理与对抗方案。 一、基础特征检测:请求头与交互…...
关于Android Studio的AndroidManifest.xml的详解
AndroidManifest.xml 是 Android 项目的核心配置文件,它定义了应用的基本信息、所需权限、组件、功能等。它为 Android 系统提供了关于应用如何运行的重要信息。每个 Android 应用程序必须包含这个文件,而且这个文件的配置直接影响到应用的行为和安装要求…...
全栈自动化:从零构建智能CI/CD流水线
1. 基础架构:GitLab Kubernetes 1.1 GitLab CI/CD核心配置 GitLab通过.gitlab-ci.yml定义流水线阶段。以下是一个基础模板: stages:- build- test- deploybuild_job:stage: buildscript:- echo "Compiling the code..."- make…...
xe-upload上传文件插件
1.xe-upload地址:文件选择、文件上传组件(图片,视频,文件等) - DCloud 插件市场 2.由于开发app要用到上传文件组件,uni.chooseFile在app上不兼容,所以找到了xe-upload,兼容性很强&a…...
PySpark中DataFrame应用升阶及UDF使用
目录 1. 加载数据2. 列常见操作2.1 添加新列2.2 重命名列2.3 删除指定列2.4 修改数据 3 空值处理3.1 丢弃空值3.2 空值填充 4 聚合操作4.1 分组聚合 5 用户自定义函数(UDF)5.1 传统UDF函数5.2 Pandas UDF(向量化UDF) 参考资料 imp…...
C++ ——引用
引用定义 引用是一个已存在的变量的别名。 用法 类型 & 别名 引用指向的变量名 关于别名的理解: 别名可以理解为绰号或者小名,比如美猴王、齐天大圣、斗战胜佛等,指的都是孙悟空。 这意味着: ①别名和别名指向的变量其实是同…...
OpenCV 图形API(65)图像结构分析和形状描述符------拟合二维点集的直线函数 fitLine2D()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 拟合一条直线到2D点集。 该函数通过最小化 ∑ i ρ ( r i ) \sum_i \rho(r_i) ∑iρ(ri)来将一条直线拟合到2D点集,其中 ri 是第…...
k8s生成StarRocks集群模版
集群由1个fe3个be组成,满足以下要求: 1、由3个pod组成,每pod分配2c4g 2、第一个pod里有一个be与一个fe,同在一个容器里,fe配置jvm内存设置为1024mb,be的jvm内存设置为1024MB 3、第二第三个pod里分别有一…...
web基础+HTTP+HTML+apache
目录 一.web基础 1.1web是什么 1.2HTTP 1.2.1HTTP的定义 1.2.2 HTTP请求过程 1.2.3 HTTP报文 1 请求报文 2 响应报文 1.2.4 HTTP协议状态码 1.2.5 HTTP方法 1.2.6 HTTP协议版本 二.HTML CSS和JavaScript 2.1HTML 2.1.1HTML的概述 2.1.2 HTML中的部分基本标签&…...
C++修炼:list模拟实现
Hello大家好!很高兴我们又见面啦!给生活添点passion,开始今天的编程之路! 我的博客:<但凡. 我的专栏:《编程之路》、《数据结构与算法之美》、《题海拾贝》、《C修炼之路》 欢迎点赞,关注&am…...
Lua 第12部分 日期和时间
Lua 语言的标准库提供了两个用于操作日期和时间的函数,这两个函数在 C 语言标准库中也存在,提供的是同样的功能。 虽然这两个函数看上去很简单,但依旧可以基于这些简单的功能完成很多复杂的工作。 Lua 语言针对日期和时间使用两种表示方式。 …...
NL2SQL调研
一 背景 1.1 引言 随着数据时代的到来,数据库已成为企业和组织存储、管理和分析数据的核心基础设施。然而,传统的数据库查询需要使用结构化查询语言(SQL),这要求用户具备特定的技术知识,限制了数据库的广…...
服务器ubuntu镜像磁盘空间怎么管理
在 Ubuntu 服务器上,管理镜像磁盘空间是系统维护中的一项关键任务,尤其是在使用虚拟化技术时(如 Docker、LVM、KVM 等)。合理管理磁盘空间可以有效防止磁盘空间不足,提升系统的稳定性和性能。本文将为你介绍如何在 Ubuntu 系统中有效管理镜像…...
uniapp+vue3表格样式
<view class"tableMain" v-if"state.use_scope2"><view class"tableBox"><view class"th"><view class"col">站点名称</view><view class"col">站点状态</view><vi…...
QT中的文件操作
C语言中通过fopen/fread/fwrite/fclose进行文件操作 C中通过fstream/>>/<</close进行文件操作 Linux中通过open/read/write/clos进行文件操作 Qt中同样可以使用上述文件操作 但是Qt同样封装了自己的一套文件操作,,在编写Qt程序时…...
Vue.js 核心特性解析:响应式原理与组合式API实践
引言 Vue.js 作为一款渐进式前端框架,凭借其简洁的API设计和灵活的组件化开发模式,已经成为现代Web开发的主流选择之一。本文将深入探讨Vue 3的核心特性,包括响应式系统原理、组合式API的使用以及实际开发中的最佳实践,帮助开发者…...
李沐动手深度学习(pycharm中运行笔记)——07.自动求导
07.自动求导(与课程对应) 1、导入torch import torch 2、假设我们想对函数 y 2x.Tx,就是 2乘x的内积,关于列向量x求导,也就是4x x torch.arange(4.0) # (1)创建一个列向量 x print("…...
Maven 使用教程
Maven 使用教程 Maven 是一个强大的项目管理和构建工具,主要用于 Java 项目的开发。它通过定义良好的生命周期、插件系统和依赖管理简化了项目的构建过程。本文将详细介绍如何使用 Maven 来进行日常的开发工作。 安装 Maven 下载 Maven 访问 Maven 的官方网站&a…...
ACM会议模板设置单排作者数量
在准备ACM会议的ready版本时涉及到作者设置,ACM会议模板的默认设置是每排三个作者,但是修改为四个一般是可以允许的,可能会节省一些空间。只需要在\documentclass[sigconf,authordraft]{acmart}后面添加代码\settopmatter{authorsperrow4}&am…...
云原生 | K8S中数据存储之StorageClass
在一个大规模的Kubernetes集群里,可能有成千上万个PVC,这就意味着运维人员必须实现创建出这个多个 PV,此外,随着项目的需要,会有新的PVC不断被提交,那么运维人员就需要不断的添加新的,满足要求的PV,否 则新的Pod就会因为PVC绑定不到PV而导致创建失败。而且通过 PVC 请求到一定的…...
衡量矩阵数值稳定性的关键指标:矩阵的条件数
文章目录 1. 定义2. 为什么要定义条件数?2.1 分析线性系统 A ( x Δ x ) b Δ b A(x \Delta x) b \Delta b A(xΔx)bΔb2.2 分析线性系统 ( A Δ A ) ( x Δ x ) b (A \Delta A)(x \Delta x) b (AΔA)(xΔx)b2.3 定义矩阵的条件数 3. 性质及几何意义3…...
蓝桥杯 1. 确定字符串是否包含唯一字符
确定字符串是否包含唯一字符 原题目链接 题目描述 实现一个算法来识别一个字符串的字符是否是唯一的(忽略字母大小写)。 若唯一,则输出 YES,否则输出 NO。 输入描述 输入一行字符串,长度不超过 100。 输出描述 输…...
【Vue】单元测试(Jest/Vue Test Utils)
个人主页:Guiat 归属专栏:Vue 文章目录 1. Vue 单元测试简介1.1 为什么需要单元测试1.2 测试工具介绍 2. 环境搭建2.1 安装依赖2.2 配置 Jest 3. 编写第一个测试3.1 组件示例3.2 编写测试用例3.3 运行测试 4. Vue Test Utils 核心 API4.1 挂载组件4.2 常…...
查回来的数据除了 id,其他字段都是 null
数据结构不完整:您收到的历史对话和知识库文件数据中,几乎所有重要的字段(除了id和title)都是null,包括userId、createdTime等关键字段。这会导致前端无法根据创建时间来正确分类显示(今天、7天内、更早&am…...
Flink02-学习-套接字分词
flatmap() AMapFunction仅适用于执行一对一转换的情况:对于每个进入的流元素,map()都会发出一个转换后的元素。否则,您需要使用 flatmap() DataStream<TaxiRide> rides env.addSource(new TaxiRideSource(...));DataStream<Enric…...
html5:从零构建经典游戏-扫雷游戏
扫雷是Windows系统自带的经典游戏,陪伴了许多人的童年。 本文将详细解析一个用HTML、CSS和JavaScript实现的扫雷游戏代码,带你了解其背后的实现原理。 游戏概述 这个扫雷游戏实现包含以下核心功能: 1010的游戏棋盘 15个随机分布的地雷 左…...
SVT-AV1源码分析-函数svt_aom_motion_estimation_kernel
一 svt_aom_motion_estimation_kernel函数作用 这段代码是EBSDK 中的一个运动估计 内核函数,用于处理视频编码中的运动估计任务。运动估计任务。运动估计是视频编码中的一个关键步骤,目的是在时间域上找到当前块在参考帧中的最佳匹配块,从而减…...
考研系列-计算机组成原理第六章、总线
一、总线概述 1.总线的基本概念 2.总线的分类 (1)按照传输格式 并行总线的传输速度并不一定比串行总线快,因为并行总线之间存在干扰,不能太快。 (2)按照总线功能 片内总线、系统总线、IO总线、通信总线...
HTML基础完全解析
一、HTML基本结构解析 1.1 文档骨架 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>文档标题</title> </head> <body>页面主体内容 </body> </html> dz…...
【读写视频】MATLAB详细代码
MATLAB将视频逐帧输出 在MATLAB中,可以使用VideoReader和imwrite函数将视频逐帧输出为图像文件。以下是具体步骤和示例代码: 读取视频并逐帧保存为图像 首先,使用VideoReader函数读取视频文件,然后使用read函数逐帧读取视频&am…...
NCCL 通信与调试
代码仓库 https://github.com/NVIDIA/nccl-tests 代码编译 编译 nccl-tests (MPI 版本): ” 编译支持 MPI 的 nccl-tests 是整合 nvcc, mpicc 和 NCCL 库的关键步骤 初始编译命令 (基于 README): cd /path/to/your/nccl-tests # 进入源码目录 make clean make MPI1 CUDA_HO…...
Linux 在个人家目录下添加环境变量 如FLINK_PROPERTIES=“jobmanager.rpc.address: jobmanager“
问题: Docker Flink Application Mode 命令行形式部署前,需要在Linux执行以下: $ FLINK_PROPERTIES"jobmanager.rpc.address: jobmanager" $ docker network create flink-network 临时变量只在当前session会话窗口生效…...
Linux中线程池的简单实现 -- 线程安全的日志模块,策略模式,线程池的封装设计,单例模式,饿汉式单例模式,懒汉式单例模式
目录 1. 对线程池的理解 1.1 基本概念 1.2 工作原理 1.3 线程池的优点 2. 日志与策略模式 2.1 日志认识 2.2 策略模式 2.2.1 策略模式的概念 2.2.2 工作原理 2.2 自定义日志系统的实现 3. 线程池设计 3.1 简单线程池的设计 3.2 线程安全的单例模式线程池的设计 3…...
【Web API系列】深入解析 Web Service Worker 中的 WindowClient 接口:原理、实践与进阶应用
前言 在现代 Web 开发领域中,Service Worker 技术已成为构建离线优先应用和实现高级缓存策略的核心支柱。作为 Service Worker API 体系中的重要组成部分,WindowClient 接口为开发者提供了对受控客户端窗口的精准控制能力。本文将从实际工程实践的角度出…...
哈希封装unordered_map和unordered_set的模拟实现
文章目录 (一)认识unordered_map和unordered_set(二)模拟实现unordered_map和unordered_set2.1 实现出复用哈希表的框架2.2 迭代器iterator的实现思路分析2.3 unordered_map支持[] (三)结束语 (…...
智诚科技苏州SOLIDWORKS授权代理商的卓越之选
在当今数字化转型浪潮中,SOLIDWORKS软件以其强大的功能和广泛的行业应用,成为企业迈向智能制造的有力工具。它不仅提供直观的3D建模环境,帮助企业设计师快速创建精准的3D模型,还涵盖了从概念设计到详细设计、从样品制作到最终产品…...
【网络原理】从零开始深入理解TCP的各项特性和机制.(二)
本篇博客给大家带来的是TCP/IP原理的知识点,重点以TCP为主,接续上篇. 🐎文章专栏: JavaEE初阶 🚀若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅🚀 …...
51单片机所有寄存器介绍
51单片机所有寄存器介绍 作者将狼才鲸创建日期2025-04-27 参考资料:Intel官方《MCS-51 Programmer’s Guide and Instruction Set.pdf》CSDN阅读地址:51单片机所有寄存器介绍 一、前言 51单片机的寄存器和ARM不一样,有自己专有的名称&…...
4.27算法题
力扣649.Dota2 参议院 649. Dota2 参议院 Dota2 的世界里有两个阵营:Radiant(天辉)和 Dire(夜魇) Dota2 参议院由来自两派的参议员组成。现在参议院希望对一个 Dota2 游戏里的改变作出决定。他们以一个基于轮为过程…...
衡石科技:HENGSHI SENSE 数据权限解决方案
编写目的 本方案主要讲述 HENGSHI SENSE 的数据权限方案,即在 HENGSHI SENSE 系统中,通过同步企业内部的人员属性和组织架构等信息,实现企业内部的每一个用户对于业务数据的读取权限。 本方案的的预期读者为:HENGSHI SENSE 的…...