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

ActiveMQ 可靠性保障:消息确认与重发机制(一)

引言

{"type":"load_by_key","key":"auto_image_0_0","image_type":"search"}

在当今分布式系统的架构中,消息中间件扮演着举足轻重的角色,而 ActiveMQ 作为一款广泛使用的开源消息中间件,凭借其对 JMS(Java Message Service)规范的支持、多种消息传输协议、丰富的消息模型(如点对点和发布 / 订阅)以及出色的集群能力 ,成为众多开发者构建分布式系统的重要选择。在分布式系统中,消息的可靠传输至关重要,哪怕是偶尔出现的消息丢失或处理失败,都可能引发系统功能的异常,给业务带来严重影响。

为了确保消息能准确无误地被处理,ActiveMQ 引入了消息确认与重发机制。消息确认机制让生产者或消费者知晓消息的处理状态,重发机制则在消息处理出现异常时重新发送消息,这两种机制共同为消息传输的可靠性提供保障。接下来,本文将深入探讨 ActiveMQ 的消息确认与重发机制,包括它们的原理、工作方式、使用场景以及相关的代码示例。

ActiveMQ 消息确认机制

确认机制的概念与作用

消息确认机制是 ActiveMQ 确保消息可靠传输的关键机制,它定义了消息发送者(生产者)或接收者(消费者)与消息代理(broker)之间确认消息已被成功处理的方式 。在消息从生产者发送到 broker,再由消费者接收的过程中,确认机制起到了至关重要的作用。

对于生产者而言,确认机制让其知晓消息是否已被 broker 成功接收并存储,从而避免因网络故障等原因导致消息丢失而生产者却不知情的情况。对于消费者来说,确认机制确保了消息在被正确处理后才被标记为已消费,防止消息的重复处理或丢失。例如,在一个订单处理系统中,生产者发送订单消息给 broker,如果没有确认机制,生产者无法确定订单消息是否成功到达 broker,可能会导致订单的重复发送或丢失,而消费者如果没有确认已成功处理订单消息,可能会在系统故障恢复后再次处理该订单,导致重复下单。

JMS 规范中的确认模式

JMS 规范定义了四种确认模式,每种模式都有其独特的工作原理、适用场景和优缺点。

  • AUTO_ACKNOWLEDGE(自动确认):当客户端成功从receive方法或onMessage方法返回时,会话会自动确认客户端已收到消息。例如,在一个简单的日志记录系统中,消费者接收到日志消息后,不需要额外的操作,消息就会被自动确认,这种模式简单易用,能提高消息处理的效率 。但它存在一定风险,如果在消息被确认后,业务处理过程中出现异常,消息已被从 broker 队列中删除,可能会导致数据不一致或业务逻辑错误。
  • CLIENT_ACKNOWLEDGE(客户端手动确认):客户端通过调用message.acknowledge()方法来手动确认消息已被接收和处理。这种模式下,确认是在会话层进行的,确认一个被消费的消息将自动确认所有已消费的其他消息。例如,在一个订单支付系统中,消费者接收到支付消息后,只有在完成支付业务逻辑并调用acknowledge()方法后,消息才会被确认,这确保了消息处理的完整性和准确性 。不过,如果开发者忘记调用acknowledge()方法,可能会导致消息一直留在 broker 队列中,占用资源,并且如果在确认前客户端出现故障,消息可能会被重复发送和处理。
  • DUPS_OK_ACKNOWLEDGE(自动批量确认):这种模式下,消息不是必须立即签收,可能会出现重复发送的情况。在第二次重新传送消息时,消息头的JmsDelivered会被置为true,标示当前消息已经传送过一次,客户端需要进行消息的重复处理控制。它适用于对消息重复不太敏感,追求高吞吐量的场景,如一些实时数据分析系统,少量的消息重复不会影响整体的分析结果,却能提高系统的处理速度 。但如果业务对消息的唯一性和准确性要求很高,这种模式就不太适用。
  • SESSION_TRANSACTED(事务提交并确认):当会话使用事务时,使用此模式。在事务开启之后,和session.commit()之前,所有消费的消息,要么全部正常确认,要么全部重新投递(redelivery)。例如,在一个涉及多个数据库操作的复杂业务场景中,将消息消费和数据库操作放在一个事务中,只有当所有数据库操作都成功完成并提交事务时,消息才会被确认,否则整个事务回滚,消息重新投递,保证了数据的一致性和完整性 。但事务的使用会增加系统的复杂性和性能开销,因为事务的管理需要额外的资源和时间。

ActiveMQ 扩展的确认模式

ActiveMQ 补充了INDIVIDUAL_ACKNOWLEDGE确认模式,用于确认单条消息。与CLIENT_ACKNOWLEDGE模式相比,CLIENT_ACKNOWLEDGE模式调用message.acknowledge()方法会确认由此会话消费的所有消息,而INDIVIDUAL_ACKNOWLEDGE模式下,仅会确认调用acknowledge()方法的那条消息 。在一个任务处理系统中,每个任务都有独立的处理逻辑和状态,如果使用CLIENT_ACKNOWLEDGE模式,可能会因为一个任务的异常导致其他任务也无法正确确认,而INDIVIDUAL_ACKNOWLEDGE模式可以精确地确认每条任务消息,即使某个任务出现问题,也不会影响其他任务的确认和处理 。不过,由于需要对每条消息进行单独确认,在消息量较大时,可能会增加系统的开销和复杂性。

确认模式的实际应用与代码示例

以下是不同确认模式下,使用 ActiveMQ 发送和接收消息的代码示例:

  • AUTO_ACKNOWLEDGE 模式
 

import javax.jms.*;

import org.apache.activemq.ActiveMQConnectionFactory;

public class AutoAcknowledgeExample {

public static void main(String[] args) throws JMSException {

// 创建连接工厂

ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");

// 创建连接

Connection connection = connectionFactory.createConnection();

// 启动连接

connection.start();

// 创建会话,参数false表示不使用事务,Session.AUTO_ACKNOWLEDGE表示自动确认模式

Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

// 创建队列

Destination destination = session.createQueue("testQueue");

// 创建生产者

MessageProducer producer = session.createProducer(destination);

// 创建消息

TextMessage message = session.createTextMessage("Hello, ActiveMQ!");

// 发送消息

producer.send(message);

System.out.println("Message sent: " + message.getText());

// 创建消费者

MessageConsumer consumer = session.createConsumer(destination);

// 接收消息

Message receivedMessage = consumer.receive();

if (receivedMessage instanceof TextMessage) {

TextMessage textMessage = (TextMessage) receivedMessage;

System.out.println("Received message: " + textMessage.getText());

}

// 关闭资源

consumer.close();

producer.close();

session.close();

connection.close();

}

}

在这段代码中,session.createSession(false, Session.AUTO_ACKNOWLEDGE)设置了会话的确认模式为AUTO_ACKNOWLEDGE,当消费者成功接收消息并从receive方法返回时,消息会自动被确认。

  • CLIENT_ACKNOWLEDGE 模式
 

import javax.jms.*;

import org.apache.activemq.ActiveMQConnectionFactory;

public class ClientAcknowledgeExample {

public static void main(String[] args) throws JMSException {

ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");

Connection connection = connectionFactory.createConnection();

connection.start();

// 创建会话,参数false表示不使用事务,Session.CLIENT_ACKNOWLEDGE表示客户端手动确认模式

Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);

Destination destination = session.createQueue("testQueue");

MessageProducer producer = session.createProducer(destination);

TextMessage message = session.createTextMessage("Hello, ActiveMQ!");

producer.send(message);

System.out.println("Message sent: " + message.getText());

MessageConsumer consumer = session.createConsumer(destination);

Message receivedMessage = consumer.receive();

if (receivedMessage instanceof TextMessage) {

TextMessage textMessage = (TextMessage) receivedMessage;

System.out.println("Received message: " + textMessage.getText());

// 手动确认消息

receivedMessage.acknowledge();

System.out.println("Message acknowledged");

}

consumer.close();

producer.close();

session.close();

connection.close();

}

}

在这个示例中,session.createSession(false, Session.CLIENT_ACKNOWLEDGE)设置了手动确认模式,消费者在接收到消息并处理完成后,需要调用receivedMessage.acknowledge()手动确认消息。

  • INDIVIDUAL_ACKNOWLEDGE 模式(ActiveMQ 扩展)
 

import org.apache.activemq.ActiveMQConnection;

import org.apache.activemq.ActiveMQConnectionFactory;

import org.apache.activemq.ActiveMQSession;

import javax.jms.*;

public class IndividualAcknowledgeExample {

public static void main(String[] args) throws JMSException {

ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(

ActiveMQConnection.DEFAULT_USER,

ActiveMQConnection.DEFAULT_PASSWORD,

"tcp://localhost:61616");

Connection connection = connectionFactory.createConnection();

connection.start();

// 创建会话,参数false表示不使用事务,ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE表示单条消息确认模式

Session session = connection.createSession(false, ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE);

Destination destination = session.createQueue("testQueue");

MessageProducer producer = session.createProducer(destination);

TextMessage message = session.createTextMessage("Hello, ActiveMQ!");

producer.send(message);

System.out.println("Message sent: " + message.getText());

MessageConsumer consumer = session.createConsumer(destination);

Message receivedMessage = consumer.receive();

if (receivedMessage instanceof TextMessage) {

TextMessage textMessage = (TextMessage) receivedMessage;

System.out.println("Received message: " + textMessage.getText());

// 确认单条消息

receivedMessage.acknowledge();

System.out.println("Individual message acknowledged");

}

consumer.close();

producer.close();

session.close();

connection.close();

}

}

这段代码展示了INDIVIDUAL_ACKNOWLEDGE模式的使用,session.createSession(false, ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE)设置了单条消息确认模式,消费者调用acknowledge()方法只会确认当前处理的这条消息。

相关文章:

ActiveMQ 可靠性保障:消息确认与重发机制(一)

引言 在当今分布式系统的架构中,消息中间件扮演着举足轻重的角色,而 ActiveMQ 作为一款广泛使用的开源消息中间件,凭借其对 JMS(Java Message Service)规范的支持、多种消息传输协议、丰富的消息模型(如点对…...

麒麟、UOS系统在线打开word文件并提取修订痕迹

麒麟、UOS系统在线打开word文件并提取修订痕迹 查看本示例演示效果(Windows版) 查看本示例演示效果(国产版)本示例关键代码的编写位置,请参考“开始 - 快速上手”里您所使用的开发语言框架的最简集成代码 注意 本文中…...

Vue3笔记摘录

1.Vue3整体知识概览图 2.ref与reactive具体使用区别 2-1 基本类型处理 const count1 ref(0) 使用ref自动转化为数字类型const count2 reactive(0) 参数必须是对象类型 2-2 具体使用过程 // ref 处理对象(自动解包) const user ref({name: John,a…...

大力探索“AI·Life爱生活”项目峰会暨战略投资签约仪式成功举办

2025年4月26日,杭州西溪雷迪森大酒店内气氛热烈非凡,大力探索(杭州)科技有限公司主办的“大力探索项目峰会暨战略投资签约仪式”在此隆重开启。这场汇聚了数百位行业精英与企业代表的盛会,不仅是一场智慧的碰撞&#x…...

复刻低成本机械臂 SO-ARM100 材料齐活篇

视频讲解: 复刻低成本机械臂 SO-ARM100 材料齐活篇 打印件基本ok,总共12个,尴尬的是github又更新了so-101,不过看了下还好只是优化了走线和几个结构键,影响不大,大不了后面再重新打印(有3d打印机…...

解读 AI绘画工作流ComfyUI Stable Diffusion

ComfyUI 是什么?图像工作流又是什么? 认识ComfyUI 从名词术语来看: ComfyUI是一个基于节点流程的Stable Diffusion操作界面,通过自定义节点、拖拽连线实现精准的工作流定制,以完成更复杂的图像生成工作。 </...

北极星 新美团核销接口对接

美团吃相难看&#xff0c;东哥就应该干掉他 申请官方接口一般来说很难了 现在无非就是几种第三方开放出来的接口 按量收费&#xff0c;但是需要一次性充钱收首期的技术服务费 &#xff0c;然后按年收费就是我们技术自己解决的方式&#xff0c;方便便宜 ,代码齐全&#xff0c…...

理解数据库存储以及查询(集合)

理解数据库存储以及查询&#xff08;集合&#xff09; 基本概念定义 主键集合&#xff1a; 定义&#xff1a;主键集合是由数据库表中的主键组成的一个集合。主键是表中唯一标识每一行记录的属性&#xff08;或属性组合&#xff09;。 特性&#xff1a;主键集合包含表的主键属性…...

(Go Gin)Gin学习笔记(四)Gin的数据渲染和中间件的使用:数据渲染、返回JSON、浅.JSON()源码、中间件、Next()方法

1. 数据渲染 1.1 各种数据格式的响应 json、结构体、XML、YAML类似于java的properties、ProtoBuf 1.1.1 返回JSON package mainimport ("github.com/gin-gonic/gin""net/http" )func main() {r : gin.Default()r.POST("/demo", func(res *gi…...

机器视觉橡胶制品检测的应用

橡胶制品在生产过程中易出现划痕、气泡、缺料、毛边、杂质嵌入等多种缺陷&#xff0c;这些缺陷往往微小且随机分布&#xff0c;人工检测不仅耗时&#xff0c;漏检率也居高不下。尤其在汽车密封件、医疗硅胶制品等高端领域&#xff0c;微米级的缺陷都可能导致产品失效&#xff0…...

JavaScript:从JS的执行机制到location对象

一、JS执行机制 &#xff08;1&#xff09;JS是单线程 JavaScript语言的一大特点就是单线程&#xff0c;也就是同一时间只能做一件事。因为JavaScript是为了处理页面中的用户交互&#xff0c;以及制作DOM二诞生的。比如我们对某个DOM元素进行添加和删除操作&#xff0c;这个不…...

Sigmoid函数简介及其Python实现

文章目录 一、Sigmoid 函数简介1. 数学公式2. 关键特性3. 应用场景 二、Python 实现1. 使用 math 库 (适用于单个数值)2. 使用 numpy 库 (适用于数值、列表、数组、矩阵)3. 使用 scipy.special.expit (数值稳定) 三、小结 一、Sigmoid 函数简介 Sigmoid 函数&#xff08;也称为…...

全局事件总线EventBus的用法

全局事件总线 EventBus 在前端开发中是一种用于实现组件间通信的机制&#xff0c;适用于兄弟组件或跨层级组件间的数据传递。 1. 创建全局 EventBus 实例 在前端项目中&#xff0c;先创建一个全局的 EventBus 实例。在 Vue 中&#xff0c;可以通过创建一个新的 Vue 实例来实现…...

嵌入式Linux系统中的线程信号处理:策略与实践

在嵌入式Linux系统的开发中&#xff0c;多线程编程是提升系统性能和响应速度的重要手段。然而&#xff0c;多线程环境下的信号处理却是一个复杂且需要细致处理的问题。信号&#xff0c;作为进程间通信的一种机制&#xff0c;在嵌入式系统中常用于处理外部事件或中断。但在多线程…...

CCM/TCM在STM32中的含义和用途

CCM/TCM在STM32中的含义和用途 CCM&#xff08;Core Coupled Memory&#xff09;和TCM&#xff08;Tightly Coupled Memory&#xff09;是ARM架构中的特殊内存类型&#xff0c;它们都表示与CPU核心紧密耦合的内存区域。这些内存具有一些特殊特性&#xff0c;使其在某些应用场景…...

【网络原理】 《TCP/IP 协议深度剖析:从网络基础到协议核心》

文章目录 一、网络基础1. 认识IP地址概念作用格式组成子网掩码 2、认识Mac地址一跳一跳的网络数据传输 3. 网络设备及相关技术集线器&#xff1a;转发所有端口交换机&#xff1a;MAC地址转换表转发对应端口主机&#xff1a;网络分层从上到下封装主机&路由器&#xff1a;ARP…...

Windows系统编译支持GPU的llama.cpp

Windows系统编译支持GPU的llama.cpp git clone https://github.com/ggerganov/llama.cpp.git cd llama.cpp mkdir build cd buildcmake .. -G "Visual Studio 17 2022" -DGGML_CUDAON -DCMAKE_BUILD_TYPERelease -DCMAKE_CUDA_ARCHITECTURES"86"cmake --b…...

Unity编辑器扩展之导出项目中所有预制体中文本组件文字内容

一、最后导出的Excel文件效果如下图所示: 二、在Unity的Editor目录下,新建一个名为FindChineseInPrefabs的C#脚本,Copy以下代码到你新建的名为FindChineseInPrefabs的C#脚本中去,最后一定要保存文件哈。 using UnityEditor; using UnityEngine; using UnityEngine.UI; usi…...

高效管理远程服务器Termius for Mac 保姆级教程

以下是 Termius for Mac 保姆级教程&#xff0c;涵盖安装配置、核心功能、实战案例及常见问题解决方案&#xff0c;助你高效管理远程服务器&#xff08;如Vultr、AWS等&#xff09;。 一、Termius 基础介绍 1. Termius 是什么&#xff1f; 跨平台SSH客户端&#xff1a;支持Ma…...

WPF框架中常用算法

WPF框架中常用算法与实现 一、排序算法 1. 快速排序 (Quick Sort) ​​应用场景​​&#xff1a;大数据集合排序、性能敏感场景 public static void QuickSort(IList<int> list, int left, int right) {if (left < right){int pivotIndex Partition(list, left, r…...

【Java函数式编程-58】Java函数式编程深度解析

函数式编程(Functional Programming)作为一种编程范式&#xff0c;近年来在Java生态中获得了越来越多的关注和应用。自Java 8引入Lambda表达式和Stream API以来&#xff0c;函数式编程风格在Java开发中逐渐普及。本文将深入探讨Java中函数式编程的核心概念、实践技巧以及在实际…...

解决vscode cmake提示检测到 #include 错误

一、问题 cmake已经包含了动态库文件&#xff0c;依然提示“检测到 #include 错误。请更新 includePath。” 二、解决方案 Ctrl Shift P进入CPP编辑配置&#xff0c;然后在JSON中加入下面一行&#xff1a; "configurationProvider": "ms-vscode.cmake-tools&…...

Microsoft .NET Framework 4.8 离线安装包 下载

简介Microsoft .NET Framework 4.8 是对 Microsoft .NET Framework 4、4.5、4.5.1、4.5.2、4.6、4.6.1、4.6.2、4.7、4.7.1 和 4.7.2 的高度兼容的就地更新。 脱机程序包可用于因无法连接 Internet 而导致 Web 安装程序无法使用的情况。 此包比 Web 安装程序大&#xff0c;并且…...

部署若依项目到服务器遇到的问题

以下是本次部署遇到的问题及解决方法 1、问题&#xff1a;docker一直出现“&#xff1e; ERROR [internal] load metadata for docker.io/library/xxx“的问题 ERROR: failed to solve: openjdk:8-jdk-alpine: failed to resolve source metadata for docker.io/libran y/ope…...

Elasticsearch--自带“搜索引擎“的数据库

一、核心原理 1. 倒排索引&#xff08;Inverted Index&#xff09; 基本概念 将文档中的每个词条&#xff08;term&#xff09;映射到包含它的文档列表上&#xff0c;正如图书馆目录将关键词映射到书籍编号。工作流程 分词&#xff08;Analysis&#xff09;&#xff1a;文本切…...

malloc的实现原理

malloc 是 C 语言中动态内存分配的核心函数&#xff0c;其实现原理涉及操作系统内存管理、数据结构和算法设计。以下是其核心实现原理的简化分析&#xff1a; 1. 内存池管理 基本思想&#xff1a;malloc 通过管理一个 内存池&#xff08;堆&#xff09;动态分配内存。操作系统…...

垃圾收集GC的基本理解

垃圾收集的基本理解 GC 的基本算法 标记清除 从根开始将可能被引用的对象用递归的方式进行标记&#xff08;标记阶段&#xff09;&#xff0c;然后再从根开始将全部对象按顺序扫描一遍&#xff0c;将没有被标记的对象进行回收&#xff08;清除阶段&#xff09;。 大多数情况…...

JVM——Java的基本类型的实现

Java 基本类型在 JVM 中的实现 Java 作为一种广泛使用的编程语言&#xff0c;其在虚拟机&#xff08;JVM&#xff09;上的实现细节对于开发者来说至关重要。本文将详细讲解 Java 基本类型在 JVM 中的实现&#xff0c;去深入理解 Java 编程语言的底层工作机制。 Java 基本类型…...

临床回归分析及AI推理

在医疗保健决策越来越受数据驱动的时代&#xff0c;回归分析已成为临床医生和研究人员最强大的工具之一。无论是预测结果、调整混杂因素、建模生存时间还是理解诊断性能&#xff0c;回归模型都为将原始数据转化为临床洞察提供了统计学基础。 AI推理 然而&#xff0c;随着技术…...

Ubuntu 22.04 的 ROS 2 和 Carla 设置指南(其一)

重点介绍适用于 Ubuntu 22.04 的全面 ROS 2 和 Carla 设置指南。我们将首先安装 Terminator 终端&#xff0c;然后安装 ROS 2 依赖项&#xff0c;然后继续安装 ROS 2 Humble。接下来&#xff0c;我们将介绍如何在 Ubuntu 22.04 上安装 Carla&#xff0c;最后通过设置 Carla ROS…...

声明:个人从未主动把文章设置为仅vip可读

之前一直在公司忙就没看csdn这边&#xff0c;前几天朋友看到我的博客是仅vip可读我才发现这个 给我气笑了。。。不反馈默认同意。。。。 现在都已经改回来 写文章的初衷就是记录一下自己的学习过程&#xff0c;本来就是一些偏基础类的东西&#xff0c;还需要去买vip才能看就太…...

【大模型系列篇】Qwen3开源全新一代大语言模型来了,深入思考,更快行动

Qwen3开源模型全览 Qwen3是全球最强开源模型&#xff08;MoEDense&#xff09; Qwen3 采用混合专家&#xff08;MoE&#xff09;架构&#xff0c;总参数量 235B&#xff0c;激活仅需 22B。 Qwen3 预训练数据量达 36T&#xff0c;并在后训练阶段多轮强化学习&#xff0c;将非思…...

DeepSeek-Prover-V2-671B 简介、下载、体验、微调、数据集:专为数学定理自动证明设计的超大垂直领域语言模型(在线体验地址)

DeepSeek-Prover-V2-671B 最新发布&#xff1a;专为数学定理自动证明设计的超大语言模型 体验地址&#xff1a;Hugging Face 在线体验 推荐入口&#xff1a;Novita 平台直达链接&#xff08;含邀请码&#xff09; 一、模型简介 DeepSeek-Prover-V2-671B 是 DeepSeek 团队于 2…...

Gupta-Sproull 抗据此画线算法

本文源自于&#xff1a;从https://www.inf.ed.ac.uk/teaching/courses/cg/lectures/cg4_2012.pdf Gupta-Sproull是在Brensenham的画线算法基础上得到。 为了防止之前的链接失效&#xff0c;特地搬运一下...

idea写spark程序

使用IntelliJ IDEA编写Spark程序的完整指南 一、环境准备 安装必要软件 IntelliJ IDEA (推荐Ultimate版&#xff0c;Community版也可) JDK 8或11 Scala插件(在IDEA中安装) Spark最新版本(本地开发可以用embedded模式) 创建项目 打开IDEA → New Project 选择"Maven…...

视觉问答论文解析:《Skywork R1V2: Multimodal Hybrid Reinforcement Learning for Reasoning》

《Skywork R1V2: Multimodal Hybrid Reinforcement Learning for Reasoning》论文解析 一、研究背景与动机 近年来&#xff0c;“慢思考”多模态模型&#xff08;如 OpenAI-o1、GeminiThinking、Kimi-1.5 和 Skywork-R1V&#xff09;在数学和科学领域的复杂推理任务中取得了显…...

修改linux账号名

修改linux账号名 结论是步骤1.临时创建一个辅助账户执行操作2.注销当前账户&#xff0c;登录 tempadmin 用户。3.使用它修改 旧用户名olduser&#xff1a;4.&#xff08;可选&#xff09;删除临时用户&#xff1a; 结论是 不可以直接修改,要么需要创建一个临时用户来打辅助. …...

计算机图形学:(二)MVP变换示例

前言 当在阅读计算机图形学系列的书籍时&#xff0c;会发现大部分图书每章内容都如出一辙。从个人实际体会来讲&#xff0c;虽然能理解书中大部分的知识&#xff0c;但到了实际使用时却有点抓耳挠腮。因此&#xff0c;在写了计算机图形学&#xff1a;&#xff08;一&#xff09…...

PostgreSQL中的SSL(2)

PGSQL数据库的默认隔离级别是读提交&#xff0c;并且同时支持可重复读和序列化模式。但是在9.1之前的版本中&#xff0c;序列化模式是采用快照隔离来实现&#xff0c;并非是真正的序列化模式。 这样的话就会存在一个问题&#xff0c;那就是写偏序&#xff08;Write Skew&#…...

Linux 部署以paddle Serving 的方式部署 PaddleOCR CPU版本

强烈建议您在Docker内构建Paddle Serving&#xff0c;更多镜像请查看Docker镜像列表。 提示-1&#xff1a;Paddle Serving项目仅支持Python3.6/3.7/3.8/3.9&#xff0c;接下来所有的与Python/Pip相关的操作都需要选择正确的Python版本。 提示-2&#xff1a;以下示例中GPU环境均…...

苏德战争前期苏联损失惨重(马井堂)

苏德战争前期&#xff08;1941年6月22日德国发动“巴巴罗萨行动”至1941年底至1942年初&#xff09;是苏联在二战中损失最惨重的阶段之一。以下是主要方面的损失概述&#xff1a; ‌一、军事损失‌ ‌人员伤亡与俘虏‌ 至1941年底&#xff0c;苏军伤亡约‌300万人‌&#xff…...

SI5338-EVB Usage Guide(LVPECL、LVDS、HCSL、CMOS、SSTL、HSTL)

目录 1. 简介 1.1 EVB 介绍 1.2 Si5338 Block Diagram 2. EVB 详解 2.1 实物图 2.2 基本配置 2.2.1 Universal Pin 2.2.2 IIC I/F 2.2.3 Input Clocks 2.2.4 Output Frequencies 2.2.5 Output Driver 2.2.6 Freq and Phase Offset 2.2.7 Spread Spectrum 2.2.8 快…...

LeetCode LCP40 心算挑战题解

看似一道简单的题目&#xff0c;实则不然&#xff0c;没有看评论的话&#xff0c;实在想不出来怎么写。 现在则由我来转述思想供大家参考理解&#xff0c;还是先给出示例&#xff0c;供大家更好的理解这个题目。 输入&#xff1a;cards [1,2,8,9], cnt 3输出&#xff1a;18解…...

Smart Link+Monitor Link组网

1.技术背景及原理 一般情况下&#xff0c;Smart Link只能感知与其接口直连的链路故障。将Monitor Link配置在Smart Link的上游设备上&#xff0c;可使Smart Link迅速感知上游链路故障&#xff0c;进行链路切换。Smart Link与Monitor Link配合使用&#xff0c;扩大了Smart Link…...

【计算机网络】​TCP(传输控制协议)套接字,多线程远程执行命令编程​

&#x1f4da; 博主的专栏 &#x1f427; Linux | &#x1f5a5;️ C | &#x1f4ca; 数据结构 | &#x1f4a1;C 算法 | &#x1f152; C 语言 | &#x1f310; 计算机网络 上篇文章&#xff1a;UDP套接字编程&#xff08;英汉字典以及多线程聊天室编写&#xff09…...

PostgreSQL 中 VACUUM FULL 对索引的影响

PostgreSQL 中 VACUUM FULL 对索引的影响 是的&#xff0c;VACUUM FULL 会重建表上的所有索引。这是它与普通 VACUUM 命令的一个重要区别。 一、VACUUM FULL 的工作原理 表重建过程&#xff1a; 创建表的全新副本只将有效数据写入新存储删除原始表文件将新文件重命名为原表名…...

DeepSeek本地部署及WebUI可视化完全指南

以下是为您整理的DeepSeek本地部署及WebUI可视化完全指南&#xff0c;整合了官方文档及社区实践的最佳方案&#xff1a; 一、环境准备 1. 硬件需求 CPU&#xff1a;推荐支持AVX2指令集的Intel i7或AMD Ryzen 7及以上处理器 。 GPU&#xff08;可选但推荐&#xff09;&#xf…...

大模型时代的新燃料:大规模拟真多风格语音合成数据集

以大模型技术为核心驱动力的人工智能变革浪潮中&#xff0c;语音交互领域正迎来广阔的成长空间&#xff0c;应用场景持续拓宽与延伸。 其中&#xff0c;数据作为驱动语音大模型进化的关键要素&#xff0c;重要性愈发凸显。丰富多样的高质量数据能够让语音大模型充分学习到语音…...

单体项目到微服务的架构演变与K8s发展是否会代替微服务

单体项目到微服务的架构演变与K8s发展是否会代替微服务 在互联网大厂Java求职者的面试中&#xff0c;经常会被问到关于单体项目到微服务的架构演变以及Kubernetes&#xff08;k8s&#xff09;的发展是否会代替微服务的相关问题。本文通过一个故事场景来展示这些问题的实际解决…...

AI驱动的决策智能系统(AIDP)和自然语言交互式分析

在当今快速变化的商业环境中&#xff0c;以下几个企业级系统领域最有可能成为新的热点&#xff0c;其驱动力来自数字化转型加速、AI技术爆发、全球化协同需求以及ESG&#xff08;环境、社会、治理&#xff09;合规压力的叠加 1. AI驱动的决策智能系统&#xff08;AIDP&#xf…...