当前位置: 首页 > news >正文

消息队列核心技术解析与应用场景

一、消息队列的核心定义与价值

1. 基本定义

消息队列(Message Queue,简称 MQ)是一种异步通信中间件,通过在生产者(消息发送方)和消费者(消息接收方)之间建立 “消息存储通道”,实现两者的解耦 —— 生产者无需等待消费者即时处理,只需将消息发送到队列,消费者可在合适时机从队列中获取并处理消息,支持应用程序在不同时间点、不同系统间安全高效地传递数据。

2. 核心价值

  • 解耦:生产者与消费者无需感知对方存在,新增 / 删除消费者无需修改生产者代码,反之亦然(如订单系统无需直接调用库存、物流系统,只需发送 “订单创建” 消息)。
  • 削峰填谷:面对突发流量(如秒杀、促销),消息暂存队列,消费者按自身能力匀速处理,避免后端服务因瞬时高负载崩溃。
  • 异步通信:非核心流程(如短信通知、日志记录)无需同步等待,减少主流程响应时间(如用户下单后,即时返回成功,通知逻辑异步处理)。
  • 分布式协同:跨服务、跨节点的业务可通过 MQ 实现数据同步、事务一致性保障(如分布式事务中的消息确认机制)。

二、消息队列的核心概念

1. 三大基础角色

角色

核心职责

关键行为

生产者(Producer)

创建并发送消息到 MQ 的应用 / 服务

- 指定消息所属的 Topic/Queue;

- 可设置消息属性(如 Tag、优先级、过期时间);

- 部分场景需处理 “消息发送确认”(确保消息未丢失)。

消费者(Consumer)

订阅消息并处理的应用 / 服务

- 订阅指定的 Topic/Queue;

- 从 MQ 拉取(Pull)或接收推送(Push)的消息;

- 处理消息后需确认 “消费完成”(避免重复消费)。

Broker

MQ 的核心服务节点,负责

消息存储、转发、持久化

,是生产者与消费者的桥梁

- 存储消息(内存 / 磁盘);

- 管理 Topic/Queue 的元数据;

- 实现主从复制(容灾)、负载均衡(消息分发)。

2. 消息存储与路由组件

(1)Topic(主题)
  • 定义:“消息分类标签”,用于实现 “一对多” 通信,本质是逻辑上的消息聚合(如 “订单消息”“物流消息”)。
  • 核心特性
  1. 多订阅者:一个 Topic 可被多个消费者 / 消费组订阅,一条消息发送到 Topic 后,所有订阅者均会收到(广播模式)。
  2. 分类聚合:生产者必须明确消息所属 Topic,消费者仅接收订阅 Topic 的消息,避免无关消息干扰。
  3. 订阅独立:消费者间无耦合,如 “订单 Topic” 的订阅者 A 处理库存扣减,订阅者 B 处理账单生成,互不影响。
  • 延伸机制(细粒度过滤):
    • Tag(标签):Topic 下的细分分类(如 “订单 Topic” 下的 “订单创建”“订单支付” Tag),生产者发送 “Topic+Tag”,消费者仅接收匹配 Tag 的消息(支持:RocketMQ、RabbitMQ)。
    • 订阅过滤(Subscription Filter):通过表达式筛选消息(如 “目的地 = 北京”“金额 > 100”),仅接收满足条件的消息(支持:Kafka 自定义过滤、RocketMQ SQL92 表达式)。
(2)Queue(队列)
  • 定义:“消息存储的物理容器”,用于实现 “点对点” 通信,一条消息仅能被一个消费者消费(单播模式)。
  • 核心特性
  1. 单消费独占:消息被消费后立即从 Queue 中删除,避免重复处理(如任务分配、订单支付结果通知)。
  2. 暂存能力:消费者离线时,消息暂存 Queue,待消费者上线后继续消费(区别于 Topic 未订阅消息的丢弃逻辑)。
  3. 竞争消费:多个消费者订阅同一 Queue 时,会竞争获取消息(负载均衡),适合 “任务拆分” 场景。
(3)Topic 与 Queue 的核心区别

对比维度

Topic(主题)

Queue(队列)

通信模式

一对多(广播,需主动订阅)

点对点(单播,消息独占)

消息接收逻辑

所有订阅者均接收同一条消息

一条消息仅被一个消费者消费(消费后删除)

消费者关联性

订阅者独立,无竞争关系

消费者竞争关系(抢消息)

未订阅 / 离线处理

未订阅则消息丢弃(或入死信)

消息暂存,等待消费者上线

适用场景

通知、日志、数据同步(多方需同步消息)

订单支付、任务分配(消息需唯一处理)

(4)其他核心组件
  • Name Server:MQ 的 “路由注册中心”(如 RocketMQ),负责管理 Broker 的地址信息、Topic 与 Broker 的映射关系,客户端(生产者 / 消费者)通过 Name Server 获取路由,实现服务发现。
  • Consumer Group(消费者组):多个消费者组成的集群,共同订阅一个 / 多个 Topic,实现 “负载均衡” 与 “容错”:
    • 负载均衡:MQ 将 Topic 的 Queue/Partition 均匀分配给组内消费者(如 Kafka 的 Partition 分配、RocketMQ 的 Queue 分配),避免单消费者过载。
    • 消费进度管理:记录组内 “已消费到的消息位置”(如 Kafka 的 Offset、RocketMQ 的 Consumer Offset),确保崩溃后恢复消费进度。

三、消息队列的关键技术特性(可靠性与一致性保障)

1. 消息可靠性:避免丢失、重复、篡改

(1)消息持久化
  • 定义:将内存中的消息写入磁盘 / 数据库,防止 Broker 宕机导致消息丢失。
  • 主流方案
    • Kafka:基于 “分区日志文件” 持久化,消息按 Partition 顺序写入,配合索引文件加速查询。
    • RocketMQ:采用 “CommitLog+ConsumeQueue” 双存储结构,CommitLog 存储原始消息,ConsumeQueue 存储消息索引(按 Topic+Tag 分类)。
    • RabbitMQ:需显式配置 “消息持久化”(消息、Queue、Exchange 均需标记为持久化),否则内存存储。
  • 性能权衡:同步刷盘(可靠性高,吞吐量低)、异步刷盘(吞吐量高,可能丢消息)。
(2)消息重试与死信队列(DLQ)
  • 消息重试:消费者处理失败(如业务异常、网络波动)时,MQ 自动重新投递消息,支持:
    • 重试策略:固定间隔(如 1s、5s)、指数退避(间隔逐渐延长)。
    • 重试上限:超过次数后,消息转入 “死信队列”(避免无限重试)。
  • 死信队列(Dead-Letter Queue):存储 “无法正常消费的消息”(重试耗尽、消息过期、格式错误),支持后续人工排查(如重新投递、数据修复)。
(3)消息去重
  • 核心场景:网络重试、生产者重发导致消息重复(如订单支付通知重复接收)。
  • 解决方案
    • 生产端:生成 “消息唯一 ID”(Message ID/UUID),MQ 校验 ID 避免重复存储。
    • 消费端:基于 “业务唯一键”(如订单 ID)做幂等处理(如数据库唯一索引、Redis 分布式锁),确保重复消息仅执行一次。

2. 消息顺序性:确保消息按发送顺序消费

(1)顺序性分类
  • 全局顺序:一个 Topic 下所有消息严格按发送顺序消费(如秒杀订单创建顺序),仅适用于单 Queue/Partition 场景(牺牲并发)。
  • 分区 / 队列顺序:仅单个 Queue/Partition 内的消息有序(如 Kafka 的 Partition、RocketMQ 的 Queue),是主流方案(兼顾并发与顺序)。
(2)实现条件
  • 生产端:需将 “需保序的消息” 发送到同一个 Queue/Partition(如按用户 ID 哈希路由)。
  • 消费端:确保 “一个 Queue/Partition 仅被一个消费者线程消费”(避免多线程打乱顺序)。

3. 分布式事务:跨服务数据一致性

(1)MQ 事务消息原理(以 RocketMQ 为例)
  • 核心场景:跨服务操作需原子性(如 “下单” 需同时 “扣库存”,库存失败则下单回滚)。
  • 流程
  1. 生产者发送 “半事务消息”(暂存 Broker,消费者不可见);
  2. 生产者执行本地事务(如数据库下单);
  3. 本地事务成功:发送 “确认消息”(消费者可见);失败:发送 “回滚消息”(删除半事务消息);
  4. 本地事务结果未知:Broker 通过 “事务回查” 确认状态,避免数据不一致。
(2)其他方案:可靠消息最终一致性
  • 生产者先发送 “预消息”,执行本地事务后再发送 “确认消息”,消费者接收确认消息后执行业务,配合重试机制确保最终一致。
(3)其他分布式事务方案对比

方案

原理

优点

缺点

适用场景

事务消息(MQ 原生)

半事务消息→本地事务→确认 / 回滚(如 RocketMQ)

低耦合、最终一致性、性能好

仅少数 MQ 支持,不支持跨 MQ

电商订单(下单 + 扣库存)

TCC(Try-Confirm-Cancel)

Try(预留资源,如冻结库存)→Confirm(确认扣减)→Cancel(释放资源)

强一致性、无 MQ 依赖

代码侵入性强(需写 3 个接口)、幂等难控

金融场景(转账、支付)

SAGA 模式

拆分事务为 “本地事务序列”,失败时执行 “补偿事务”(如 A 扣库存→B 减余额,B 失败则 A 回滚)

无技术依赖、易实现

仅最终一致性、补偿逻辑复杂

非金融场景(订单 + 日志)

可靠消息最终一致性

预发送消息→执行本地事务→确认消息;消费者消费确认→执行本地事务→反馈结果

兼容性强(所有 MQ 支持)

需手写 “消息状态表”,开发成本高

跨 MQ、多系统协同场景

4. 延迟消息(定时消息)

  • 定义:生产者发送消息后,消费者在指定时间后才能接收(如订单创建 30 分钟未支付自动取消)。
  • 主流实现
    • RocketMQ:支持固定延迟级别(1s、5s、10s、30s、1min...1h),基于 “定时任务 + 延迟队列” 实现。
    • Kafka:无原生支持,需通过 “时间轮” 或第三方组件(如 Kafka Connect)模拟。
    • RabbitMQ:通过 “TTL(消息过期时间)+ 死信队列” 实现(消息过期后转入死信队列,消费者订阅死信队列)。
  • 避坑点:
    • RocketMQ:不支持自定义延迟时间,仅固定级别
    • RabbitMQ:不同TTL消息混存会导致“先到期消息后消费”,需按TTL分队列。

四、主流 MQ 产品对比(核心特性差异)

MQ 产品

核心组件 / Topic 实现

关键特性

优势场景

缺点

Apache Kafka

Topic(主题)+ Partition(分区)

1. 高吞吐量(百万级 TPS),适合大数据场景;

2. 基于 Partition 实现顺序性与负载均衡;

3. Offset 管理灵活(支持手动 / 自动提交)。

日志收集、数据同步、实时计算(如 Flink/Spark)

1. 不支持原生事务消息;

2. 延迟消息需自定义实现;

3. 运维复杂度较高(需管理 Partition、副本)。

RocketMQ

Topic(主题)+ Tag(标签)

1. 支持 “Topic+Tag” 双层过滤、SQL92 订阅过滤;

2. 原生支持事务消息、延迟消息;

3. 主从架构(Master/Slave),容灾性好。

微服务、电商(订单、支付)、分布式事务

1. 社区生态较 Kafka 弱;

2. 对中小团队运维成本略高。

RabbitMQ

Exchange(交换机)+ Routing Key

1. 无原生 Topic,通过 “Topic 类型 Exchange+Routing Key” 模拟(如order.*匹配规则);

2. 支持多种交换机类型(Direct、Fanout、Topic),路由灵活;

3. 轻量级,部署简单。

即时通信、通知、中小规模业务

1. 吞吐量较低(万级 TPS);

2. 不支持原生事务消息;

3. 大数据场景适配差。

ActiveMQ

Topic(主题)+ Queue(队列)

1. 原生支持 Topic/Queue 模式,API 友好;

2. 支持持久化 Topic(订阅者离线后可接收历史消息);

3. 兼容多种协议(JMS、AMQP)。

传统企业应用、中小规模异步通信

1. 吞吐量低,不适合高并发;

2. 社区活跃度下降。

技术选型思路(结合业务优先级)

  1. 高吞吐量+大数据场景(日志、实时计算):选Kafka(百万级TPS,分区并行)。
  2. 事务+延迟消息+微服务(电商订单、支付):选RocketMQ(原生支持是事务/延迟消息)。
  3. 轻量级+灵活路由+中小规模(通知、IM):选RabbitMQ(交换机路由,部署简单)。
  4. 传统企业应用+JMS兼容(老系统改造):选ActiveMQ(支持JMS,API友好)。

五、消息队列的典型应用场景

  1. 通知 / 广播场景:APP 推送、系统告警、活动通知(如 “秒杀开始” 广播给所有订阅用户)。
  • 核心需求
    • 一对多触达:需将同意消息(如“秒杀开始”“系统维护警告”)同步推送给所有订阅用户/服务,无遗漏。
    • 低延迟:通知需按时送达(如警告消息需要立即通知运维,果冻通知需及时触达用户)。
    • 灵活订阅:支持新增/删除订阅者(如新增“APP推送”订阅者,无需修改消息发送方)。
  • 完整方案
    • 架构选择
      • MQ选择:优先选支持“广播模式”的MQ(如 RocketMQ Topic、RabbitMQ Fanout 交换机、Kafka 多消费者组)。
        • 例:用 RocketMQ 的 Topic 实现广播 —— 生产者发送 “活动通知” 到 Topic,订阅者(APP 推送服务、短信服务、站内信服务)分别订阅该 Topic,各自接收消息并触达用户。
      • 消息设计
        • 消息体包含 “通知类型”(如activity_start/system_alert)、“内容”(如 “10 点秒杀开启”)、“目标范围”(如 “所有用户”/“VIP 用户”)。
    • 用 Tag 做细粒度过滤:如 Topic=“user_notify”,Tag=“activity”(活动通知)、Tag=“alert”(告警),订阅者按需订阅 Tag(如 APP 推送服务仅订阅 Tag=“activity”)。
  • 关键流程
    • 生产者发送:通知系统(如活动系统、监控系统)作为生产者,调用 MQ SDK 发送消息到指定 Topic+Tag,开启 “发送确认”(确保消息成功写入 Broker)。
    • 消费者订阅:各通知服务(APP 推送、短信)作为消费者,订阅对应 Topic+Tag,采用 “Push 模式”(如 RabbitMQ 默认推送、RocketMQ 推模式),确保实时接收。
    • 消息触达:消费者接收消息后,按业务逻辑触达用户(如 APP 推送服务调用第三方推送 SDK(极光 / 个推),短信服务调用短信网关),处理失败时触发重试(如重试 3 次,仍失败则入死信队列,人工排查)。
  • 问题排查
    • 部分订阅者收不到消息
      • 排查点 1:订阅者是否订阅了正确的 Topic+Tag?(如 APP 推送服务误订阅 Tag=“alert”,导致收不到活动通知)。
  • 排查点 2:MQ 是否开启 “广播模式”?(如 Kafka 需确保每个订阅者属于不同消费者组 —— 同一消费者组内仅一个消费者能收到消息,广播需每个订阅者单独建组)。
  • 排查点 3:消息是否过期?(如设置了消息过期时间expire_time=5min,订阅者离线超过 5 分钟,消息被删除)。
  • 通知延迟过高
    • 排查点 1:消费者是否积压消息?(查 MQ 监控 “消费 TPS 是否低于生产 TPS”,若积压,需扩容消费者节点或优化消费逻辑 —— 如 APP 推送服务批量调用推送 SDK,减少网络请求)。
    • 排查点 2:是否用了 “Pull 模式” 且轮询间隔过长?(如 Kafka 拉模式设置poll_interval=10s,改为 Push 模式或缩短轮询间隔至 1s)。
  1. 日志收集场景:分布式系统中,各服务将日志按 “服务名 Topic” 发送,日志平台订阅 Topic 统一收集(如 ELK+Kafka 架构)。
  • 核心需求
    • 高吞吐:分布式系统(如 100 个服务节点)每秒产生万级日志,需 MQ 支撑高写入能力,避免日志丢失。
    • 顺序性:单服务节点的日志需按时间顺序存储(如 “用户登录→下单→支付” 日志不能乱序),便于问题溯源。
    • 解耦与扩展:日志产生方(业务服务)与处理方(日志平台)解耦,新增日志类型(如 API 日志、DB 日志)无需修改业务代码。
  • 完整方案
    • 经典架构:业务服务 → FileBeat → Kafka → Logstash → Elasticsearch → Kibana。
      • FileBeat:部署在业务服务节点,实时采集本地日志文件(如/var/log/app.log),避免业务服务直接调用 MQ,减少性能损耗。
  • Kafka:作为中间件承接高吞吐日志写入,按 “服务名 + 日志类型” 划分 Topic(如 Topic=“order-service-api-log”“user-service-db-log”),每个 Topic 分多个 Partition(如 8 个),确保高并发。
  • Logstash:从 Kafka 拉取日志,做过滤(如剔除无效日志)、转换(如日志格式 JSON 化)、 enrichment(如添加服务 IP 字段),再写入 Elasticsearch。
  • Elasticsearch+Kibana:存储日志并提供可视化查询(如按 “时间范围”“错误类型” 搜索日志)。
  • 关键设计
    • Partition 路由:FileBeat 采集日志时,按 “业务服务节点 IP 哈希” 路由到 Kafka Topic 的 Partition(如 IP=192.168.1.100 的日志固定写入 Partition 0),确保单节点日志在同一 Partition 内有序。
    • 日志压缩:Kafka 生产者开启消息压缩(compression.type=gzip),减少日志传输量和磁盘存储(文本日志压缩率可达 5:1)。
    • 日志保留:Kafka 配置日志保留策略(如log.retention.hours=72,保留 3 天日志),避免磁盘溢出。
  • 问题排查
    • 日志丢失
      • 排查点 1:FileBeat 是否有积压?(查 FileBeat 监控 “backlog” 指标,若积压,需增加 FileBeat 实例或调整采集频率)。
  • 排查点 2:Kafka 是否开启持久化?(默认开启,但需确认log.dirs配置正确,且 Broker 磁盘无故障)。
  • 排查点 3:Logstash 消费是否落后?(查 Kafka 监控 “consumer lag”(消费滞后量),若滞后,需增加 Logstash 实例或优化过滤逻辑)。
  • 日志乱序
    • 排查点 1:Partition 路由是否正确?(如是否按 “服务节点 IP 哈希” 路由 —— 若随机路由,会导致单节点日志分散到多个 Partition,出现乱序)。
    • 排查点 2:Logstash 是否多线程消费?(Logstash 默认多线程处理,需配置pipeline.workers=1(单线程),确保同一 Partition 的日志按顺序处理)。
  1. 业务解耦场景:订单支付成功后,触发库存扣减、账单生成、积分增加(支付服务发送 “支付成功” 消息,其他服务订阅处理)。
  • 核心需求
    • 解耦服务依赖:支付服务无需直接调用库存、账单、积分服务(避免 “支付服务宕机导致其他服务不可用” 或 “新增服务需修改支付服务代码”)。
  • 最终一致性:支付成功后,库存扣减、账单生成、积分增加需最终执行成功(允许短暂延迟,但不能遗漏)。
  • 故障隔离:单个服务处理失败(如积分服务宕机),不影响其他服务(如库存扣减正常执行)。
  • 完整方案
    • 架构选择
      • MQ 选择:优先选支持 “可靠消息” 的 MQ(如 RocketMQ、Kafka),Topic=“payment_success”(支付成功消息)。
  • 消息设计
    • 消息体包含 “订单 ID”“用户 ID”“支付金额”“支付时间”,确保各服务能基于订单 ID 关联业务数据。
    • 用 Tag 区分订单类型:如 Tag=“online_pay”(线上支付)、Tag=“offline_pay”(线下支付),各服务按需订阅(如积分服务仅处理线上支付订单)。
  • 关键流程
    • 支付服务发送消息:用户支付成功后,支付服务作为生产者,发送 “支付成功” 消息到 Topic=“payment_success”,开启 “发送确认”(确保消息写入 Broker),并记录 “消息发送日志”(如数据库表payment_message_log,状态 =“已发送”)。
    • 各服务消费消息
    • 库存服务:订阅消息,根据订单 ID 查询商品库存,扣减库存,处理成功后更新本地 “消费日志”(如inventory_consumer_log,记录订单 ID,避免重复消费);失败则触发重试(重试 3 次,仍失败入死信队列)。
    • 账单服务 / 积分服务:流程同上,各自处理业务并记录消费日志。
    • 一致性保障:定时任务扫描 “消息发送日志” 和各服务 “消费日志”,若发现 “支付成功但某服务未消费”(如积分服务未处理),触发消息重发(需确保消费端幂等)。
  • 问题排查
    • 部分服务未收到消息
      • 排查点 1:服务是否订阅了正确的 Topic+Tag?(如积分服务误订阅 Tag=“offline_pay”,导致收不到线上支付消息)。
  • 排查点 2:MQ 是否触发 Rebalance?(如 Kafka 消费者组新增节点,导致 Partition 重新分配,短暂停止消费,需查消费者日志 “Rebalance” 关键字)。
  • 重复消费导致业务异常(如重复扣库存)
    • 排查点 1:消费端是否做幂等?(如库存服务未建 “订单 ID 唯一索引”,导致重复扣减 —— 需补充唯一索引,或用 Redis 记录 “已处理订单 ID”,消费前先校验)。
    • 排查点 2:生产者是否重复发送?(如支付服务发送消息后未收到 MQ 确认,重试发送 —— 需生产者记录 “消息唯一 ID”,MQ 端去重(如 RocketMQ 的 Message ID 去重))。
  1. 数据同步场景:数据库变更(如 MySQL binlog)通过 CDC 工具发送到 “数据变更 Topic”,数据仓库、缓存服务订阅同步数据。
  • 核心需求
    • 实时同步:数据库(如 MySQL)数据变更(增删改)需实时同步到目标存储(Redis 缓存、Hive 数据仓库),避免数据不一致。
  • 低侵入:不影响业务数据库性能(如避免在业务 SQL 中加同步逻辑)。
  • 断点续传:同步服务宕机后,重启能从上次同步位置继续,避免数据丢失。
  • 完整方案
    • 架构选择
      • 经典架构:MySQL → CDC 工具(Canal/DataX) → Kafka → 同步服务 → Redis/Hive。
    • CDC 工具(以 Canal 为例):模拟 MySQL 从库,订阅 MySQL binlog(二进制日志),解析 binlog 获取数据变更(如insert into order),避免侵入业务库。
    • Kafka:存储变更消息,按 “数据库名 + 表名” 划分 Topic(如 Topic=“mysql_order_db_order_table”),确保变更消息有序且可回溯。
    • 同步服务:从 Kafka 拉取变更消息,按目标存储类型处理:
      • 同步 Redis:若为insert/update,则SET key=订单ID value=订单数据;若为delete,则DEL key=订单ID
      • 同步 Hive:将变更消息按时间分区(如dt=20240520)写入 Hive 表,支持离线分析。
  • 关键设计
    • binlog 配置:MySQL 需开启 binlog(log_bin=ON),且格式设为ROW(记录行级变更,避免 SQL 模式下的歧义)。
    • 同步幂等:同步服务处理消息时,基于 “主键 + 变更时间” 做幂等(如 Redis 同步时,若消息变更时间早于缓存中数据的时间,跳过处理)。
    • 断点续传:CDC 工具记录 “已解析的 binlog 位置”(如filename=mysql-bin.000001, position=1000),同步服务记录 “已消费的 Kafka Offset”,宕机后重启可恢复。
  • 问题排查
    • 同步延迟过高
      • 排查点 1:CDC 工具解析 binlog 是否缓慢?(查 Canal 监控 “parseDelay” 指标,若延迟,需增加 Canal 实例或优化 binlog 解析逻辑)。
  • 排查点 2:Kafka 是否积压?(查 Topic 的 “consumer lag”,若积压,需增加同步服务实例或优化同步逻辑 —— 如 Redis 同步用 Pipeline 批量操作)。
  • 缓存与数据库不一致
    • 排查点 1:同步服务是否漏处理删除操作?(如 MySQL 执行delete from order,Canal 解析到变更但同步服务未执行DEL—— 需查同步服务日志,确认删除消息是否被消费)。
    • 排查点 2:是否存在 “业务库更新后,缓存未更新前被读取”?(如订单服务更新 MySQL 后,同步到 Redis 有 100ms 延迟,期间其他服务读取到旧缓存 —— 需在业务层加 “缓存更新锁”,或用 “Cache-Aside” 模式(读缓存 miss 时查库并更新缓存))。
  1. 分布式事务场景:跨服务操作(下单 + 扣库存)通过 MQ 事务消息确保原子性,避免数据不一致。
  • 核心需求
    • 原子性:跨服务操作要么全部成功(下单成功且库存扣减成功),要么全部失败(下单失败或库存扣减失败,均回滚),避免 “下单成功但库存未扣减”(超卖)或 “库存扣减成功但下单失败”(库存浪费)。
    • 最终一致性:允许短暂延迟(如库存扣减后,下单服务因网络波动未确认),但需通过重试机制确保最终一致。
    • 低耦合:避免服务间强依赖(如下单服务不直接调用库存服务,通过 MQ 解耦)。
  • 完整方案(以RocketMQ事务为例)
    • 架构选择
      • MQ选择:优先选支持原生事务消息的 MQ(如 RocketMQ),避免自定义事务逻辑的复杂性。
      • Topic设计:
        • 半事务消息 Topic:RocketMQ 内置,无需手动创建(用于存储 “未确认的半事务消息”)。
    • 业务 Topic:Topic=“order_create”(下单成功后发送的确认消息),库存服务订阅该 Topic 扣减库存。
  • 关键流程(下单服务为生产者,库存服务为消费者)
    • 发送半事务消息:用户下单时,下单服务调用 RocketMQ SDK 发送 “半事务消息”(消息内容:订单 ID、商品 ID、购买数量),Broker 存储消息但标记为 “不可消费”(库存服务暂时收不到)。
    • 执行本地事务:下单服务执行本地事务(如往 MySQL 插入订单数据,状态 =“待支付”)。
    • 确认消息状态
      • 本地事务成功:下单服务调用 RocketMQ “确认消息” 接口,Broker 将半事务消息标记为 “可消费”,库存服务订阅 Topic=“order_create”,接收消息并扣减库存。
    • 本地事务失败:下单服务调用 RocketMQ “回滚消息” 接口,Broker 删除半事务消息,库存服务无感知。
    • 本地事务结果未知:RocketMQ Broker 每隔 10s 调用下单服务的 “事务回查接口”,下单服务查询本地订单状态,返回 “成功 / 失败”,Broker 根据结果处理消息。
    • 库存服务消费:库存服务接收消息后,扣减库存并记录 “消费日志”(避免重复扣减),处理失败则触发重试(重试 3 次后入死信队列,人工干预)。
  • 问题排查
    • 本地事务成功但是消息未确认(库存未扣减)
      • 排查点 1:下单服务是否调用 “确认消息” 接口?(查下单服务日志,是否有sendMessageInTransaction的确认回调)。
  • 排查点 2:Broker 是否触发事务回查?(查 RocketMQ 监控 “transactionCheckCount” 指标,若回查次数为 0,需确认 “事务回查接口” 是否正确注册)。
  • 库存扣减成功但下单回滚(库存浪费)
    • 排查点 1:下单服务本地事务是否真的失败?(如插入订单时数据库报错,导致回滚 —— 需查下单服务数据库日志,确认失败原因)。
    • 排查点 2:库存服务是否支持补偿?(需设计库存回滚逻辑 —— 如下单服务回滚后,发送 “库存回滚” 消息,库存服务订阅后恢复库存)。
  1. 削峰填谷场景:秒杀、促销活动中,用户请求写入 MQ,后端服务匀速消费,避免数据库崩溃。
  • 核心需求
    • 抗住瞬时高并发:秒杀活动(如 10 万用户同时点击 “抢购”)需 MQ 暂存请求,避免直接冲击后端服务(如数据库)导致宕机。
    • 匀速消费:后端服务(如订单服务、库存服务)按自身最大处理能力(如每秒 1000 单)消费 MQ 消息,避免过载。
    • 防超卖:确保库存不被超扣(如商品库存 100 件,最终仅生成 100 个订单)。
  • 完整方案
    • 架构选择
      • MQ选择:先选高吞吐 MQ(如 Kafka、RocketMQ),Topic=“seckill_request”(秒杀请求队列),分多个 Partition(如 20 个),提升并发写入能力。
        • Kafka:优势在于极高的吞吐量,适合海量日志、消息数据流场景。
        • RocketMQ:优势在于丰富的功能(如事务消息、定时/延迟消息、死信队列)、强大的顺序消息能力和完善的监控,更适合业务逻辑复杂的电商场景。
      • Topic与队列设计
  • Topic:创建一个专门的 Topic,例如 seckill_request_topic
  • 分区/队列数:设置为一个较高的数值(如 20-50 个分区/队列)。这有两个目的:
    • 提升并发写入能力:大量用户请求可以并行写入不同队列,避免单个队列成为瓶颈。
    • 提升并发消费能力:后端服务可以启动多个消费者实例,每个实例处理不同的队列,实现水平扩展,从而提高整体消费速度。
  • 消费者组:库存/订单服务作为一个消费者组(Consumer Group) 来订阅该 Topic,组内多个消费者实例共同消费所有消息,实现负载均衡。
  • 关键流程(用户请求为生产者,订单/库存服务为消费者)
    • 前置过滤与限流
      • 前端限流:在用户浏览器端实施策略,如点击按钮后置灰 3-5 秒、添加图形验证码或答题环节,从源头降低无效请求的频率。
    • 网关层限流:在 API 网关(如 Nginx, Spring Cloud Gateway)设置全局速率限制(如每秒 5000 次),拦截超过系统承载能力的请求,直接返回“活动太火爆,请稍后再试”等友好提示,保护下游服务。
    • 生产并投递秒杀请求:
      • 用户通过前端验证后,发起秒杀请求。
    • 网关或秒杀入口服务 作为生产者,将请求关键信息(如用户ID、商品ID、秒杀活动ID)快速组装成一条消息。
    • 该服务不执行任何核心业务逻辑(如查库存、下单),仅进行参数校验和 token 验证(防刷),然后立即将消息发送至 MQ 的 seckill_request_topic。成功后立即向用户返回“抢购请求已提交,正在排队中...”的响应。
    • 后端服务异步消费与处理
      • 订单处理服务 作为消费者,以固定的速率(根据自身和数据库的处理能力配置)从 MQ 拉取消息。
    • 核心防超卖逻辑
      • 消费者接收到消息后,首先在缓存(如 Redis) 中进行原子操作(如 DECR 或 Lua 脚本)预扣减库存。
      • 如果缓存中库存扣减成功,则继续执行后续创建订单等业务逻辑,操作数据库。
      • 如果缓存中库存已为 0,则直接消费掉此消息,无需再处理,并记录日志。用户最终将看到“已售罄”的提示。
    • 处理成功后,消息被确认消费(ACK)。若处理失败(如数据库异常),可根据配置的重试策略进行重试(如 3 次),重试失败则消息进入死信队列(Dead-Letter Queue, DLQ),等待人工干预排查。
    • 结果通知
      • 处理完成后,可通过推送(如 WebSocket)短信站内信等渠道,异步通知用户最终结果(“秒杀成功,请尽快付款”或“很遗憾,未抢到”)。
  • 问题排查与优化
    • 消息堆积
  • 排查点 1:监控 MQ 的管理控制台,观察消息堆积数量。若堆积持续增长,说明消费者消费速度跟不上生产速度。
  • 解决方案水平扩展消费者:增加订单处理服务的节点实例,提升整体消费能力。同时检查下游数据库是否存在瓶颈(如慢 SQL、未建立索引)。
  • 超卖问题
    • 排查点 1:库存扣减是否在缓存(Redis)中完成?必须是原子操作,不能先查询再计算。
    • 排查点 2:缓存中的库存数据是否与数据库最终一致?需确保活动开始时将库存数量同步到 Redis,活动结束后将最终结果同步回数据库或进行核对。
  • 重复消费
    • 排查点:由于网络抖动或消费者重启,MQ 可能重投递消息。
    • 解决方案:消费者业务逻辑必须实现幂等性。基于消息中的唯一标识(如请求ID/秒杀Token),在数据库中检查是否已处理过该请求,避免重复创建订单。

六、消息队列的运维与监控

1. 核心监控指标

指标类别

关键指标

告警阈值建议

消息层面

生产 / 消费 TPS、消息延迟(生产→消费耗时)、消息积压量(Queue 未消费消息数)、死信消息数

积压量 > 10 万、延迟 > 1s、死信数 > 100

组件层面

Broker 磁盘使用率、Name Server 存活状态、Consumer Group 消费进度差(组内消费者 Offset 差距)

磁盘使用率 > 80%、消费进度差 > 1 万

资源层面

Broker CPU / 内存使用率、网络 IO(发送 / 接收带宽)

CPU>80%、内存 > 90%、带宽接近上限

2. 常见问题排查

  • 消息积压:排查消费者是否宕机、消费逻辑是否耗时过长(如 SQL 慢查询)、消费线程数是否不足。
  • 消息丢失:确认是否开启持久化、主从同步是否正常(如 Kafka 副本同步数不足)、消费者是否漏提交 Offset。
  • 消费重复:检查是否关闭自动提交 Offset、消费端是否未做幂等处理(如无唯一索引)。
  • 顺序混乱:确认生产端是否按规则路由到同一 Queue/Partition、消费端是否单线程处理 Queue/Partition。

3. 扩容与缩容

  • 横向扩容:增加 Broker 节点(分担存储 / 转发压力)、增加 Consumer 节点(提升消费能力)。
  • Partition/Queue 调整:Kafka 增加 Partition 数量(需注意 Partition 增加后不支持减少,且影响顺序性)、RocketMQ 调整 Queue 数量(需重启 Broker)。

七、消息队列的优缺点总结

1. 优点

  • 解耦生产者与消费者,提升系统灵活性与可扩展性。
  • 削峰填谷,保护后端服务免受突发流量冲击。
  • 支持异步通信,减少主流程响应时间,提升用户体验。
  • 实现分布式协同,解决跨服务数据同步、事务一致性问题。

2. 缺点

  • 复杂性增加:需管理 MQ 集群、监控消息流转、排查异常(如积压、丢失),运维成本上升。
  • 消息积压风险:长期高负载下,消费能力不足会导致消息积压,影响业务响应。
  • 分布式事务挑战:虽有事务消息方案,但仍需额外开发(如幂等、回查逻辑),增加业务复杂度。
  • 一致性权衡:异步通信无法保证 “实时一致性”,仅能保证 “最终一致性”,部分强一致场景不适用。

Kafka

一、Kafka 核心概念

Kafka 的架构围绕 “生产者 - broker - 消费者” 模型设计,同时引入了多个独特概念以实现高吞吐和分布式能力,各概念间的关系如下图(简化):
生产者(Producer) → 主题(Topic)(含多个分区)→ Broker 集群 → 消费者组(Consumer Group) → 消费者(Consumer)

1. 基础角色与存储单元

(1)Producer(生产者)
  • 定义:消息的发送方,负责将业务数据(如日志、订单信息)封装为 “消息”,并发送到指定的 Kafka 主题(Topic)。
  • 核心行为
    • 支持异步发送(默认):生产者不等待 Broker 确认,直接继续发送下一条消息,提升吞吐;也可配置为同步发送(需等待确认,保证可靠性)。
    • 自动分区路由:生产者发送消息时,若未指定分区,会通过内置策略(如 “轮询”“按消息 Key 哈希”)将消息分配到 Topic 的不同分区(Partition),实现负载均衡。
    • 批量发送:生产者会将多个消息暂存到本地缓冲区(默认 16KB),满足 “批量大小” 或 “延迟时间” 任一条件时批量发送,减少网络请求次数。
(2)Broker(代理节点)
  • 定义:Kafka 集群的核心节点,本质是一个运行 Kafka 服务的服务器,负责存储消息、接收生产者请求、处理消费者拉取请求
  • 核心特性
    • 无状态设计:Broker 本身不存储集群元数据(如 Topic 分区分布、消费者组状态),元数据由 Zookeeper(旧版)或 Kafka Controller(新版,2.8+ 支持 kraft 协议)管理。
    • 可水平扩展:通过增加 Broker 节点,可直接提升集群的存储容量和并发处理能力。
    • 角色分工:集群中会选举一个 “Controller Broker”,负责管理分区副本的 leader/follower 切换、 Topic 创建 / 删除等集群级操作,其他 Broker 仅处理消息读写。
(3)Topic(主题)
  • 定义:消息的 “逻辑分类标签”,用于区分不同业务场景的消息(如 “user_log”“order_pay”),生产者按 Topic 发送消息,消费者按 Topic 订阅消息。
  • 本质:Topic 本身不存储消息,而是由多个 “分区(Partition)” 组成,消息实际存储在 Partition 中(可理解为 “Topic 是 Partition 的集合”)。
  • 命名规则:支持字母、数字、下划线、连字符,需避免特殊字符(如 ./),建议按 “业务模块 - 消息类型” 命名(如 payment-success)。
(4)Partition(分区)
  • 定义:Kafka 消息存储的最小物理单元,每个 Topic 可划分为 1 个或多个 Partition(创建 Topic 时指定,默认 1 个,生产环境通常设置为 3-12 个),每个 Partition 对应磁盘上的一个目录。
  • 核心作用
    • 实现并行性:多个 Partition 可分布在不同 Broker 上,生产者可向多个 Partition 并行发送消息,消费者组的多个消费者可并行拉取不同 Partition 的消息,极大提升吞吐(Kafka 高吞吐的核心基础)。
    • 保证局部顺序性:单个 Partition 内的消息是严格有序的(按发送时间排序,每个消息有唯一的偏移量 Offset),但整个 Topic 跨 Partition 无全局顺序(若需全局顺序,需将 Topic 分区数设为 1)。
  • 存储结构
    • 每个 Partition 目录下包含多个 “分段文件(Segment File)”,默认分为 “索引文件(.index)” 和 “数据文件(.log)”:
      • .log 文件:存储实际消息(默认单个文件最大 1GB,满后自动滚动生成新文件);
      • .index 文件:存储 “消息 Offset 与 .log 文件中物理地址的映射”,用于快速定位消息(避免全量扫描 .log 文件)。
(5)Consumer(消费者)
  • 定义:消息的接收方,负责从指定 Topic 的 Partition 中拉取(Pull 模式)消息并进行业务处理(如写入数据库、触发告警)。
  • 核心行为
    • 拉取模式(Pull):消费者主动向 Broker 请求 “拉取指定 Offset 后的消息”,而非 Broker 推送(Push),避免 “消息积压导致消费者过载”(区别于部分 MQ 的 Push 模式)。
    • 维护消费位置:消费者会记录自己在每个 Partition 上的 “消费偏移量(Offset)”—— 即 “下一条要拉取的消息的位置”,默认情况下,消费者消费完消息后会自动提交 Offset(也可手动提交,保证 “消费 - 提交” 原子性)。
(6)Consumer Group(消费者组)
  • 定义:由多个消费者组成的逻辑分组,是 Kafka 实现 “点对点” 和 “广播” 的核心机制。
  • 核心规则
    • 分区分配:一个 Partition 只能被同一个消费者组内的一个消费者消费(避免同组内多个消费者重复消费同一条消息);反之,一个消费者可消费多个 Partition(数量由 “分区数 / 消费者数” 决定)。
    • 场景适配:
      • 点对点通信(单播):多个消费者加入同一个消费者组,消息会被组内任意一个消费者处理(如订单支付消息,只需一个服务处理);
      • 广播通信(多播):每个消费者单独属于一个消费者组,消息会被所有组的消费者处理(如通知消息,需多个服务同步接收)。
    • 重平衡(Rebalance):当消费者组内 “新增 / 下线消费者” 或 “Topic 新增分区” 时,Kafka 会重新分配 Partition 给消费者,保证 “分区 - 消费者” 映射关系的均衡。

2. 消息与偏移量

(1)Message(消息)
  • 结构:Kafka 消息由 “Key + Value + 元数据” 组成:
    • Key:可选,字符串 / 字节数组类型,用于 “分区路由”(相同 Key 的消息会分配到同一个 Partition);
    • Value:消息正文,二进制数据(Kafka 不关心内容格式,需业务层自行序列化 / 反序列化,如 JSON、Protobuf);
    • 元数据:包括消息的 Topic、Partition、Offset、时间戳(创建时间 / 日志追加时间)等。
(2)Offset(偏移量)
  • 定义:每个 Partition 内的消息都有一个唯一的、自增的整数编号,即 Offset,用于标识消息在 Partition 中的位置(类似 “文件行号”)。
  • 核心作用
    • 消费者通过 Offset 定位 “已消费到哪里”“下次该拉取哪条消息”;
    • 支持 “消息回溯”:若业务需要重新处理历史消息,消费者可手动将 Offset 重置到过去的某个位置(如 1 小时前的 Offset)。
  • 存储位置:旧版 Kafka 中,消费者组的 Offset 存储在 Zookeeper 中;新版(0.9+)默认存储在 Kafka 内置的 “__consumer_offsets” Topic 中(更可靠、减少 Zookeeper 压力)。

3. 副本机制(Replica)

  • 定义:为保证消息不丢失,Kafka 为每个 Partition 创建多个 “副本”(Replica),副本分布在不同的 Broker 上,分为 “Leader 副本” 和 “Follower 副本”。
  • 角色分工
    • Leader 副本:唯一负责 “读写请求” 的副本,生产者发送的消息直接写入 Leader,消费者拉取消息也从 Leader 读取;
    • Follower 副本:仅负责 “同步 Leader 的数据”(实时从 Leader 复制消息),不处理读写请求;若 Leader 副本所在 Broker 下线,Controller 会从 Follower 中选举新的 Leader,保证服务可用性。
  • ISR 集合(In-Sync Replicas)
    • 定义:与 Leader 副本保持 “同步状态” 的 Follower 副本集合(同步延迟不超过配置的阈值,默认 10 秒);
    • 可靠性保障:生产者可配置 “消息确认机制(acks)”,如 acks=all 表示 “消息需写入 Leader 并被所有 ISR 副本同步后,才返回成功”,此时即使 Leader 下线,ISR 中的 Follower 也已保存消息,避免数据丢失。

二、Kafka 关键技术特性

Kafka 的核心优势源于其底层设计,主要体现在 “高吞吐、高可靠、可扩展、低延迟” 四大维度,以下是关键技术特性的详细解析:

1. 高吞吐(High Throughput)

Kafka 最核心的特性之一,单 Broker 可支持每秒数十万条消息的读写,集群吞吐可达数百万 / 秒,核心实现手段包括:
  • 批量读写 + 异步通信
    • 生产者批量发送(缓冲区暂存,满批量或超时后发送),减少网络请求次数;
    • 消费者批量拉取(一次拉取多条消息),降低 Broker 与消费者的交互频率;
    • 默认异步通信,生产者无需等待 Broker 确认即可继续发送,避免同步等待的耗时。
  • 磁盘顺序写入
    • 消息在 Partition 的 .log 文件中采用 “顺序追加写入”(而非随机写入),磁盘顺序写入的速度接近内存读写(机械硬盘顺序写入可达 100MB/s 以上,远快于随机写入的 10MB/s 以下);
    • 避免了磁盘寻道时间(随机写入的主要耗时点),是 Kafka 高吞吐的 “物理基础”。
  • 分区并行处理
    • 多个 Partition 分布在不同 Broker 上,生产者可并行向多个 Partition 发送消息,消费者组的多个消费者可并行拉取不同 Partition 的消息,实现 “并行化读写”,突破单节点性能瓶颈。

2. 高可靠性(High Reliability)

通过多副本、消息持久化、确认机制等设计,保证消息 “不丢失、不重复、不篡改”:
  • 消息持久化
    • 消息写入 Leader 副本后,会立即追加到磁盘的 .log 文件中(而非仅存于内存),即使 Broker 宕机,重启后可从磁盘恢复消息;
    • 支持 “日志保留策略”:可按 “时间(如保留 7 天)” 或 “大小(如每个 Partition 日志总大小不超过 100GB)” 删除旧日志,避免磁盘溢出。
  • 多副本与 ISR 机制
    • 每个 Partition 有多个副本,Leader 下线后可快速选举新 Leader,保证服务不中断;
    • 生产者配置 acks=all 时,消息需被所有 ISR 副本同步后才确认,确保 “Leader 宕机后,Follower 已保存消息”,无数据丢失。
  • 消费 Offset 持久化
    • 消费者的 Offset 存储在 Kafka 内置的 __consumer_offsets Topic 中(副本机制保障 Offset 不丢失),即使消费者重启,也能从上次的 Offset 继续消费,避免重复消费或漏消费。

3. 可水平扩展(Horizontal Scalability)

Kafka 集群的 Broker、Partition、消费者均可独立扩展,无需停机,适应业务增长:
  • Broker 扩展:新增 Broker 节点后,Kafka 会自动将 Topic 的 Partition 副本分配到新 Broker 上(通过 “分区重分配工具”),提升集群的存储容量和处理能力;
  • Partition 扩展:Topic 创建后,可随时增加 Partition 数量(不能减少),新增的 Partition 会被分配到空闲 Broker 上,支持更高的并发读写;
  • 消费者扩展:消费者组内新增消费者时,Kafka 会触发 Rebalance,将部分 Partition 重新分配给新消费者,实现 “消费能力随消费者数量线性提升”(需保证 “消费者数量 ≤ 分区数量”,否则多余消费者会空闲)。

4. 低延迟(Low Latency)

Kafka 早期以 “高吞吐” 为核心,延迟较高(秒级),但后续版本(0.10+)通过优化,实现了 “毫秒级延迟”,满足实时场景需求:
  • 零拷贝(Zero-Copy)
    • 消费者拉取消息时,Kafka 采用 “零拷贝” 技术:消息从磁盘直接通过内核缓冲区发送到消费者 socket,无需经过 “内核缓冲区 → 用户缓冲区 → 内核缓冲区” 的拷贝(传统模式需 4 次拷贝、2 次上下文切换,零拷贝仅需 2 次拷贝、1 次上下文切换),极大减少 CPU 和内存开销,降低延迟。
  • 批量大小与延迟的平衡
    • 生产者的 “批量大小(batch.size)” 和 “延迟阈值(linger.ms)” 可灵活配置:若需低延迟,可将 linger.ms 设为 0(不等待,有消息就发送),牺牲部分吞吐;若需高吞吐,可增大 batch.size 和 linger.ms,接受轻微延迟。
  • 内存映射文件(MMAP)
    • Kafka 对 .log 文件采用 “内存映射(MMAP)” 技术,将磁盘文件映射到内核内存,避免用户态与内核态的数据拷贝,提升消息读写速度。

5. 流处理能力(Stream Processing)

Kafka 不仅是消息队列,还内置了 “流处理引擎(Kafka Streams)”,支持对实时消息进行 “过滤、转换、聚合” 等操作,无需依赖外部流处理框架(如 Flink、Spark Streaming):
  • 核心概念
    • Stream:无界的、连续的消息流(对应 Kafka Topic);
    • Topology:流处理的 “计算逻辑图”,由 “源处理器(Source Processor,读取 Topic 消息)”、“处理器(Processor,执行业务逻辑)”、“Sink Processor(将结果写入 Topic)” 组成;
  • 优势
    • 轻量级:无需部署独立的流处理集群,嵌入到业务应用中即可运行;
    • 高集成:与 Kafka 消息存储深度耦合,无需额外的数据传输开销;
    • Exactly-Once 语义:支持 “精确一次” 处理(通过 “事务 + Offset 原子提交”),避免消息重复处理导致的计算错误。

6. 事务支持(Transactions)

Kafka 0.11+ 引入事务机制,支持 “跨 Topic/Partition 的原子性消息读写”,解决 “消息重复、消息丢失、数据不一致” 问题:
  • 核心能力
    • 原子发送:生产者可在一个事务中向多个 Topic/Partition 发送消息,要么全部成功,要么全部失败;
    • 原子消费 - 生产:消费者可在一个事务中 “拉取消息 → 处理 → 发送结果到其他 Topic”,确保 “消费消息” 和 “发送结果” 的原子性(如 “消费订单消息 → 处理后发送到支付 Topic”,若处理失败,消费和发送均回滚);
  • 实现原理:通过 “事务协调器(Transaction Coordinator)” 管理事务状态,使用 “事务 ID(Transaction ID)” 确保生产者重启后可恢复未完成的事务,避免重复发送。

三、总结

Kafka 凭借 “分区并行、磁盘顺序写入、多副本” 等底层设计,实现了 “高吞吐、高可靠、可扩展” 的核心优势,同时通过 “零拷贝、流处理、事务” 等特性,满足从日志收集到实时数据分析的多样化场景需求。理解其核心概念(Topic/Partition/Consumer Group/Replica)和技术特性(高吞吐、低延迟、事务),是正确使用 Kafka 并进行架构设计的基础。
http://www.dtcms.com/a/358473.html

相关文章:

  • JAVA EE初阶 4:文件操作和IO
  • 使用 SVM(支持向量机)进行图像分类:从读取图像到训练与分类的完整流程
  • Python API接口实战指南:从入门到精通
  • HarmonyOS三方库的使用
  • Java SpringAI应用开发面试全流程解析:RAG、流式推理与企业落地
  • 【Java工程师面试全攻略】Day13:云原生架构与Service Mesh深度解析
  • 防火墙技术(二):安全区域
  • 【Linux】系统部分——软硬链接动静态库的使用
  • Tomcat 企业级运维实战系列(四):Tomcat 企业级监控
  • 每日Java并发面试系列(5):基础篇(线程池的核心原理是什么、线程池大小设置为多少更合适、线程池哪几种类型?ThreadLocal为什么会导致内存泄漏?)
  • Tomcat 企业级运维实战系列(三):Tomcat 配置解析与集群化部署
  • Qt实战:如何打开摄像头并实现视频的实时预览
  • 生成式 AI 重构内容生产:效率提升背后的创作版权边界争议
  • react虚拟列表实现及原理
  • leetcode2(移除元素)
  • 本地部署音效生成器 Moodist 并实现外部访问
  • Spring Cloud 和 Dubbo 是目前主流的两大微服务框架,分别代表了两种不同的技术路线
  • HarmonyOS 应用开发:基于API 12及以上的现代化实践
  • I2C多点触控驱动开发详解
  • Elasticsearch logsdb 索引模式和 TSDS 的业务影响
  • 【小白笔记】基本的Linux命令来查看服务器的CPU、内存、磁盘和系统信息
  • 网络编程4-并发服务器、阻塞与非阻塞IO、信号驱动模型、IO多路复用..
  • MQTT 连接建立与断开流程详解(二)
  • 项目管理在企业中的作用
  • 小迪Web自用笔记7
  • Redission 实现延迟队列
  • 鸿蒙NEXT布局全解析:从线性到瀑布流,构建自适应UI界面
  • Notepad++常用设置
  • 金仓数据库迁移评估系统(KDMS)V4正式上线,助力企业高效完成数据库国产化替代
  • 果蔬采摘机器人:自动驾驶融合视觉识别,精准定位,高效作业