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

202528 | RabbitMQ-高级 | 消息可靠性 | 业务幂等性 | 延迟消息

消息可靠性

RabbitMQ发送者可靠性

一、发送者重连机制
1. 网络中断
2. 自动重连
3. 恢复发送
4. 超过阈值
生产者
检测连接
重试策略
Broker
降级处理
1. 核心配置(application.yml)
spring:rabbitmq:addresses: rabbit1:5672,rabbit2:5672 # 集群地址connection-timeout: 5000    # 连接超时(ms)template:retry:enabled: true           # 启用重试max-attempts: 3         # 最大重试次数initial-interval: 1000  # 初始间隔(ms)multiplier: 2           # 间隔乘数
2. 高级重连配置(Java Config)
@Bean
public CachingConnectionFactory connectionFactory() {CachingConnectionFactory factory = new CachingConnectionFactory();factory.setHost("cluster.rabbitmq.cn");// 重连关键参数factory.setAutomaticRecoveryEnabled(true);  // 自动恢复factory.setNetworkRecoveryInterval(5000);   // 5秒重试间隔factory.setRequestedHeartbeat(30);          // 30秒心跳// 异常处理器factory.setRecoveryListener(new RecoveryListener() {@Overridepublic void handleRecovery(Recoverable recoverable) {log.info("连接已恢复");}@Overridepublic void handleRecoveryStarted(Recoverable recoverable) {log.warn("开始重连...");}});return factory;
}
3. 重连过程示意图
Producer Broker 建立连接 网络中断 连接断开 等待5秒(RecoveryInterval) 第一次重连 连接恢复 等待10秒(interval*multiplier) 第二次重连 alt [成功] [失败] Producer Broker

二、发送者确认机制
1. 发送消息
2. 返回ACK
3. 返回NACK
4. 不可路由
生产者
Broker
ReturnCallback
1. 确认模式配置
@Configuration
public class RabbitConfirmConfig {@Beanpublic RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {RabbitTemplate template = new RabbitTemplate(connectionFactory);// 1. 启用Confirm模式connectionFactory.setPublisherConfirmType(CachingConnectionFactory.ConfirmType.CORRELATED);// 2. 设置Confirm回调template.setConfirmCallback((correlationData, ack, cause) -> {if (ack) {metricService.increment("mq.ack.success");} else {log.error("消息未确认 ID: {}, 原因: {}", correlationData.getId(), cause);retryQueue.add(correlationData);}});// 3. 启用Return回调template.setMandatory(true);template.setReturnsCallback(returned -> {log.warn("消息不可路由: {}", returned.getMessage());deadLetterService.save(returned);});return template;}
}
2. 消息发送示例
@Service
public class OrderSenderService {@Autowiredprivate RabbitTemplate rabbitTemplate;public void sendOrder(Order order) {// 1. 构建唯一IDCorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());// 2. 发送消息(携带correlationData)rabbitTemplate.convertAndSend("order.exchange", "order.create", order,message -> {// 添加自定义头message.getMessageProperties().setHeader("retry-count", 0);return message;},correlationData);}
}
3. 确认流程示意图
Producer Broker 发送消息(携带correlationId) 返回ACK 更新发送状态 返回NACK 触发重试机制 alt [Broker接收成功] [Broker处理失败] 触发ReturnCallback 记录死信消息 alt [消息不可路由] Producer Broker

三、生产级完整方案
1. 消息状态追踪设计
public class MessageTracker {private static final ConcurrentMap<String, MessageRecord> records = new ConcurrentHashMap<>();public static void track(String messageId, Message message) {records.put(messageId, new MessageRecord(message, System.currentTimeMillis()));}public static void confirm(String messageId) {records.get(messageId).confirm();}@Scheduled(fixedRate = 60000)public void checkTimeoutMessages() {records.values().stream().filter(r -> !r.isConfirmed() && r.isTimeout()).forEach(this::resend);}
}
2. 混合可靠性配置
spring:rabbitmq:# 连接配置addresses: rabbit1:5672,rabbit2:5672connection-timeout: 10000# 发送者确认publisher-confirm-type: correlatedpublisher-returns: true# 模板配置template:mandatory: trueretry:enabled: truemax-attempts: 3
3. 异常处理流程图
网络异常
Broker拒绝
路由失败
<3次
>=3次
发送消息
是否成功?
记录成功指标
错误类型?
触发重连机制
记录NACK原因
触发Return回调
重试次数?
进入死信队列

RabbitMQ 中消息队列可靠性:


一、数据持久化(Message Durability)
1. 核心概念

数据持久化是 RabbitMQ 防止消息丢失的基础机制,通过将消息和元数据写入磁盘,确保 Broker 重启后数据不丢失。

持久化消息
写入磁盘
重启恢复
Producer
Broker
持久化存储
2. 持久化三要素
组件配置方式注意事项
交换机持久化new DirectExchange("ex", true, false)第二个参数 durable=true
队列持久化new Queue("q", true, false, false)第一个参数 durable=true
消息持久化MessageProperties.PERSISTENT_TEXT_PLAIN或设置 deliveryMode=2
3. Spring Boot 配置示例
// 持久化交换机
@Bean
public DirectExchange durableExchange() {return new DirectExchange("order.direct", true, false);
}// 持久化队列
@Bean
public Queue durableQueue() {return new Queue("order.queue", true, false, false);
}// 发送持久化消息
rabbitTemplate.convertAndSend("exchange", "key", message, msg -> {msg.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);return msg;
});
4. 持久化性能影响
模式写入速度吞吐量示例(单节点)适用场景
非持久化极快 (~50k/s)50,000 msg/s实时日志、监控数据
持久化中等 (~5k/s)5,000 msg/s订单、支付等关键业务

二、Lazy Queue(惰性队列)
1. 设计目的

解决内存溢出风险,通过将消息直接写入磁盘而非内存,适用于:

  • 高吞吐但低优先级的消息(如日志)
  • 可能产生消息堆积的场景
消息
直接写入
按需加载
Producer
Lazy Queue
磁盘
Consumer
2. 核心特性
特性普通队列Lazy Queue
消息存储位置内存 + 磁盘(溢出时)直接写入磁盘
内存占用极低
吞吐量中等
适用场景实时业务非关键业务/消息堆积
3. 配置方式
声明时指定(推荐)
@Bean
public Queue lazyQueue() {Map<String, Object> args = new HashMap();args.put("x-queue-mode", "lazy"); // 关键参数return new Queue("lazy.queue", true, false, false, args);
}
策略批量设置
# 将所有队列设为lazy模式
rabbitmqctl set_policy Lazy "^lazy\." '{"queue-mode":"lazy"}' --apply-to queues
4. 性能对比测试
指标普通队列Lazy Queue
内存占用(10万条)500MB50MB
写入速度8,000 msg/s3,000 msg/s
读取延迟<1ms5-10ms

三、生产环境最佳实践
1. 混合使用场景
60% 30% 10% 队列类型分配比例 持久化+普通队列 持久化+Lazy队列 非持久化队列
2. 监控指标建议
指标检测命令告警阈值
持久化消息未确认数rabbitmqctl list_queues name messages_unacknowledged>1000
Lazy队列磁盘使用量df -h /var/lib/rabbitmq>80%
内存使用率rabbitmqctl node_status>70%
3. 容灾方案设计
// 高可用组合方案
@Bean
public Queue highReliabilityQueue() {Map<String, Object> args = new HashMap<>();args.put("x-queue-mode", "lazy"); // 防内存溢出args.put("x-message-ttl", 86400000); // 24小时TTLargs.put("x-dead-letter-exchange", "dlx"); // 死信处理return new Queue("order.backup", true, false, false, args); // 持久化
}

四、常见问题解决方案
1. 持久化消息性能低下
  • 优化方案
    spring:rabbitmq:template:channel-cache-size: 32  # 增加通道缓存listener:direct:prefetch: 100         # 提高预取值
    
2. Lazy Queue消费延迟
  • 优化方案
    // 增加消费者并发
    @RabbitListener(queues = "lazy.queue", concurrency = "5")
    public void handleLazyMessage(Message msg) {// 处理逻辑
    }
    
3. 磁盘空间不足
  • 应急处理
    # 临时切换存储路径
    rabbitmqctl set_disk_free_limit 5GB
    rabbitmqctl stop_app
    rabbitmqctl reset
    rabbitmqctl start_app
    

通过合理结合 数据持久化Lazy Queue,可以实现:

  • 关键业务消息零丢失(持久化保障)
  • 突发流量下的系统稳定性(Lazy Queue防内存溢出)
  • 资源使用的智能平衡(根据业务特性混合配置)

RabbitMQ消费者可靠性全面指南

一、消费者确认机制(ACK/NACK)
1. 确认模式工作流程
Broker Consumer App 投递消息 (deliveryTag=7) 执行业务逻辑 返回成功 basicAck(7, false) 删除消息 抛出异常 basicNack(7, false, true) 消息重新入队 alt [处理成功] [处理失败] Broker Consumer App
2. ACK模式类型对比
模式类型配置值触发时机可靠性性能适用场景
自动确认none消息推送给消费者后立即确认(无论业务是否处理成功)日志/监控等非关键数据
手动确认manual需显式调用channel.basicAck()basicNack()订单/支付等关键业务
条件确认需自定义实现根据业务处理结果决定是否确认最高金融级严格一致性场景
3. 手动ACK最佳实践代码
@RabbitListener(queues = "orders")
public void handleOrder(Order order, Channel channel,@Header(AmqpHeaders.DELIVERY_TAG) long tag) throws Exception {try {// 业务处理orderService.process(order);// 成功确认channel.basicAck(tag, false); } catch (BusinessException e) {// 业务异常:重试channel.basicNack(tag, false, true);} catch (Exception e) {// 系统异常:死信队列channel.basicNack(tag, false, false);}
}
二、失败重试与恢复机制
1. 重试策略流程图解
Republish
Custom
开始消费
处理成功?
发送ACK
重试次数 < max-attempts?
等待interval
重新消费
触发MessageRecoverer
Recoverer类型?
转发到DLX
记录到数据库
. 消息恢复器实现方案
@Bean
public MessageRecoverer customRecoverer() {// 方案1:转发到死信交换机return new RepublishMessageRecoverer(rabbitTemplate, "dlx.exchange", "error");// 方案2:自定义处理return (message, cause) -> {errorRepository.save(new ErrorLog(message, cause));alertService.notifyAdmin(cause);};
}
三、生产环境配置方案
1. 完整配置模板
spring:rabbitmq:listener:simple:acknowledge-mode: manualprefetch: 50retry:enabled: truemax-attempts: 3initial-interval: 1000msmultiplier: 2max-interval: 10sstateless: falsemessage-recoverer: customRecoverer
2. 异常处理决策树
消息处理失败
可重试错误?
间隔重试
是业务错误?
记录到DB+告警
进入DLQ
达到最大重试?
四、高级场景解决方案
1. 顺序消息保障方案
@RabbitListener(queues = "sequential.queue")
public void handleSequential(Order order, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) {// 获取分布式锁Lock lock = redissonClient.getLock("order:"+order.getId());try {lock.lock();orderService.process(order);channel.basicAck(tag, false);} finally {lock.unlock();}
}
2. 消息积压应急方案
发现积压
扩容消费者
启用批量消费
临时关闭ACK
监控水位
五、监控与告警
关键监控指标
指标检测方式告警阈值
未ACK消息数rabbitmqctl list_queues messages_unacknowledged>50 (持续5分钟)
死信队列堆积rabbitmqctl list_queues messages_persistent dlx.queue>1000

RabbitMQ业务幂等性实现方案详解

一、幂等性核心概念

在消息队列系统中,业务幂等性是指:

  1. 重复消费同一条消息不会导致业务数据错误
  2. 多次处理相同请求与单次处理效果一致
  3. 系统状态变更只发生一次
收到消息
是否已处理?
丢弃/记录日志
执行业务操作
标记处理状态

二、实现方案对比

方案类型实现复杂度可靠性适用场景性能影响
唯一ID通用场景
业务状态检查有状态业务
数据库约束最高金融交易
乐观锁并发写场景

三、具体实现方案

1. 消息ID去重方案

生产者配置:

// 发送消息时添加唯一ID
MessageProperties props = new MessageProperties();
props.setHeader("msg_id", UUID.randomUUID().toString());
Message message = new Message(body, props);
rabbitTemplate.send(exchange, routingKey, message);

消费者实现:

@RabbitListener(queues = "order.queue")
public void handleOrder(Message message) {String msgId = message.getMessageProperties().getHeader("msg_id");// Redis原子操作实现Boolean isNew = redisTemplate.opsForValue().setIfAbsent("msg:" + msgId, "1", 24, TimeUnit.HOURS);if(Boolean.FALSE.equals(isNew)) {log.warn("重复消息已忽略: {}", msgId);return;}orderService.process(message.getBody());
}
2. 业务状态检查方案
public void processPayment(PaymentMessage message) {PaymentRecord record = paymentDao.findByOrderId(message.getOrderId());// 状态检查if(record != null && record.getStatus() == PaymentStatus.SUCCESS) {log.info("订单{}已支付,跳过处理", message.getOrderId());return;}// 执行业务逻辑boolean result = paymentGateway.charge(message);paymentDao.save(new PaymentRecord(message, result));
}
3. 数据库幂等方案

建表SQL:

CREATE TABLE transactions (id VARCHAR(64) PRIMARY KEY,order_id BIGINT UNIQUE,status VARCHAR(20),created_at TIMESTAMP
);

JPA实现:

@Transactional
public void processTransaction(TransactionMessage message) {// 先检查后插入if(transactionRepository.existsById(message.getTxId())) {return;}// 使用数据库唯一约束try {transactionRepository.save(new Transaction(message.getTxId(),message.getOrderId(),"PROCESSING"));// 业务处理...} catch (DataIntegrityViolationException e) {log.warn("重复交易: {}", message.getTxId());}
}

四、生产环境最佳实践

1. 复合幂等策略
public void handleOrder(OrderMessage message) {// 第一层:消息ID检查if(idempotentService.isMessageProcessed(message.getId())) {return;}// 第二层:业务状态检查Order order = orderService.getOrder(message.getOrderId());if(order.isPaid()) {return;}// 第三层:数据库乐观锁try {orderService.processWithLock(order);} catch (OptimisticLockingFailureException e) {log.error("并发处理订单: {}", order.getId());}
}
2. 异常处理方案
可重试
不可重试
消息消费
是否幂等?
正常处理
错误类型?
进入重试队列
进入死信队列
记录处理状态
3. 监控指标设计
指标名称计算方式告警阈值
重复消息率重复消息数/总消息数>1%
幂等拦截次数计数器统计突增50%
处理耗时成功处理平均时间>500ms

五、常见问题解决方案

1. Redis宕机时的降级方案
public boolean checkMessageId(String msgId) {try {// 优先使用Redisreturn redisTemplate.opsForValue().setIfAbsent(msgId, "1", 24, HOURS);} catch (Exception e) {// 降级到数据库检查return !messageLogRepository.existsById(msgId);}
}
2. 分布式锁实现
public void processWithLock(String orderId) {Lock lock = redissonClient.getLock("order:" + orderId);try {if(lock.tryLock(3, 30, TimeUnit.SECONDS)) {// 临界区代码orderService.process(orderId);}} finally {lock.unlock();}
}
3. 消息追溯方案
@Aspect
public class MessageTraceAspect {@AfterReturning("execution(* com..*Listener.*(..)) && args(message)")public void afterMessage(Message message) {auditService.record(message.getMessageProperties().getHeader("msg_id"),"PROCESSED",LocalDateTime.now());}
}

RabbitMQ延时消息实现方案

一、核心实现方案对比

方案类型实现原理精度复杂度适用场景
死信队列消息TTL+DLX分钟级简单延时场景
插件方案官方延时插件秒级生产环境推荐
外部调度数据库+定时任务秒级复杂延时规则

二、死信队列方案实现(原生支持)

1. 架构设计
消息过期
生产者
普通队列: order.queue
死信交换机: dlx.exchange
死信队列: delay.queue
消费者
2. 具体实现代码

配置声明:

@Configuration
public class DelayQueueConfig {// 死信交换机@Beanpublic DirectExchange dlxExchange() {return new DirectExchange("dlx.exchange");}// 死信队列@Beanpublic Queue delayQueue() {return new Queue("delay.queue");}// 业务队列(设置死信参数)@Beanpublic Queue businessQueue() {Map<String, Object> args = new HashMap<>();args.put("x-dead-letter-exchange", "dlx.exchange");args.put("x-dead-letter-routing-key", "delay.key");return new Queue("order.queue", true, false, false, args);}// 绑定关系@Beanpublic Binding dlxBinding() {return BindingBuilder.bind(delayQueue()).to(dlxExchange()).with("delay.key");}
}

发送延时消息:

public void sendDelayMessage(Order order, int delayMinutes) {// 设置消息属性MessageProperties props = new MessageProperties();props.setExpiration(String.valueOf(delayMinutes * 60 * 1000)); // 毫秒// 发送消息rabbitTemplate.convertAndSend("order.queue", new Message(order.toString().getBytes(), props));
}

三、RabbitMQ插件方案(推荐方案)

1. 安装延时插件
# 下载插件(版本需匹配)
wget https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases/download/3.11.1/rabbitmq_delayed_message_exchange-3.11.1.ez# 启用插件
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
2. 具体实现代码

配置延时交换机:

@Bean
public CustomExchange delayExchange() {Map<String, Object> args = new HashMap<>();args.put("x-delayed-type", "direct");return new CustomExchange("delayed.exchange", "x-delayed-message", true, false, args);
}

发送延时消息:

public void sendDelayMessage(Order order, int delaySeconds) {rabbitTemplate.convertAndSend("delayed.exchange","order.routing.key",order,message -> {message.getMessageProperties().setHeader("x-delay", delaySeconds * 1000);return message;});
}

四、完整订单超时关闭案例

1. 业务场景
  • 订单创建后30分钟未支付自动关闭
  • 支付成功后取消延时任务
2. 实现方案设计
用户 订单服务 RabbitMQ 支付服务 创建订单 发送延时消息(30分钟) 完成支付 支付回调 删除延时消息 投递延时消息 关闭订单 alt [超时未支付] 用户 订单服务 RabbitMQ 支付服务
3. 关键代码实现

订单服务生产者:

public class OrderService {@Autowiredprivate RabbitTemplate rabbitTemplate;public void createOrder(Order order) {// 保存订单orderRepository.save(order);// 发送延时消息(插件方案)rabbitTemplate.convertAndSend("delayed.exchange","order.close",order.getId(),message -> {message.getMessageProperties().setHeader("x-delay", 30 * 60 * 1000); // 30分钟return message;});}public void cancelTimeoutTask(String orderId) {// 支付成功后删除消息(需要消息ID)// 实际实现需要改造发送逻辑保存messageIdrabbitTemplate.execute(channel -> {channel.queuePurge("order.close.queue");return null;});}
}

消费者实现:

@RabbitListener(queues = "order.close.queue")
public void handleTimeoutOrder(String orderId) {Order order = orderRepository.findById(orderId);if(order.getStatus() == OrderStatus.UNPAID) {orderService.closeOrder(orderId);log.info("订单超时关闭: {}", orderId);}
}

image-20250405162415036

相关文章:

202528 | RabbitMQ-高级 | 消息可靠性 | 业务幂等性 | 延迟消息

消息可靠性 RabbitMQ发送者可靠性 一、发送者重连机制 #mermaid-svg-gqr6Yr5UNZX87ZDU {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-gqr6Yr5UNZX87ZDU .error-icon{fill:#552222;}#mermaid-svg-gqr6Yr5UNZX87ZD…...

Java EE期末总结(第六章)

一、IoC 1、Bean装配流程 IOC装配流程在代码中的对应就体现在Service这个注解 依赖注入在代码中体现在 &#xff0c;比如 Resource UserService userService 二、AOP 简化流程&#xff0c;为程序员简便操作 tmd编不下去了我自己看视频都没理解md不弄了&#xff1b; 给两个…...

ASP.NET Core 性能优化:内存缓存

文章目录 前言一、什么是缓存二、内存缓存三、使用内存缓存1&#xff09;注册内存缓存服务2&#xff09;注入与基本使用3&#xff09;高级用法GetOrCreate&#xff08;避免缓存穿透&#xff09;异步方法&#xff1a;GetOrCreateAsync&#xff08;避免缓存穿透&#xff09;两种过…...

Go小技巧易错点100例(二十六)

本期分享&#xff1a; 1. string转[]byte是否会发生内存拷贝 2. Go程序获取文件的哈希值 正文&#xff1a; string转[]byte是否会发生内存拷贝 在Go语言中&#xff0c;字符串转换为字节数组&#xff08;[]byte&#xff09;确实会发生内存拷贝。这是因为在Go中&#xff0c;字…...

《算法笔记》3.5小节——入门模拟->进制转换

1022 D进制的AB #include <iostream> using namespace std; int maxn32;int main() {int z[maxn],num0,a,b,d;cin>>a>>b>>d;int resab;do{z[num]res%d;resres/d;}while(res);for (int i num-1; i >0 ; i--) {cout<<z[i];}return 0; }问题 A:…...

【MQTT-协议原理】

MQTT-协议原理 ■ MQTT-协议原理■ MQTT-服务器 称为"消息代理"&#xff08;Broker&#xff09;■ MQTT协议中的订阅、主题、会话■ 一、订阅&#xff08;Subscription&#xff09;■ 二、会话&#xff08;Session&#xff09;■ 三、主题名&#xff08;Topic Name&a…...

JWT认证服务与授权 .netCore

1.实现流程图 2.认证信息概述 Header:System.IdentityModel.Tokens.Jwt.JwtHeader Payload: System.IdentityModel.Tokens.Jwt.JwtPayload Issuer: http://localhost:7200 Audience: http://localhost:7200 Expiration: 2025/4/11 15:06:14 Claim - Type: http://schemas…...

编译原理 实验二 词法分析程序自动生成工具实验

文章目录 实验环境的准备实验实验预备知识分析案例所要做的任务实战 实验环境的准备 安装flex 安装MinGW MinGW Installation Manager页面 apply changes 下载比较耗时 只看到了一个文件&#xff0c;复制过去 配置环境变量 使用gcc -v检验是否安装完成 实验 实验预备知识…...

【C++初学】课后作业汇总复习(一)概述、输入输出、类的入门——理解封装

一、概述、输入输出、类的入门——理解封装 - 1. ab input two number output sum of a and b; #include <iostream>using namespace std;int main() {int a 0;int b 0;cin >> a >> b;cout << ab <<endl;return 0; }2.输入1~7任意一个整数&…...

数学建模:针对汽车行驶工况构建思路的延伸应用

前言&#xff1a; 汽车行驶工况构建的思简单理解为将采集的大量数据进行“去除干扰、数据处理&#xff0c;缩减至1800S的数据”&#xff0c;并可达到等效替换的目的&#xff0c;可以使在试验室快速复现&#xff1b;相应的解决思路、办法可应用在 “通过能量流采集设备大量采集…...

Qt 之opengl shader language

着色器示例代码 实际运行效果...

dolphinscheduler创建文件夹显示存储未启用的问题--已解决

只要修改api-server/comf/common.properties和standalone-server/conf/common.properties里面的内容就可以了&#xff0c;应为你要靠standalone-server这个服务启动dolphinscheduler-web&#xff0c;其他就算怎么改你重启dolphinscheduler的时候系统也不会识别新的common.prope…...

解密 Linux 线程:多线程编程与资源管理

个人主页&#xff1a;chian-ocean 文章专栏-Linux 前言&#xff1a; 在Linux中&#xff0c;线程 是一种轻量级的执行单元&#xff0c;它是进程的一部分。多个线程可以在同一个进程内并行执行任务&#xff0c;通常它们共享该进程的资源&#xff0c;如内存空间、文件描述符等。…...

Node.js net模块详解

Node.js 的 net 模块提供了基于 TCP 或 IPC 的网络通信能力&#xff0c;用于创建服务器和客户端。以下是 net 模块的核心 API 详解&#xff0c;包含类、方法、事件及示例。 1. 模块引入 const net require(net);2. 核心类与方法 2.1 net.Server 类 用于创建 TCP 或 IPC 服务…...

Node.js中fs模块详解

Node.js 中 fs 模块&#xff08;非 Promise&#xff09;API 详解 Node.js 的 fs 模块提供了同步和异步的文件系统操作。以下是非 Promise 版本的 API 详解&#xff1a; 1. 文件读取操作 const fs require(fs);// 异步读取文件 fs.readFile(file.txt, utf8, (err, data) >…...

Mouse without Borders – 用一套鼠标 / 键盘控制四台电脑

同时操控 2 台电脑&#xff0c;只需一个鼠标和键盘&#xff01;完全免费&#xff0c;由微软官方提供 | 零度解说_哔哩哔哩_bilibili Mouse Without Borders 简介‌ Mouse Without Borders&#xff08;无界鼠标&#xff09;是由微软开发的免费键鼠共享工具&#xff0c;支持在局…...

《车辆人机工程-汽车驾驶操纵实验》

汽车操纵装置有哪几种&#xff0c;各有什么特点 汽车操纵装置是驾驶员直接控制车辆行驶状态的关键部件&#xff0c;主要包括以下几种&#xff0c;其特点如下&#xff1a; 一、方向盘&#xff08;转向操纵装置&#xff09; 作用&#xff1a;控制车辆行驶方向&#xff0c;通过转…...

使用DaemonSet部署集群守护进程集

使用DaemonSet部署集群守护进程集 文章目录 使用DaemonSet部署集群守护进程集[toc]一、使用DaemonSet部署日志收集守护进程集二、管理DaemonSet部署的集群守护进程集1.对DaemonSet执行滚动更新操作2.对DaemonSet执行回滚操作3.删除DaemonSet 一、使用DaemonSet部署日志收集守护…...

破解升腾c10,改造成下载机(第二篇:获取xterm终端)

当c10刷好华为ct3100系统后&#xff0c;就开始获取xterm终端&#xff0c;然后再安装entware. 第一步&#xff1a;获取xterm终端。 点击桌面左下角的工具图标 再点browser 输入百度网址&#xff0c;访问&#xff01; 然后再将网页另存为&#xff5e;&#xff5e;&#xff5e;…...

浏览器多开

使用浏览器的用户功能&#xff0c;创建多个用户即可完成浏览器多开的需求&#xff0c;插件等相对独立 需要命名 然后就可以通过多个用户切换来实现多开了&#xff0c;不同任务选择不同用户...

使用Python实现的音符生成和节拍器程序

推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 **摘要****先决条件****设置**生成音符频率播放音符节拍器合并结论摘要 节拍器和随机音符生成器各有用途,但单独使用时功能有限。本…...

【生活相关-日语-日本-东京-留学生-搬家后或新入驻-水道局申请饮用水(1)-办理手续】

【生活相关-日语-日本-东京-搬家后-水道局申请饮用水-办理手续】 1、前言2、情况说明&#xff08;1&#xff09;他人代办&#xff08;2&#xff09;打电话&#xff08;3&#xff09;网络申请&#xff08;4&#xff09;你将会面临什么&#xff0c;主要步骤&#xff08;5&#xf…...

PyTorch模型构造实战:从基础到复杂组合

本文通过多个示例演示如何使用PyTorch构建不同类型的神经网络模型&#xff0c;涵盖基础多层感知机、自定义块、顺序块以及复杂组合模型。所有代码均附带输出结果&#xff0c;帮助读者直观理解模型结构。 1. 多层感知机&#xff08;MLP&#xff09; 使用nn.Sequential快速构建一…...

【高性能缓存Redis_中间件】一、快速上手redis缓存中间件

一、铺垫 在当今的软件开发领域&#xff0c;消息队列扮演着至关重要的角色。它能够帮助我们实现系统的异步处理、流量削峰以及系统解耦等功能&#xff0c;从而提升系统的性能和可维护性。Redis 作为一款高性能的键值对数据库&#xff0c;不仅提供了丰富的数据结构&#xff0c;…...

并发编程--互斥锁与读写锁

并发编程–互斥锁与读写锁 文章目录 并发编程--互斥锁与读写锁1. 基本概念2. 互斥锁2.1 基本逻辑2.2 函数接口2.3示例代码12.4示例代码2 3. 读写锁3.1 基本逻辑3.2示例代码 1. 基本概念 互斥与同步是最基本的逻辑概念&#xff1a; 互斥指的是控制两个进度使之互相排斥&#x…...

Linux下Docker安装超详细教程(以CentOS为例)

前言 Docker 已成为现代应用开发和部署的标配工具。本教程将手把手教你 在 CentOS 系统上安装 Docker&#xff0c;涵盖从环境准备到验证安装的全流程&#xff0c;并解决常见问题。无论你是运维工程师还是开发者&#xff0c;均可快速上手。 一、环境要求 操作系统 CentOS 7 或更…...

Ubuntu 服务器版本 设置socket服务(Python)

1. 确定 Socket 类型 Socket 服务可以是: 网络 Socket:基于 TCP/UDP 协议(如 Web 服务器、API 服务)。 Unix Domain Socket:本地进程间通信(如 Docker、MySQL 默认使用)。 2. 编写一个简单的 Socket 服务示例(Python) 以 Python 为例,创建一个 TCP Socket 服务:…...

对于GAI虚假信息对舆论观察分析

摘要 生成式人工智能&#xff08;Generative Artificial Intelligence, GAI&#xff09;的技术革新重构了信息生产机制&#xff0c;但也加剧了虚假信息对舆论生态的异化风险。 关键词&#xff1a;生成式人工智能、虚假信息、舆论异化、智能治理 一、生成式人工智能虚假信息下…...

HTTP:三.HTTP连接

HTTP(Hypertext Transfer Protocol)是一种用于传输超文本数据的应用层协议。它是互联网上最常用的协议,用于在客户端和服务器之间传输数据。HTTP协议通常用于从Web服务器传输网页和文件到客户端浏览器,并支持其他用途,如传输API数据和传输文件。 HTTP连接是指客户端向服务…...

hyper-v server服务器部署远程访问(我目前环境:hyper-v服务器+路由器+公网ip)

Hyper-v server部署(裸金属方式) 系统镜像下载安装# 下载地址:17763.737.190906-2324.rs5_release_svc_refresh_SERVERHYPERCORE_OEM_x64FRE_zh-cn_1.iso 安装的过程很简单,和安装Windows操作系统没啥区别,这里就不记录了。 安装过程可参考:安装Hyper-v Server 2016 部…...

MCP遇见Web3:从边缘计算到去中心化的无限想象

MCP遇见Web3:从边缘计算到去中心化的无限想象 在数字化转型的浪潮中,边缘计算(MCP,Micro Control Protocol)和Web3技术分别在计算效率与去中心化架构上发挥着各自的优势。当两者融合,会碰撞出哪些火花?作为一名技术极客,我最近开始深度研究MCP与Web3工具的集成,试图探…...

【HarmonyOS Next之旅】DevEco Studio使用指南(十三) -> ArkTS/TS代码重构

目录 1 -> Refactor-Extract代码提取 2 -> Refactor-Convert代码转换 3 -> Refactor-Rename代码重命名 4 -> Move File 5 -> Safe Delete 1 -> Refactor-Extract代码提取 在编辑器中支持将函数内、类方法内等区域代码块或表达式&#xff0c;提取为新方…...

STM32 HAL DHT11驱动程序

DHT11驱动程序会占用TIM3定时器&#xff0c;进行高精度延时。程序共包含4个文件 DHT11.c DHT11.h delay.c delay.h DHT11.c #include "stm32f1xx_hal.h" #include "dht11.h" #include "delay.h" // 添加延时头文件 #define DHT_PORT GPIOB…...

asm汇编源代码之文件操作相关

提供7个子程序:   1. 关闭文件 FCLOSE   2. 打开文件 FOPEN   3. 文件大小 FSIZE   4. 读文件 FREAD   5. 写文件 FWRITE   6. 建立文件 FCREATE   7. 读取或设置文件指针 FPOS 具体功能及参数描述如下 ; ---------------------------- FCLOSE PROC  FAR ; IN…...

Github 2025-04-12 Rust开源项目日报Top10

根据Github Trendings的统计,今日(2025-04-12统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10TypeScript项目2uv: 极快的Python软件包安装程序和解析器 创建周期:147 天开发语言:Rust协议类型:Apache License 2.0Star数量:7…...

JAVA学习-练习试用Java实现“实现一个Java程序,对大数据集中的数据进行类型转换”

问题&#xff1a; 实现一个Java程序&#xff0c;对大数据集中的数据进行类型转换。 解答思路&#xff1a; 在Java中&#xff0c;对大数据集中的数据进行类型转换通常意味着将一种数据类型转换为另一种数据类型。以下是一个简单的Java程序示例&#xff0c;它演示了如何对大数据集…...

Android基础彻底解析-APK入口点,xml,组件,脱壳,逆向

第一章:引言与背景 Android逆向工程,作为一种深入分析Android应用程序的技术,主要目的就是通过分析应用的代码、资源和行为来理解其功能、结构和潜在的安全问题。它不仅仅是对应用进行破解或修改,更重要的是帮助开发者、研究人员和安全人员发现并解决安全隐患。 本文主要对…...

Spark RDD算子详解:从入门到精通

一、前言 在大数据处理领域&#xff0c;Apache Spark凭借其高效的内存计算能力&#xff0c;成为了流行的分布式计算框架。RDD&#xff08;Resilient Distributed Dataset&#xff09;是Spark的核心概念之一&#xff0c;它是一个分布式的数据集合&#xff0c;提供了丰富的操作接…...

Bootstrap4 卡片

Bootstrap4 卡片 Bootstrap 是一个流行的前端框架&#xff0c;它提供了丰富的组件和工具&#xff0c;使得开发者可以快速构建响应式、美观的网页。其中&#xff0c;Bootstrap4 中的卡片组件&#xff08;Card&#xff09;是一个非常实用的功能&#xff0c;可以用来展示图片、文…...

【随行付-注册安全分析报告-无验证方式导致隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…...

深入解析Antogen意图识别模型:从原理到实践

一、意图识别基础概念 1.1 什么是意图识别 意图识别(Intent Recognition)是自然语言处理(NLP)中的核心任务&#xff0c;旨在确定用户输入背后想要表达的目的或行动请求。它是对话系统理解用户的第一步&#xff0c;直接影响后续的对话管理和响应生成质量。 关键特征&#xff…...

企业年报问答RAG挑战赛冠军方案:从零到SotA,一战封神

RAG挑战赛是什么&#xff1f; 任务是基于企业年报构建问答系统。比赛日的流程简而言之&#xff1a; 解析阶段&#xff1a;获得100份随机企业的年报&#xff08;PDF格式&#xff0c;每份最多1000页&#xff09;&#xff0c;限时2.5小时完成解析并构建数据库。问答阶段&#xf…...

深入理解 HTML5 语义元素:提升网页结构与可访问性

引言 在构建网页的过程中&#xff0c;合理的结构与清晰的语义对于网页的质量、可维护性以及搜索引擎优化&#xff08;SEO&#xff09;都至关重要。HTML5 引入了一系列语义元素&#xff0c;为开发者提供了更精准描述网页内容的工具。本文将深入探讨 HTML5 语义元素的作用、使用…...

DeepSeek vs Grok vs ChatGPT:三大AI工具优缺点深度解析

一、DeepSeek&#xff1a;低成本与中文专精的本地化AI 优点 中文处理能力卓越 DeepSeek针对中文语法和文化背景进行了深度优化&#xff0c;尤其在古文翻译、诗歌创作和技术文档生成中表现突出&#xff0c;远超ChatGPT的中文支持能力。高效推理与低成本 采用混合专家&#xff…...

MCP(模型上下文协议)简单案例

MCP&#xff08;模型上下文协议&#xff09;的标准化接口 MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09;是由Anthropic开发的一种开放协议&#xff0c;旨在标准化大型语言模型&#xff08;LLM&#xff09;与外部数据源和工具的交互方式1。它就…...

BGP基础概念与核心架构

一、BGP 协议定义与定位 BGP&#xff08;Border Gateway Protocol&#xff0c;边界网关协议&#xff09; 是互联网中唯一的域间路由协议&#xff08;EGP&#xff09;&#xff0c;用于在不同自治系统&#xff08;AS&#xff09;之间交换路由信息。与 OSPF、IS-IS 等域内路由协议…...

【经济保护主义叙事】

第一层&#xff1a;表面逻辑——经济保护主义叙事 公开理由&#xff1a;特朗普宣称加征关税是为了“保护美国制造业”“减少贸易逆差”“维护国家安全”&#xff0c;并强调通过关税迫使贸易伙伴降低壁垒&#xff0c;促进产业链回流美国。 底层逻辑&#xff1a;通过民族主义叙事…...

遵循IEC 62304:构建安全可靠的医疗器械软件

目录 一、IEC 62304 标准概述 1. 标准定位与适用范围 二、核心内容与要求 1. 软件安全等级&#xff08;Software Safety Classification&#xff09; &#xff08;1&#xff09;分级标准 &#xff08;2&#xff09;分级依据 &#xff08;3&#xff09;验证要求 2. 软件…...

ARM 架构下 spin_lock 实现

阅读该文章前&#xff0c;需要对原子指令有所了解&#xff0c;推荐阅读 聊一聊原子操作和弱内存序 1、概念 内核当发生访问资源冲突的时候&#xff0c;可以有两种锁的解决方案选择&#xff1a; 一个是原地等待一个是挂起当前进程&#xff0c;调度其他进程执行&#xff08;睡眠…...

计算机视觉算法实现——SAM实例分割:原理、实现与应用全景

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​ ​​​​​​​​​ ​​ 1. 实例分割领域概述 实例分割(Instance Segmentation)是计算机视觉领域最具挑战性的任务之一&#xff0c…...