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

RocketMQ快速实战及核心概念

RocketMQ学习笔记

一、MQ简介

MQ定义

  • MQ:Message Queue,消息队列

  • Message:消息,不同进程之间传递的数据

  • Queue:队列,具有FIFO(先进先出)特性,用于缓存数据

广义上,只要能实现消息跨进程传输队列数据缓存,都可称为消息队列

MQ的作用

  1. 异步

    • 例子:快递员发快递,先放到菜鸟驿站,客户按自己时间取快递
    • 作用:提高系统响应速度、吞吐量
  2. 解耦

    • 例子:《Thinking in JAVA》翻译成其他语言,实现英语与其他语言交流
    • 作用:
      • 服务间解耦,减少相互影响,提高系统稳定性及可扩展性
      • 实现数据分发:生产者发送消息后,可由一个或多个消费者消费,消费者增减对生产者无影响
  3. 削峰

    • 例子:长江涨水,引入三峡大坝储存水,下游稳定排水
    • 作用:以稳定系统资源应对突发流量冲击

二、RocketMQ产品特点

1、RocketMQ介绍

  • 阿里巴巴开源的消息中间件
  • 2016年开源后捐赠给Apache,现为Apache顶级项目
  • 早期使用ActiveMQ,后因IO性能瓶颈转向Kafka,但Kafka不适合阿里业务场景
  • 2012年自研,最早叫MetaQ,后改名RocketMQ
  • 从阿里巴巴双11高并发场景中打磨,适合金融互联网场景

2、RocketMQ特点

产品 优点 缺点 适合场景
Apache Kafka 吞吐量非常大,性能好,集群高可用 有丢数据可能,功能较单一 日志分析、大数据采集
RabbitMQ 消息可靠性高,功能全面 Erlang语言不好定制,吞吐量较低 企业内部小规模服务调用
Apache Pulsar 基于BookKeeper构建,消息可靠性非常高 周边生态有差距,使用公司较少 企业内部大规模服务调用
Apache RocketMQ 高吞吐、高性能、高可用,功能全面,客户端协议丰富,使用Java语言开发方便定制 服务加载较慢 几乎全场景,特别适合金融场景

RocketMQ优势

  • 经历全球最严苛高并发场景(双11)考验
  • 消息吞吐量比Kafka稍低,但比RabbitMQ高很多
  • 阿里内部每天处理请求超5万亿次,支持核心应用超3000个
  • 天生为金融互联网而生,消息可靠性比Kafka高,吞吐量比RabbitMQ高
  • 高级功能全面:广播消费、延迟队列、死信队列等,事务消息领先潮流

三、RocketMQ快速实战

1、快速搭建RocketMQ服务

  • 官网:http://rocketmq.apache.org
  • 下载:https://rocketmq.apache.org/download
  • 版本:5.3.0(推荐最新版,2022年7月发布5.0大版本,重构代码超60%)
  • 注意:4.x版本已于2024年3月停止维护,不建议使用

配置步骤:RocketMQ的后端服务分为nameserver和broker两个服务

  1. 下载运行包(Binary),解压到/app/rocketmq目录
  2. 调整JVM内存配置(学习环境,非生产环境)
    • 修改bin/runserver.sh和runbroker.sh
    • JAVA_OPT="${JAVA_OPT}-server-Xms1g-Xmx1g-Xmn512m-XX:MetaspaceSize=128m-XX:MaxMetaspaceSize=320m"
    • JAVA_OPT="${JAVA_OPT}-server-Xms2g-Xmx2g"
  3. 启动nameserver服务
    • nohup bin/mqnamesrv&
    • 日志确认:The Name Server boot success. serializeType=JSON, address 0.0.0.0:9876
  4. 启动broker服务
    • 配置环境变量:export NAMESRV_ADDR='localhost:9876'
    • nohup bin/mqbroker&
    • 日志确认:The broker[xxxxx] boot success. serializeType=JSON and name server is localhost:9876

常用命令

  • mqshutdown namesrv:关闭nameserver服务
  • mqshutdown broker:关闭broker服务
  • jps:检查服务启动状态

2、快速实现消息收发

1》命令行快速实现消息收发

  • 发送消息

    • bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
    • 默认发送1000条消息
    • 日志示例:SendResult[sendStatus=SEND_OK, msgId=C0A841708122246B179D98C9E31103E6,...]
  • 接收消息

    • bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
    • 消息接收日志:ConsumeMessageThread_please_rename_unique_group_name_4_18 Receive New Messages: [MessageExt[...]]
    • 消费者会持续挂起,等待新消息,用CTRL+C停止

2》Java客户端实现

  • Maven依赖

    <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-client</artifactId><version>5.3.0</version>
    </dependency>
    
  • 消息生产者

    public class Producer {public static void main(String[] args) throws MQClientException, InterruptedException {DefaultMQProducer producer = new DefaultMQProducer("DemoProducer");producer.setNamesrvAddr("192.168.65.112:9876");producer.start();for (int i = 0; i < 2; i++) {try {Message msg = new Message("TopicTest","TagA",("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET));SendResult sendResult = producer.send(msg);System.out.printf("%s%n", sendResult);} catch (Exception e) {e.printStackTrace();Thread.sleep(1000);}}producer.shutdown();}
    }
    
  • 消息消费者

    public class Consumer {public static void main(String[] args) throws InterruptedException, MQClientException {DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("DemoConsumer");consumer.setNamesrvAddr("192.168.65.112:9876");consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET);consumer.subscribe("TopicTest", "*");consumer.registerMessageListener(new MessageListenerConcurrently() {@Overridepublic ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {msgs.forEach(messageExt -> {try {System.out.println("收到消息:" + new String(messageExt.getBody(), RemotingHelper.DEFAULT_CHARSET));} catch (UnsupportedEncodingException e) {}});return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;}});consumer.start();System.out.print("Consumer Started");}
    }
    

3、搭建Java客户端项目

  • 创建标准Maven项目,引入rocketmq-client依赖
  • 实现消息生产者和消费者
  • 重点:生产者和消费者都需要指定nameserver地址
  • 消费者需要订阅具体的Topic,只有发送到该Topic的消息才会被消费

4、搭建RocketMQ可视化管理服务

  • 下载:RocketMQ Dashboard源码(官网下载)
  • 编译
    • mvn clean package -Dmaven.test.skip=true
    • 生成jar包:rocketmq-dashboard-1.0.1-SNAPSHOT.jar
  • 配置
    • 创建application.yml文件,配置namesrv地址
    rocketmq:config:namesrvAddrs:- 192.168.65.112:9876
    
  • 启动
    • java -jar rocketmq-dashboard-1.0.1-SNAPSHOT.jar 1>dashboard.log 2>&1&
  • 访问:http://服务器IP:8080

Dashboard功能

  • 驾驶舱:展示RocketMQ近期运行情况
  • 运维:管理nameserver服务
  • 集群:管理broker服务

5、升级分布式集群

  • 目标:解决单点故障问题,防止数据丢失
  • 架构:主从架构,Master节点响应请求,Slave节点备份数据

集群规划

机器名 nameServer服务部署 broker服务部署
worker1 nameServer
worker2 nameServer broker-a, broker-b-s
worker3 nameServer broker-a-s, broker-b

配置步骤

  1. 在三台服务器上部署nameServer服务
  2. 配置broker集群:
    • 使用2m-2s-async模板(2主2从,异步同步)
    • 配置broker-a(Master):
      brokerClusterName=rocketmq-cluster
      brokerName=broker-a
      brokerId=0
      namesrvAddr=worker1:9876;worker2:9876;worker3:9876
      brokerRole=ASYNC_MASTER
      
    • 配置broker-a-s(Slave):
      brokerClusterName=rocketmq-cluster
      brokerName=broker-a
      brokerId=1
      namesrvAddr=worker1:9876;worker2:9876;worker3:9876
      brokerRole=SLAVE
      
    • 配置broker-b(Master):
      brokerClusterName=rocketmq-cluster
      brokerName=broker-b
      brokerId=0
      namesrvAddr=worker1:9876;worker2:9876;worker3:9876
      brokerRole=ASYNC_MASTER
      

关键配置参数

  • brokerClusterName:集群名,相同名字的节点组成一个集群
  • brokerName:Broker服务名,相同名字的节点组成一组主从
  • brokerId:节点唯一标识,0表示Master,>0表示Slave
  • brokerRole:节点角色,ASYNC_MASTER/SYNC_MASTER/SLAVE
  • namesrvAddr:nameserver地址,分号分隔

6、升级Dledger高可用集群

Dledger集群概述

  • 核心目标:解决主从架构中服务高可用性不足的问题,实现节点角色自动切换。
  • 设计原理
    • 基于 Raft协议 实现分布式一致性。
    • 所有节点通过 随机选举 机制动态决定Leader(Master)和Follower(Slave)角色。
    • 强一致性:确保数据在集群中的同步,避免单点故障导致的消息丢失。
    • 容错能力:只要集群中超过半数节点正常运行,即可提供服务。

Dledger集群配置步骤

1. 环境准备

  • 服务器要求:至少3台服务器(奇数台,保证选举机制的容错性)。

  • 配置示例

    机器名 NameServer地址 Broker配置
    worker1 worker1:9876 RaftNode00 (Leader)
    worker2 worker2:9876 RaftNode00 (Follower)
    worker3 worker3:9876 RaftNode00 (Follower)

2. 配置文件修改

  • 关键配置项
    enableDLegerCommitLog=true  # 启用Dledger功能
    dLegerGroup=RaftNode00      # Raft组名
    dLegerPeers=n0-worker1:40911;n1-worker2:40911;n2-worker3:40911  # 节点列表
    dLegerSelfId=n0             # 当前节点ID
    
  • 存储路径配置
    storePathRootDir=/app/rocketmq/storeDledger/
    storePathCommitLog=/app/rocketmq/storeDledger/commitlog
    

3. 启动Dledger集群

  • 启动命令
    nohup bin/mqbroker -c conf/dledger/broker.conf &
    
  • 验证集群状态
    • 使用 mqadmin clusterList 命令查看节点角色。
    • 通过 Dashboard 检查 Leader/Follower 分布。

4. 故障切换测试

  • 模拟故障
    • 关闭 Leader 节点(如 worker1)。
    • 观察 Raft 协议自动选举新的 Leader(worker2 或 worker3)。
  • 恢复验证
    • 重启原 Leader 节点,验证其重新加入集群后是否降级为 Follower。

Dledger集群优势与局限

  • 优势
    • 高可用:自动角色切换,避免服务中断。
    • 强一致性:Raft 协议保证数据同步。
    • 容错性:支持超过半数节点故障下的持续运行。
  • 局限
    • 性能开销:相比主从架构,写入性能略有下降。
    • 部署复杂度:需严格遵循奇数节点部署原则。

四、总结RocketMQ的运行架构

核心组件与职责

  1. NameServer(命名服务)

    • 作用:独立运行,管理 Broker 和 Topic 的注册信息。
    • 类比:相当于系统的 “CPU”,协调所有组件的通信。
    • 特点
      • 无状态,可水平扩展。
      • 客户端和 Broker 启动时需指定 NameServer 地址。
  2. Broker(核心服务)

    • 作用:负责消息的存储、转发和查询。
    • 类比:相当于系统的 “硬盘” 和 “显卡”,处理核心业务逻辑。
    • 关键功能
      • 消息持久化(CommitLog、ConsumeQueue)。
      • 主从同步(异步/同步模式)。
      • 支持 Dledger 高可用架构。
  3. Client(客户端)

    • 作用:生产者和消费者,负责消息的发送和接收。
    • 类比:相当于系统的 “输入输出设备”,通过 NameServer 和 Broker 协作完成任务。
    • 特点
      • 生产者需指定 NameServer 地址。
      • 消费者需订阅 Topic 并维护消费进度(Offset)。

架构图解

rocketmq消息模型结构

五、理解RocketMQ的消息模型

核心概念

  1. Topic

    • 定义:消息的逻辑分类,如订单、日志等业务类型。
    • 管理
      • 默认需手动创建(生产环境)。
      • 测试环境可通过配置 autoCreateTopic=true 自动创建。
  2. MessageQueue

    • 定义:Topic 下的物理队列,按 FIFO 原则存储消息。
    • 分布
      • 一个 Topic 可包含多个 MessageQueue。
      • MessageQueue 均匀分布到多个 Broker 上,实现负载均衡。
  3. Offset(偏移量)

    • 定义:消息在 MessageQueue 中的唯一标识。
    • 作用
      • 生产者发送消息后,记录当前最大 Offset。
      • 消费者通过 Offset 记录消费进度,确保消息不重复处理。

消息处理流程

  1. 生产者发送消息

    • 根据 Topic 和 MessageQueue 的分布策略(如轮询)选择目标队列。
    • 将消息写入 Broker 的 CommitLog 和 ConsumeQueue。
  2. 消费者消费消息

    • 订阅指定 Topic。
    • 从 MessageQueue 中拉取消息,基于 Offset 记录消费进度。
    • 支持广播模式(所有消费者组消费)和集群模式(消费者组内负载均衡)。
  3. 消息存储结构

    • CommitLog:消息的物理存储文件,顺序写入。
    • ConsumeQueue:消息的逻辑索引文件,记录 MessageQueue 中消息的 Offset 和大小。

与 Kafka 的对比

特性 RocketMQ Kafka
Topic 支持 高并发下性能更优,适合金融场景 Topic 过多时性能下降
消息可靠性 强一致性,适合对可靠性要求高的场景 弱一致性,优先保证可用性
消费者组管理 消费者组进度独立,支持广播模式 消费者组进度共享,仅支持集群模式
高可用架构 Dledger + Raft 协议 多副本 + ISR 机制

六、章节总结:RocketMQ 快速实战与核心概念详解

核心知识点回顾

  1. MQ 的作用

    • 异步:提高系统响应速度和吞吐量。
    • 解耦:降低服务间依赖,提升稳定性。
    • 削峰:应对突发流量冲击,保护系统资源。
  2. RocketMQ 的优势

    • 高吞吐:适合大规模消息处理。
    • 高可靠性:金融场景下的消息不丢失保障。
    • 功能全面:支持延迟队列、死信队列、事务消息等高级特性。
  3. 快速实战步骤

    • 搭建单机环境:NameServer + Broker。
    • Java 客户端集成:生产者/消费者代码示例。
    • 部署可视化管理(Dashboard)。
    • 构建分布式集群(主从架构 + Dledger 高可用)。
  4. 核心概念

    • Topic 与 MessageQueue:消息的逻辑分类与物理存储。
    • Offset 与消费组:确保消息消费的顺序性和幂等性。
    • Dledger 集群:通过 Raft 协议实现高可用。

后续学习建议

  1. 深入 RocketMQ 内核

    • 学习 CommitLog 和 ConsumeQueue 的底层实现。
    • 掌握 Dledger 的 Raft 协议细节(如选举、日志复制)。
  2. 高级功能实践

    • 实现事务消息、延迟队列、死信队列。
    • 优化生产环境配置(JVM 调优、磁盘 I/O 优化)。
  3. 对比其他 MQ 产品

    • 对比 Kafka、RabbitMQ 的设计差异,选择适合业务场景的 MQ。

关键提示

  • 生产环境建议
    • 避免使用 autoCreateTopic=true,提前规划 Topic。
    • 使用 Dledger 集群时确保奇数节点部署。
    • 定期监控 Dashboard,关注 Broker 和消费者组状态。

相关文章:

RocketMQ快速实战及核心概念

RocketMQ学习笔记 一、MQ简介 MQ定义MQ:Message Queue,消息队列Message:消息,不同进程之间传递的数据Queue:队列,具有FIFO(先进先出)特性,用于缓存数据广义上,只要能实现消息跨进程传输及队列数据缓存,都可称为消息队列MQ的作用异步例子:快递员发快递,先放到菜鸟驿站…...

【南方科技大学主办】第五届电气工程与机电一体化手艺国际学术会议(ICEEMT 2025)

【南方科技大学主办】第五届电气工程与机电一体化手艺国际学术会议(ICEEMT 2025)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &qu…...

为什么不建议在 Docker 中跑 MySQL?

前言 今天我们来聊聊一个很有趣的话题:为什么我不建议在Docker中运行MySQL数据库? 有些小伙伴在工作中可能为了部署方便,习惯将所有组件都容器化,但数据库真的适合放在容器里吗? 今天就专门跟大家一起聊聊这个话题,希望对你会有所帮助。 一、容器化与数据库:天生的矛盾?…...

reLeetCode 热题 100-1 指针283. 移动零 - MKT

reLeetCode 热题 100-1 指针283. 移动零 class Solution { public:void moveZeroes(vector<int>& nums) {// int cout_=0;// for(int i =0; i<nums.size();i++){// if(nums[i]==0){// cout_++;// }// }// std::cout<< " 0s all …...

解决c# DocX生成的word文档wps打开排版外边距错乱微软office正常问题

public void insertBreak(DocX document, String filename) { DocX tempDocx = DocX.Create(filename); setPageMargin(tempDocx); document.InsertDocument(tempDocx);document.InsertSectionPageBreak(true); }改为public vo…...

The 2025 ICPC Asia East Continent Online Contest (II)

The 2025 ICPC Asia East Continent Online Contest (II)比赛链接 Review 这场非常有参与感哈哈,因为我签到题 C 贪心写了两小时,中间下机若干次让队友过题,写完已经完全不知道队友进度是啥了,后续就当小黄鸭被带飞了哈哈。 Solution C. Jiaxun! 那我确实需要 jiaxun 额额贪…...

工厂方法模式(Factory Method) - 指南

工厂方法模式(Factory Method) - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !importa…...

拾忆录

████,也即言多██,就是少点██,不容易发生██——来自于多种████的通理 择一███,遇一人██——收集自███,████ 知行合一心学理论——王阳明...

从零搭建RAG应用:跳过LangChain,掌握文本分块、向量检索、指代消解等核心技术实现

RAG(检索增强生成)本质上就是给AI模型外挂一个知识库。平常用ChatGPT只能基于训练数据回答问题,但RAG可以让它查阅你的专有文档——不管是内部报告、技术文档还是业务资料,都能成为AI的参考资源。 很多人第一反应是用LangChain或LlamaIndex这些现成框架,确实能快速搭起来。…...

python高阶技巧

闭包:在函数嵌套前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数叫做闭包 简单闭包: def outer(logo): def inner(msg): print(f"<{logo}>{msg}>{logo}") return inner fn1=outer("黑马程…...

机器视觉之图像处理篇 - 指南

机器视觉之图像处理篇 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-s…...

尝试hikari和jdbctemplate

试着基于jdbctemplate包装一个MysqlHelper类。连接池采用springboot默认的hikari。jdbctemplate提供基本的防注入,它的写法比jdbc好看,jdbc还需要putint,putstr。提供的另一个功能是结果集的转换。写完,测试代码的面貌如下:var sqlhp = new SqlHelper();sqlhp.configAddress…...

配置Nginx根据IP地址进行流量限制以及返回JSON格式数据

要在Nginx中根据IP地址进行流量限制并返回JSON格式数据,你需要结合Nginx的 ngx_http_limit_req_module模块和一些配置技巧。这个模块允许你基于定义的键值,比如IP地址,限制请求的速率。不过在进入细节前,别忘了备份你的Nginx配置文件 划重点:配置透视战斗护甲 (limit_req_…...

回归

最近因为████导致██发生████,长期的██也不是办法,我决定以███████发文。 我的很多比如███,███都发生了██,所以██的██████视█。 重新██...

CSS纯文本渐变动效

创建一个令人印象深刻的CSS文本渐变动效就像是在文字上施展魔法。想象你的文字就像是一幅幻灯片,色彩在背后流转,让每个字母都像是被彩虹绘制过一样。 为了让这种魔法发生,你需要进入CSS的巫术领地。我们将把渐变动效的制作分解为简单步骤,这样即使你不是CSS的大师,也能轻…...

泛微流程共享

第一步: 第二步:打开合同审批数据,点击右键,选择共享。 第三步:共享权限的查看,可见Giada没有查看权限。 第四步:添加权限,依次进入下面的选项。...

MySQL报错:未知系统变量tx_isolation及隔离级别查询

MySQL在其各个版本中进行了诸多变更和优化,包括系统变量、参数命名、功能等方面的调整。在这个情况中,遇到“未知系统变量tx_isolation”这个错误是因为在MySQL 8.0及以后的版本中,系统变量 tx_isolation已经被重命名为 transaction_isolation。 如果你像老朋友一样寻找 tx_…...

Redssion

1.使用 // 设置锁定资源名称 RLock disLock = redissonClient.getLock("DISLOCK"); //尝试获取分布式锁 boolean isLock= disLock.tryLock(500, 15000, TimeUnit.MILLISECONDS); if (isLock) {try {//TODO if get lock success, do something;Thread.sleep(15000);} …...

if __name__ == __main__:

if __name__ == "__main__": 是 Python 中的一个标准代码块,用于检查一个脚本是否是直接运行的。 工作原理 当一个 Python 脚本被解释器执行时,它会自动定义一些特殊变量。其中一个就是 __name__。如果脚本是直接运行的,Python 会将 __name__ 变量的值设置为 &quo…...

提升系统可靠性:Air8000多串口硬件设计的黄金法则

串口通信的可靠性直接影响工业系统的连续性。Air8000以多串口工业级连接力赋能设备互联,而硬件设计则是其可靠性的根基。总结黄金法则,从信号隔离、阻抗匹配到热设计,全方位保障串口通信的稳定性与安全性。 本文主要从硬件设计的角度,分享串口设计中的一些关键注意点,软件…...

20250915笔记

svn 版本控制工具 一、svn介绍 二、svn安装 1、下载客户端和服务端 安装流程: (1)先安装服务端 (2)在服务端创建仓库 (3)新建用户,新建用户组 (4)设置权限,服务端安装成功 (5)安装客户端(也叫小乌龟) (6)安装桌面右键连接仓库 (7)输入账号和密码 (8)连接…...

enumerate函数

enumerate() 是 Python 中一个非常实用的内置函数,它用于在遍历一个可迭代对象(如列表、元组、字符串等)的同时,获取每个元素的索引和值。 为什么需要 enumerate()? 在没有 enumerate() 之前,如果你想同时获取索引和值,通常需要手动维护一个计数器: fruits = [apple, b…...

2025国内 HR SaaS 竞争格局:易路以AI深度融合引领行业转型

在中国企业数智化转型的浪潮中,HR SaaS 市场正经历从基础数字化向智能协同的关键跃迁。随着全球化布局与本地化合规要求的双重驱动,中大型企业对人力资源管理系统的需求已从单一模块效率提升转向全流程智能协同与全球合规管理。截至 2025 年,中国 HR SaaS 市场规模已突破 30…...

HyperWorks许可激活

在工程项目中,高效的软件工具是成功的关键。而一个顺畅的许可激活流程,则是确保这些工具能够迅速投入使用的重要环节。HyperWorks,作为一款领先的工程仿真软件,以其快速、简便的许可激活流程,为用户提供了卓越的使用体验。 一、一键激活,轻松上手 HyperWorks的许可激活流…...

f-string用法

在 Python 3.6 及更高版本中,在字符串前加上一个 f,表示这是一个 f-string(格式化字符串字面量)。 f-string 的主要作用是让你在字符串中嵌入 Python 表达式,使得格式化字符串变得非常简洁和直观。 f-string 的基本用法 你只需要在字符串开头加上 f,然后在字符串内部用花…...

OpenStack Nova instance 常见操作

1. 启动实例(start) 场景:启动处于 SHUTOFF 状态的实例 源码路径:API 层:nova/compute/api.py → start() RPC 层:nova/compute/rpcapi.py → start_instance() 执行层:nova/compute/manager.py → start_instance() 驱动层:nova/virt/libvirt/driver.py → power_on()…...

libdpi.dll libdatareport.dll libdash_plugin.dll libcurl-x86.dll libcurl-x64.dll libcurl_x64.dll - 指南

libdpi.dll libdatareport.dll libdash_plugin.dll libcurl-x86.dll libcurl-x64.dll libcurl_x64.dll - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…...

理解 Kubernetes CSI

关于 Kubernetes CSI,现在的资料已经不少,但我仍希望有一篇文档能让人轻松但不失准确地理解 CSI。 本文不涉及代码分析和详细设计。但需要如下基础:会使用至少一种容器,Docker,containerd,Kata 之类的都可以。 protobuf 和 gRPC:会用并有少量的开发经验,会用某种语言(…...

9.15

开学...

常用数学定理公式

二项式定理 \[(x + y)^n = \sum_{k=0}^n \binom{n}{k} x^{n-k} y^k \]...

线性规划

线性规划是求一个线性函数在满足一组线性等式或不等式方程条件下极值的一类数学问题的统称。要求目标函数和约束方程必须是线性函数。隐含了如下假定:  比例性假定:决策变量的变化与资源消耗成比例;  可加性假定:每个决策变量的影响独立于其他变量;  连续性假定:决…...

伪代码学习总结

伪代码学习总结 1. 什么是伪代码伪代码(Pseudocode) 是一种 算法描述语言。它既不同于自然语言(太模糊),也不是某种具体编程语言(太依赖语法)。使用伪代码的目的:使被描述的算法可以容易地翻译成任何一种编程语言(如 Pascal, C, Java, Python 等); 要求 结构清晰、可…...

20号胶 2511

...

9.13linux系统命令

Linux2系统命令 1、df 查看磁盘使用情况 (1)df 查看磁盘使用情况 Filesystem:代表该文件系统时哪个分区,所以列出的是设备名称。 1K-blocks:说明下面的数字单位是1KB,可利用-h或-m来改变单位大小,也可以用-B来设置。 Used:已经使用的空间大小。Available:剩余的空间…...

9.15 svn git

svn版本控制工具 一、svn介绍 SVN是subversion的简称 是一个开放源代码的版本控制系统,通过采用分支管理系统的高 效管理,简而言之就是用于多个人共同开发同一个项目,实现共 享资源,实现最终集中式的管理。 SVN的作用:在项目组当中对需求规格说明书、测试用例、产品 说明书…...

PVC2601

...

利用RabbitMQ与Redis实现消息的延迟传递的策略

RabbitMQ:时间控的快递中心 让我们从RabbitMQ开始,RabbitMQ拥有一个叫做“Dead Letter Exchanges”(DLX)的机制,这个机制基本上就是一个失物招领处。当一个消息未能及时被送达,RabbitMQ会将它转移至DLX。这个DLX与一个或多个队列关联,这样就能处理这些失去方向的消息了。…...

python 按excel的经纬度提取对应栅格tif文件的数值

栅格文件 批量处理代码:# -*- coding:utf-8 -*- """ @author: suyue @file: extract_stations_from_excel.py @time: 2025/09/09 @desc: 从Excel读取站点信息并提取所有站点的CTT值 """ import rasterio import numpy as np import pandas as p…...

麒麟

麒麟点击跳转...

实现我的第一个本地文档问答机器人

本地文档问答机器人 下面是一个完整的本地文档问答机器人实现,涵盖了阶段三的所有核心概念:文档加载、文本分割、向量存储和检索增强生成(RAG)。 完整代码实现 import os.path from typing import Listfrom huggingface_hub import snapshot_download from langchain.chain…...

17、逻辑回归与分类评估 - 从连续到离散的智能判断 - 教程

17、逻辑回归与分类评估 - 从连续到离散的智能判断 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", m…...

关于32位单片机使用lwip无法访问(ping)外网,只能与同网段设备进行通信的问题解决

核心问题:MAC地址 理论依据:MAC地址是有相应的规范的MAC地址中,前3字节为组织唯一标识符,后24位由厂家自行定义。也就是说前3字节是有规定的,其中前3字节MAC中的前几位也是有着对应的含义的。MAC地址详细的介绍,大家可以在网上搜得到 出现这个问题的核心就是网关对设备mac地…...

044-WEB攻防-PHP应用SQL盲注布尔回显延时判断报错处理增删改查方式

044-WEB攻防-PHP应用&SQL盲注&布尔回显&延时判断&报错处理&增删改查方式 1.演示案例:➢PHP-MYSQL-SQL操作-增删改查 ➢PHP-MYSQL-注入函数-布尔&报错&延迟 ➢PHP-MYSQL-注入条件-数据回显&错误处理 ➢PHP-MYSQL-CMS案例-插入报错&删除延迟…...

多品牌摄像机视频平台EasyCVR海康大华宇视视频平台统一接入方案

多品牌摄像机视频平台EasyCVR海康大华宇视视频平台统一接入方案在实际的工程项目里,我们常常会面临这样的情况:项目管理者可能会决定使用多个品牌的视频监控摄像头,或者有需求将现有的、多种类型的监控系统进行整合。现在,让我们来探讨一下如何实现不同品牌摄像头的连接和使…...

离散数学课堂习题及课后习题 - PPX

课上的习题,不完整,有空再更新第二章 抽屉原理 Background: 简单形式: 把(n+1)个物体放入n个盒子,必有一个盒子中装了两个物体。其实这个也是狄利克雷描述的一个特殊的表述(如果对于一个映射$ X\to Y $ ,如果\(|X|>|Y|\),则\(f\)不可能是单射,也就是会有\(f(x_1)=f(x…...

玻璃2601

前期五浪下跌走完了 开启反弹...

GoFrame框架查询数据表时对字段取别名

两种方式,基于模型的Fields方法dao.User.Where("id",1).Fields("name as `nickname`","id as `uid`").All()基于结构体orm标签的映射关系type UserData struct {Uid int `json:"id" orm:"id"`Nickname string `json:"…...

ubuntu安装mysql矩阵

安装mysql 5.7版本ubuntu版本    mysql版本    xtrabackup版本    ldd显示GLIBC版本    依赖库处理方式18.04       5.7.42      2.4.28        2.27          不需要处理20.04      5.7.42      2.4.28        …...

二十、DevOps落地:Jenkins基础入门(一)

二十、DevOps落地:Jenkins基础入门(一) 目录二十、DevOps落地:Jenkins基础入门(一)1、DevOps初识1.1 什么是DevOps1.2 DevOps相关工具链1.3 什么是CICD?1.4 持续集成CI介绍1.5 持续交付和持续部署CD介绍1.6 什么是Pipeline(流水线)?1.7 Pipeline编排任务的优势1.8 Pi…...

ubuntu 22.04安装mysql5.7

环境Os:ubuntu 22.04 desktop桌面版mysql:mysql-5.7.42-linux-glibc2.12查看操作系统信息root@db:~# ldd --version ldd (Ubuntu GLIBC 2.35-0ubuntu3) 2.35 Copyright (C) 2022 Free Software Foundation, Inc. This is free software; see the source for copying conditions…...