202529 | RocketMQ 简介 + 安装 + 集群搭建 + 消费模式 + 消费者组

RocketMQ简介

RocketMQ 简介

Apache RocketMQ 是一款开源的 分布式消息中间件(Message Queue, MQ),由阿里巴巴团队研发并捐赠给 Apache 基金会,现已成为顶级项目。它专为 高吞吐、低延迟、高可靠 的分布式场景设计,广泛应用于 电商、金融、物流、IoT 等领域。


1. 核心特性

特性说明
高吞吐单机支持 10万+ TPS(消息吞吐量),适用于大流量场景(如双11、秒杀)。
低延迟毫秒级 消息投递,满足实时业务需求。
高可靠支持 同步刷盘、多副本存储,确保数据不丢失。
事务消息提供 两阶段提交(2PC),保证分布式事务一致性。
顺序消息支持 分区有序(如订单ID相同的消息严格有序)。
定时/延时消息可设定消息在 指定时间延迟后 投递。
消息回溯支持按 时间戳 重新消费历史消息。
消息过滤支持 Tag 过滤SQL92 表达式 筛选消息。

2. 核心架构

RocketMQ 采用 发布-订阅(Pub/Sub) 模型,主要由以下组件构成:

(1)NameServer(路由中心)

  • 轻量级 无状态服务,负责 Broker 发现路由管理
  • 类似 Kafka 的 ZooKeeper,但更简单高效。

(2)Broker(消息存储与转发)

  • 主从架构(Master-Slave),支持 同步/异步复制,确保高可用。
  • 存储模型
    • CommitLog:所有消息 顺序写入,提升磁盘 IO 性能。
    • ConsumeQueue:逻辑队列,存储消息索引,加速消费。

(3)Producer(生产者)

  • 负责发送消息,支持 同步、异步、单向(Oneway) 发送模式。

(4)Consumer(消费者)

  • 支持 集群消费(负载均衡)广播消费(全量投递)
  • 提供 Push(服务端推送) Pull(客户端拉取) 两种消费模式。

3. 典型应用场景

(1)削峰填谷(流量控制)

  • 场景:秒杀、大促等高并发场景,避免系统过载。
  • 方案:消息队列缓冲请求,后端按处理能力消费。

(2)异步解耦

  • 场景:订单支付成功后,异步通知库存、物流、营销系统。
  • 方案:Producer 发送消息,Consumer 订阅处理,降低系统耦合。

(3)分布式事务

  • 场景:跨服务事务(如订单+库存)。
  • 方案:使用 事务消息,确保最终一致性。

(4)日志收集

  • 场景:实时采集业务日志,传输至大数据系统(如 Flink、Hadoop)。
  • 方案:RocketMQ + RocketMQ Connect 构建数据管道。

4. 对比其他MQ

对比项RocketMQKafkaRabbitMQ
设计目标金融级可靠消息日志流处理企业级AMQP
吞吐量10万+ TPS百万级 TPS万级 TPS
延迟毫秒级毫秒~秒级微秒~毫秒级
事务支持✅(2PC事务消息)⚠️(有限支持)
消息回溯✅(按时间戳)✅(按Offset)
适用场景电商、金融、IoT日志、大数据企业应用集成

5. 快速体验

(1)启动服务

# 启动 NameServer
nohup sh bin/mqnamesrv &# 启动 Broker
nohup sh bin/mqbroker -n localhost:9876 &

(2)发送消息(Java示例)

DefaultMQProducer producer = new DefaultMQProducer("ProducerGroup");
producer.setNamesrvAddr("localhost:9876");
producer.start();
Message msg = new Message("TopicTest", "TagA", "Hello RocketMQ".getBytes());
SendResult result = producer.send(msg); // 同步发送
producer.shutdown();

(3)消费消息

DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("ConsumerGroup");
consumer.setNamesrvAddr("localhost:9876");
consumer.subscribe("TopicTest", "TagA");
consumer.registerMessageListener((List<MessageExt> msgs, ConsumeConcurrentlyContext context) -> {System.out.println("收到消息: " + new String(msgs.get(0).getBody()));return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
});
consumer.start();

6. 总结

适合场景

  • 需要 高可靠、事务支持、顺序消息 的业务(如支付、订单)。
  • 大规模分布式系统,要求 高吞吐、低延迟

不适合场景

  • 极低延迟(微秒级)场景(可考虑 RabbitMQ)。
  • 纯日志流处理(可考虑 Kafka)。

📌 推荐使用

  • 金融、电商、物流、IoT 等对 数据一致性 要求高的领域。

🔗 官方资源

  • 官网:https://rocketmq.apache.org/
  • GitHub:https://github.com/apache/rocketmq

RocketMQ 凭借其 高性能、高可靠、丰富的消息模式,已成为企业级消息中间件的首选之一。 🚀

RocketMQ安装

RocketMQ 安装指南(Linux/Windows/Mac)

RocketMQ 支持多种操作系统,以下是详细的安装步骤:


1. 环境准备

  • JDK 1.8+(推荐 OpenJDK 或 Oracle JDK)
  • 4GB+ 内存(Broker 默认需要 2GB 堆内存)
  • 磁盘空间(建议 10GB+,用于消息存储)

2. 下载 RocketMQ

从官方镜像站下载最新稳定版(以 5.0.0 为例):

# Linux/Mac
wget https://archive.apache.org/dist/rocketmq/5.0.0/rocketmq-all-5.0.0-bin-release.zip
unzip rocketmq-all-5.0.0-bin-release.zip
cd rocketmq-5.0.0# Windows
下载地址:https://archive.apache.org/dist/rocketmq/5.0.0/rocketmq-all-5.0.0-bin-release.zip
解压后进入 `rocketmq-5.0.0/bin` 目录。

3. 启动 NameServer

NameServer 是轻量级路由中心,无状态服务。

Linux/Mac

# 启动 NameServer(后台运行)
nohup sh bin/mqnamesrv &# 查看日志
tail -f ~/logs/rocketmqlogs/namesrv.log

Windows

# 在 CMD 中执行
.\bin\mqnamesrv.cmd

4. 启动 Broker

Broker 是消息存储和转发节点,需配置内存参数。

Linux/Mac

# 修改 JVM 内存(可选,默认 2GB)
export JAVA_OPT="-Xms2g -Xmx2g"# 启动 Broker(单机模式)
nohup sh bin/mqbroker -n localhost:9876 &# 查看日志
tail -f ~/logs/rocketmqlogs/broker.log

Windows

# 修改内存(编辑 bin/runbroker.cmd)
set "JAVA_OPT=-Xms1g -Xmx1g"# 启动 Broker
.\bin\mqbroker.cmd -n localhost:9876

5. 验证安装

(1)检查进程

# Linux/Mac
jps -l | grep -E 'NamesrvStartup|BrokerStartup'# 预期输出
12345 org.apache.rocketmq.namesrv.NamesrvStartup
67890 org.apache.rocketmq.broker.BrokerStartup

(2)发送测试消息

# 使用自带工具测试
export NAMESRV_ADDR=localhost:9876
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer# 预期输出
SendResult [sendStatus=SEND_OK, msgId=...]

(3)消费测试消息

sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer# 预期输出
Receive message: Hello RocketMQ 0
Receive message: Hello RocketMQ 1
...

6. 关闭服务

# 关闭 Broker
sh bin/mqshutdown broker# 关闭 NameServer
sh bin/mqshutdown namesrv

7. 常见问题

(1)内存不足

  • 报错Java heap space
  • 解决:修改 bin/runbroker.shrunbroker.cmd,调整 -Xms-Xmx

(2)端口冲突

  • 报错Address already in use
  • 解决:检查 9876(NameServer)和 10911(Broker)端口是否被占用。

(3)Windows 启动失败

  • 报错找不到主类
  • 解决:确保 JDK 环境变量配置正确,或使用绝对路径运行脚本。

8. 生产环境建议

  1. 集群部署:至少 2 台 NameServer + 主从 Broker。
  2. 持久化配置
    # conf/broker.conf
    brokerClusterName=DefaultCluster brokerName=broker-a
    brokerId=0  # 0=Master, >0=Slave
    storePathRootDir=/data/rocketmq/store
    
  3. 监控工具:集成 Prometheus + Grafana(官方提供 Dashboard)。

9. 卸载 RocketMQ

# 删除安装目录
rm -rf rocketmq-5.0.0# 清理日志和数据
rm -rf ~/logs/rocketmqlogs
rm -rf ~/store

通过以上步骤,你可以快速完成 RocketMQ 的安装和验证。如需更高级配置(如 ACL 权限、多副本同步),请参考 官方文档。 🚀

RocketMQ快速入门

Java 中使用 RocketMQ 快速入门

以下是一个完整的 Java 示例,涵盖 Producer(生产者)Consumer(消费者) 的基本用法,使用 RocketMQ 5.x 客户端。


1. 添加 Maven 依赖

<dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-client</artifactId><version>5.0.0</version> <!-- 使用最新版本 -->
</dependency>

2. 生产者(Producer)示例

发送同步消息(阻塞等待 Broker 响应):

import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.client.producer.SendResult;public class ProducerExample {public static void main(String[] args) throws Exception {// 1. 创建生产者(指定 Producer Group)DefaultMQProducer producer = new DefaultMQProducer("test_producer_group");// 2. 设置 NameServer 地址producer.setNamesrvAddr("localhost:9876");// 3. 启动生产者producer.start();// 4. 创建消息(Topic, Tag, Body)Message msg = new Message("test_topic", "TagA", "Hello RocketMQ".getBytes());// 5. 发送消息(同步方式)SendResult result = producer.send(msg);System.out.println("发送结果: " + result);// 6. 关闭生产者producer.shutdown();}
}

关键参数说明

  • Producer Group:生产者组,用于事务消息和故障转移。
  • Topic:消息的分类(如订单、支付)。
  • Tag:消息的子分类(如 TagA 表示普通消息,TagB 表示紧急消息)。

3. 消费者(Consumer)示例

使用 Push 模式(服务端推送消息):

import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.*;
import org.apache.rocketmq.common.message.MessageExt;
import java.util.List;public class ConsumerExample {public static void main(String[] args) throws Exception {// 1. 创建消费者(指定 Consumer Group)DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("test_consumer_group");// 2. 设置 NameServer 地址consumer.setNamesrvAddr("localhost:9876");// 3. 订阅 Topic 和 Tag(* 表示所有 Tag)consumer.subscribe("test_topic", "*");// 4. 注册消息监听器
.registerMessageListener(new MessageListenerConcurrently() {@Overridepublic ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> messages,ConsumeConcurrentlyContext context) {for (MessageExt msg : messages) {System.out.printf("收到消息: Topic=%s, Tag=%s, Body=%s %n",msg.getTopic(),msg.getTags(),new String(msg.getBody()));}// 返回消费状态(成功/失败)return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;}});// 5. 启动消费者consumer.start();System.out.println("消费者已启动,等待消息...");}
}

关键参数说明

  • Consumer Group:消费者组,同组内负载均衡。
  • MessageListenerConcurrently:并发消费(默认方式)。
  • ConsumeConcurrentlyStatus.CONSUME_SUCCESS:确认消费成功(失败则重试)。

4. 运行流程

  1. 启动 NameServer 和 Broker(参考安装指南)。
  2. 运行 Producer:发送消息到 Broker。
  3. 运行 Consumer:自动从 Broker 拉取消息并处理。

预期输出

# Producer 输出
发送结果: SendResult [sendStatus=SEND_OK, msgId=...]# Consumer 输出
收到消息: Topic=test_topic, Tag=TagA, Body=Hello RocketMQ

5. 高级功能示例

(1)发送异步消息

producer.send(msg, new SendCallback() {@Overridepublic void onSuccess(SendResult sendResult) {System.out.println("异步发送成功: " + sendResult);}@Overridepublic void onException(Throwable e) {System.out.println("异步发送失败: " + e.getMessage());}
});

(2)发送顺序消息

// 发送时指定 ShardingKey(相同 Key 的消息保证顺序)
SendResult result = producer.send(msg, (mqs, msg, arg) -> {Integer id = (Integer) arg;return mqs.get(id % mqs.size());
}, orderId); // orderId 作为分区键

(3)消费模式(集群 vs 广播)

// 集群模式(同组消费者共享消息)
consumer.setMessageModel(MessageModel.CLUSTERING);
// 广播模式(同组消费者各自消费全量消息)
consumer.setMessageModel(MessageModel.BROADCASTING);

6. 常见问题

(1)连接失败

  • 问题No route info of this topic
  • 解决:检查 Broker 是否启动,或手动创建 Topic:
    sh bin/mqadmin updateTopic -n localhost:9876 -t test_topic
    

(2)重复消费

  • 原因:消费者返回 RECONSUME_LATER 或超时未响应。
  • 解决:确保消费逻辑幂等,或使用 MessageExt.getReconsumeTimes() 判断重试次数。

(3)消息堆积

  • 解决:增加消费者实例,或调整 pullBatchSize
    consumer.setPullBatchSize(32); // 默认 32
    

7. 完整项目结构

src/
├── main/
│   ├── java/
│   │   ├── ProducerExample.java
│   │   └── ConsumerExample.java
│   └── resources/
│       └── logback.xml  # 日志配置(可选)
pom.xml

通过以上代码,你可以快速上手 RocketMQ 的核心消息收发功能。更多高级特性(如事务消息、延迟消息)请参考 官方文档。 🚀


RocketMQ集群搭建

RocketMQ 核心角色

image-20250412111227099

注册/发现
注册/发现
心跳检测
心跳检测
数据同步
数据同步
Producer
NameServer集群
Consumer
Broker-Master1
Broker-Master2
Broker-Slave1
Broker-Slave2
角色职责部署要求数据流向
NameServer路由管理中心至少2节点无状态
Broker-Master消息读写奇数节点持久化存储
Broker-Slave数据备份与Master配对同步/异步复制
Producer消息生产可水平扩展→ Broker
Consumer消息消费可水平扩展← Broker

RocketMQ集群核心特点详解

1. NameServer 无状态设计
独立运行
独立运行
NameServer-1
Broker
NameServer-2
Broker
  • 无状态集群:节点间零数据同步,完全独立运行
  • 轻量级:单节点资源消耗低(1核2GB内存足够)
  • 高可用:建议至少部署2个节点(不同可用区)
  • 数据时效
    • Broker每30秒上报路由信息
    • 客户端每30秒刷新路由缓存
2. Broker 主从架构
同步复制
异步复制
Master-1
Slave-1
Slave-2
配置维度MasterSlave
BrokerId必须设为0必须≥1(建议顺序递增)
BrokerName同组主从必须相同(如broker-a)同组主从必须相同
连接管理与所有NameServer保持长连接额外与对应Master建立数据通道
数据同步主动推送数据支持两种模式:
• SYNC_MASTER(强一致)
• ASYNC_MASTER(高性能)
3. Producer 工作模式
Producer NameServer Broker-Master 随机选择1个节点建立连接 返回Topic路由表 发送消息+心跳(30s间隔) 重新获取路由 alt [Master宕机] loop [持续运行] Producer NameServer Broker-Master
  • 无状态设计:支持无限水平扩展
  • 智能路由
    • 首次随机选择NameServer
    • 自动感知Broker拓扑变化
  • 容错机制
    // 建议生产环境配置
    producer.setRetryTimesWhenSendFailed(3);
    producer.setSendMsgTimeout(5000);
    
4. Consumer 消费规则
首选
降级
Consumer
Master
Slave
  • 订阅策略
    • 默认从Master消费(最新数据)
    • Master不可用时自动切换Slave
  • 负载均衡
    // 集群模式下自动分配队列
    consumer.setMessageModel(MessageModel.CLUSTERING);
    
  • 位点控制
    // 支持三种初始位点
    consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET  // 常用配置
    );
    
5. 生产环境黄金法则
  1. 部署建议

    • NameServer:奇数节点(3节点最佳)
    • Broker:SYNC_MASTER + 至少1个Slave
  2. 性能调优

    # broker.conf
    mappedFileSizeCommitLog=1073741824  # 1GB CommitLog文件
    flushIntervalCommitLog=1000         # 1秒刷盘间隔
    
  3. 监控指标

    指标类别关键指标报警阈值
    消息堆积consumerOffset落后量>10万条
    系统资源CPU使用率>70%持续5分钟
    网络吞吐入站流量接近带宽上限80%

RocketMQ集群模式

RocketMQ 支持多种集群部署模式,主要分为以下三种,每种模式适用于不同的场景和需求:


1. 单 Master 模式
  • 特点:只有一个 Master 节点,无 Slave 节点。
  • 优点:部署简单,资源消耗低。
  • 缺点:存在单点故障风险,一旦 Master 宕机,整个服务不可用。
  • 适用场景:仅用于测试或开发环境,不推荐生产使用

2. 多 Master 模式
  • 特点:多个 Master 节点组成集群,无节点。
  • 优点
    • 高性能:所有节点均可读写,无主从复制延迟。
    • 高可用:单个 Master 宕机不影响其他节点。
  • 缺点
    • 宕机期间未被消费的消息可能丢失(未配置同步刷盘时)。
    • 无法自动故障转移(需人工干预)。
  • 适用场景:对消息丢失不敏感的高吞吐场景(例如日志收集)。

3. 多 Master 多 Slave 模式
  • 子模式
    • 同步复制(Sync):Master 和 Slave 数据完全一致后返回写入成功。
    • 异步复制(Async):Master 写入成功后立即返回,数据异步复制到 Slave。
  • 优点
    • 高可用:Master 宕机后,Slave 可自动或手动切换为 Master。
    • 数据可靠性高(尤其是同步复制模式)。
  • 缺点
    • 同步复制性能较低(需等待 Slave 完成复制)。
    • 异步复制可能丢失少量数据(Master 宕机时未复制的数据)。
  • 适用场景:对数据可靠性要求高的生产环境(如金融交易)。

简单对比表
模式可靠性性能自动容灾适用场景
单 Master最高不支持测试/开发
多 Master不支持允许少量丢失的高吞吐场景
多 Master 多 Slave(异步)中高中高支持平衡可靠性与性能的生产环境
多 Master 多 Slave(同步)最高 中支持强一致性要求的场景

选择建议
  • 追求简单和性能:多 Master 模式。
  • 追求高可用和数据可靠:多 Master 多 Slave + 同步复制。
  • 折中方案:多 Master 多 Slave + 异步复制(需容忍少量丢失)。

RocketMQ 的集群模式灵活,可根据业务需求在性能、可靠性和复杂度之间权衡。

RocketMQ双主双从搭建

一、架构设计
注册
注册
同步复制
同步复制
NameServer集群
Master1
Master2
Slave1
Slave2
二、配置要点
关键参数Master配置Slave配置
brokerRoleSYNC_MASTERSLAVE
brokerId01
listenPort1091111011
三、部署步骤
  1. 启动NameServer:
nohup sh bin/mqnamesrv &
  1. 启动Master节点:
nohup sh bin/mqbroker -c conf/2m-2s-sync/broker-a.properties &
  1. 启动Slave节点:
nohup sh bin/mqbroker -c conf/2m-2s-sync/broker-a-s.properties &

RocketMQ消费模式

一、Push模式(长轮询)

长轮询
实时回调
Broker
Client
Listener

核心机制

  • Broker主动推送(实际基于长轮询)
  • 客户端注册MessageListener
  • 服务端hold连接(默认15s超时)

特点

  • 实时性高(消息延迟<1s)
  • 客户端资源占用较多
  • 服务端维护消费进度

示例代码

consumer.registerMessageListener((MessageListenerConcurrently) (msgs, context) -> {// 处理消息return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
});

二、Pull模式

主动拉取
返回消息
Client
Broker

核心机制

  • 客户端定时拉取(需自行控制频率)
  • 可精确控制消费位点
  • 需手动提交offset

特点

  • 灵活性高(可自定义拉取逻辑)
  • 容易产生空轮询
  • 客户端维护消费进度

示例代码

PullResult pullResult = consumer.pullBlockIfNotFound(new MessageQueue("topic", "broker", queueId),"*",getMessageQueueOffset(),32 // 单次拉取条数
);

三、对比总结表

特性Push模式Pull模式
实现原理服务端长轮询客户端主动请求
实时性高(毫秒级)依赖拉取频率
资源消耗服务端连接开销大客户端控制开销大
消费控制自动提交offset需手动管理offset
适用场景常规实时业务特殊调度需求/批量处理

四、选型建议

  1. 默认用Push模式

    • 适合99%的常规场景
    • 简化客户端代码
    // 推荐配置(并发消费)
    consumer.setConsumeThreadMin(20);
    consumer.setConsumeThreadMax(64);
    
  2. 考虑Pull模式当

    • 需要精确控制消费速率时
    • 实现自定义存储offset逻辑
    // 典型Pull控制逻辑
    while(true) {if(业务允许消费){pullResult = consumer.pull(...);// 处理消息updateOffset();}Thread.sleep(100); // 控制频率
    }
    

注意事项

  • Push模式实际仍基于Pull封装(长轮询机制)
  • Pull模式注意处理NO_NEW_MSGOFFSET_ILLEGAL状态
  • 两种模式可混合使用(不同消费者实例)

RocketMQ中消费者组的概念

一、基础定义

消费者组是RocketMQ中逻辑上的订阅单元,由多个消费者实例组成,共同消费同一Topic下的消息。关键特性:

// 消费者组声明示例
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("订单处理组");  // ← 这里定义消费者组名

二、核心特性图解

消息
消息
TopicA
ConsumerGroup1
ConsumerGroup2
Consumer1
Consumer2
Consumer3

三、工作模式

  1. 集群模式(CLUSTERING)

    • 同组消费者均分消息(每条消息只被组内一个实例消费)
    • 实现横向扩展负载均衡
    # 消费模式配置
    messageModel=CLUSTERING  # 默认模式
    
  2. 广播模式(BROADCAST)

    • 组内每个消费者收到全量消息
    • 适用于日志收集等场景
    consumer.setMessageModel(MessageModel.BROADCASTING);
    

四、关键机制

  1. 队列分配策略

    • 平均分配(AllocateMessageQueueAveragely)
    • 环形分配(AllocateMessageQueueAveragelyByCircle)
    • 自定义策略(实现AllocateMessageQueueStrategy接口)
    // 设置分配策略
    consumer.setAllocateMessageQueueStrategy(new AllocateMessageQueueAveragely());
    
  2. 消费位点管理

    • 持久化到Broker的consumerOffset.json
    • 支持重置位点(控制台或API操作)
    # 重置消费位点命令
    sh bin/mqadmin resetOffsetByTime -n 127.0.0.1:9876 -g 订单组 -t OrderTopic -s now
    
  3. 重平衡机制

    • 触发条件:
      • 消费者实例增减
      • Topic队列数变化
      • 网络分区恢复
    • 过程耗时通常<1秒(生产环境实测)

五、生产实践要点

  1. 组名规范建议

    业务域_环境_功能
    示例:payment_prod_notify
    
  2. 消费者数量设置

    最优消费者数量 = min(订阅Topic的队列总数, 业务需要的并行度)
    
  3. 异常处理方案

    问题类型解决方案
    单实例堆积增加消费者实例
    全组消费停滞检查网络/重启Broker
    位点丢失通过控制台重置offset

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

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

相关文章

Go语言--语法基础4--基本数据类型--整数类型

整型是所有编程语言里最基础的数据类型。 Go 语言支持如下所示的这些整型类型。 需要注意的是&#xff0c; int 和 int32 在 Go 语言里被认为是两种不同的类型&#xff0c;编译器也不会帮你自动做类型转换&#xff0c; 比如以下的例子会有编译错误&#xff1a; var value2 in…

竞拍商城:电商创新的博弈场与未来趋势

竞拍商城&#xff1a;电商创新的博弈场与未来趋势 在传统电商趋于同质化的今天&#xff0c;竞拍商城凭借其独特的交易机制和用户激励模式&#xff0c;成为电商领域的新宠。通过结合拍卖的博弈属性与电商的便捷性&#xff0c;竞拍商城不仅重塑了消费体验&#xff0c;更催生了全…

Linux : 多线程互斥

目录 一 前言 二 线程互斥 三 Mutex互斥量 1. 定义一个锁&#xff08;造锁&#xff09; 2. 初始化锁 3. 上锁 4. 解锁 5. 摧毁锁 四 锁的使用 五 锁的宏初始化 六 锁的原理 1.如何看待锁&#xff1f; 2. 如何理解加锁和解锁的本质 七 c封装互斥锁 八 可重入…

论文阅读笔记——Reactive Diffusion Policy

RDP 论文 通过 AR 提供实时触觉/力反馈&#xff1b;慢速扩散策略&#xff0c;用于预测低频潜在空间中的高层动作分块&#xff1b;快速非对称分词器实现闭环反馈控制。 ACT、 π 0 \pi_0 π0​ 采取了动作分块&#xff0c;在动作分块执行期间处于开环状态&#xff0c;无法及时响…

swagger 注释说明

一、接口注释核心字段 在 Go 的路由处理函数&#xff08;Handler&#xff09;上方添加注释&#xff0c;支持以下常用注解&#xff1a; 注解名称用途说明示例格式Summary接口简要描述Summary 创建用户Description接口详细说明Description 通过用户名和邮箱创建新用户Tags接口分…

STM32 HAL库 OLED驱动实现

一、概述 1.1 OLED 显示屏简介 OLED&#xff08;Organic Light - Emitting Diode&#xff09;即有机发光二极管&#xff0c;与传统的 LCD 显示屏相比&#xff0c;OLED 具有自发光、视角广、响应速度快、对比度高、功耗低等优点。在嵌入式系统中&#xff0c;OLED 显示屏常被用…

Web开发-JavaEE应用动态接口代理原生反序列化危险Invoke重写方法利用链

知识点&#xff1a; 1、安全开发-JavaEE-动态代理&序列化&反序列化 2、安全开发-JavaEE-readObject&toString方法 一、演示案例-WEB开发-JavaEE-动态代理 动态代理 代理模式Java当中最常用的设计模式之一。其特征是代理类与委托类有同样的接口&#xff0c;代理类…

K8s是常用命令和解释

K8s高频命令 获取资源信息&#xff0c;如获取 Pod、Service、Deployment等资源状态信息 kubectl get创建资源如创建Pod、Service、Deployment等资源 kubectl create删除资源&#xff0c;如删除Pod、Service、Deployment等资源 kubectl delete 应用配置文件&#xff0c;如引用D…

【模态分解】EMD-经验模态分解

算法配置页面&#xff0c;也可以一键导出结果数据 报表自定义绘制 获取和下载【PHM学习软件PHM源码】的方式 获取方式&#xff1a;Docshttps://jcn362s9p4t8.feishu.cn/wiki/A0NXwPxY3ie1cGkOy08cru6vnvc

TDengine 语言连接器(Go)

简介 driver-go 是 TDengine 的官方 Go 语言连接器&#xff0c;实现了 Go 语言 database/sql 包的接口。Go 开发人员可以通过它开发存取 TDengine 集群数据的应用软件。 Go 版本兼容性 支持 Go 1.14 及以上版本。 支持的平台 原生连接支持的平台和 TDengine 客户端驱动支持…

链接世界:计算机网络的核心与前沿

计算机网络引言 在数字化时代&#xff0c;计算机网络已经成为我们日常生活和工作中不可或缺的基础设施。从简单的局域网&#xff08;LAN&#xff09;到全球互联网&#xff0c;计算机网络将数以亿计的设备连接在一起&#xff0c;推动了信息交换、资源共享以及全球化的进程。 什…

AI agents系列之全面介绍

随着大型语言模型(LLMs)的出现,人工智能(AI)取得了巨大的飞跃。这些强大的系统彻底改变了自然语言处理,但当它们与代理能力结合时,才真正释放出潜力——能够自主地推理、规划和行动。这就是LLM代理大显身手的地方,它们代表了我们与AI交互以及利用AI的方式的范式转变。 …

如何使用AI辅助开发CSS3 - 通义灵码功能全解析

一、引言 CSS3 作为最新的 CSS 标准&#xff0c;引入了众多新特性&#xff0c;如弹性布局、网格布局等&#xff0c;极大地丰富了网页样式的设计能力。然而&#xff0c;CSS3 的样式规则繁多&#xff0c;记忆所有规则对于开发者来说几乎是不可能的任务。在实际开发中&#xff0c…

复刻系列-星穹铁道 3.2 版本先行展示页

复刻星穹铁道 3.2 版本先行展示页 0. 视频 手搓&#xff5e;星穹铁道&#xff5e;展示页&#xff5e;&#xff5e;&#xff5e; 1. 基本信息 作者: 啊是特嗷桃系列: 复刻系列官方的网站: 《崩坏&#xff1a;星穹铁道》3.2版本「走过安眠地的花丛」专题展示页现已上线复刻的网…

爬虫:IP代理

什么是代理 代理服务器 代理服务器的作用 就是用来转发请求和响应 在爬虫中为何需要使用代理&#xff1f; 有些时候&#xff0c;需要对网站服务器发起高频的请求&#xff0c;网站的服务器会检测到这样的异常现象&#xff0c;则会讲请求对应机器的ip地址加入黑名单&#xff…

协程的原生挂起与恢复机制

目录 &#x1f50d; 一、从开发者视角看协程挂起与恢复 &#x1f9e0; 二、协程挂起和恢复的机制原理&#xff1a;核心关键词 ✅ suspend 函数 ≠ 普通函数 ✅ Continuation&#xff08;协程的控制器&#xff09; &#x1f527; 三、编译器做了什么&#xff1f;&#xff0…

c++11--std::forwaord--完美转发

std::forword的作用 完美转发的核心目的是保持参数的原始类型&#xff08;包括const/volatile限定符和左值/右值性质&#xff09;不变地传递给其他函数。 为什么需要完美转发 在没有完美转发之前&#xff0c;我们面临以下问题&#xff1a; 模板参数传递中的值类别丢失 当参数…

Linux安装开源版MQTT Broker——EMQX服务器环境从零到一的详细搭建教程

零、EMQX各个版本的区别 EMQX各个版本的功能对比详情https://docs.emqx.com/zh/emqx/latest/getting-started/feature-comparison.html

计算机组成原理-存储器

1. 存储器的定义与作用 存储器是计算机系统中用于存储程序、数据和中间结果的硬件设备&#xff0c;是计算机五大核心部件之一。 核心功能&#xff1a; 提供数据的 临时或永久存储 能力。支持CPU按需快速存取指令和数据&#xff0c;是程序运行的物理基础。 2. 存储器的分类 …

单片机领域中哈希表

以下是单片机领域中哈希表的实际应用及编程实例&#xff1a; 1.哈希表在单片机中的实际应用场景 • 命令解析&#xff1a;在单片机通信中&#xff0c;经常需要解析接收到的命令。使用哈希表可以快速地将命令字符串映射到对应的处理函数&#xff0c;提高命令解析的效率。 • 数…