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

ActiveMQ 集群搭建与高可用方案设计(一)

一、引言

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

在当今分布式系统盛行的时代,消息中间件扮演着至关重要的角色,而 ActiveMQ 作为一款开源的、功能强大的消息中间件,在众多项目中得到了广泛应用。它支持多种消息传输协议,如 JMS、AMQP、MQTT 等 ,能够方便地实现系统之间的异步通信,有效解耦不同的业务模块,提升系统的可靠性和灵活性。

随着业务的不断发展和用户量的持续增长,对消息中间件的性能、可靠性和可用性提出了更高的要求。单节点的 ActiveMQ 在面对高并发、大规模数据传输以及硬件故障等情况时,往往显得力不从心。例如,在电商促销活动期间,大量的订单消息、库存变更消息等需要及时处理,如果单节点 ActiveMQ 出现故障,可能会导致订单丢失、库存数据不一致等严重问题,给企业带来巨大的经济损失。

为了应对这些挑战,搭建 ActiveMQ 集群并设计高可用方案成为了必然选择。通过集群部署,可以实现负载均衡,将大量的消息请求均匀地分配到各个节点上,避免单个节点因负载过高而出现性能瓶颈。同时,集群中的多个节点可以相互备份,当某个节点发生故障时,其他节点能够迅速接管其工作,保证消息的可靠传输和系统的持续运行,从而大大提高了系统的可用性和容错能力 。

在接下来的内容中,我们将深入探讨 ActiveMQ 集群搭建的详细步骤以及高可用方案的设计与实现,希望能为大家在实际项目中应用 ActiveMQ 提供有价值的参考。

二、ActiveMQ 基础入门

(一)ActiveMQ 简介

ActiveMQ 是 Apache 软件基金会下的一款开源的消息中间件,基于 Java 语言开发 ,能够在分布式系统中高效地实现消息的发送和接收。它支持多种消息传输协议,像 JMS(Java Message Service)、AMQP(Advanced Message Queuing Protocol)、MQTT(Message Queuing Telemetry Transport) 等,这使得它可以在不同的技术架构和应用场景中灵活应用。

ActiveMQ 具备多种特性,为企业级应用提供了可靠的消息通信支持。它支持多种语言编写客户端,包括 Java、C、C++、C#、Ruby、Perl、Python、PHP 等,方便不同技术栈的开发团队进行集成。同时,ActiveMQ 完全支持 JMS1.1 和 J2EE 1.4 规范,涵盖了持久化、XA 消息、事务等重要功能,确保了消息的可靠传输和事务一致性 。在消息持久化方面,ActiveMQ 支持通过 JDBC 和 journal 提供高速的消息持久化,保证消息在系统故障等情况下不丢失。并且,它从设计上保证了高性能的集群、客户端 - 服务器、点对点的通信模式,能够满足不同业务场景下的通信需求。

在应用场景方面,ActiveMQ 有着广泛的应用。在电商系统中,当用户下单后,订单系统可以将订单消息发送到 ActiveMQ 队列,库存系统、物流系统等作为消费者从队列中获取消息并进行相应处理,如库存扣减、物流单生成等,实现了不同业务系统之间的解耦和异步通信。在分布式系统的日志处理中,各个服务产生的日志信息可以通过 ActiveMQ 发送到日志收集系统,由日志收集系统统一进行存储和分析,提高了日志处理的效率和灵活性 。在消息推送场景中,如新闻资讯推送、即时通讯消息推送等,ActiveMQ 可以作为消息的中转站,将消息推送给多个订阅者,实现一对多的消息广播。

(二)核心概念

  1. 消息(Message):消息是 ActiveMQ 中最基本的概念,它是一种包含数据和元数据的对象。消息的元数据包含消息 ID,用于唯一标识消息;消息属性,比如优先级、时间戳等,优先级高的消息可能会被优先处理,时间戳可以记录消息的发送或接收时间;消息体则是消息的具体内容,可以是文本消息,如 XML、JSON 格式的数据,也可以是二进制消息,像图片、音频等。例如,在一个订单消息中,消息体可能包含订单编号、商品信息、下单用户等具体内容,而消息属性中可以设置该订单消息的优先级,以便在处理时优先处理重要订单 。
  1. 队列(Queue):队列是 ActiveMQ 中的一个消息代理,用于存储和管理消息。队列中的消息按照先进先出(FIFO)的原则进行排序,就像我们日常生活中排队买票一样,先到的人先办理业务。生产者将消息发送到队列,消费者从队列中取消息进行处理。一个典型的场景是订单处理,订单系统作为生产者将订单消息发送到队列,而订单处理系统作为消费者从队列中依次获取订单消息进行处理,确保每个订单都能被有序地处理,并且每个消息只会被一个消费者消费 。
  1. 主题(Topic):主题与队列类似,也是一个消息代理。不同之处在于,主题采用发布 / 订阅模式。一个生产者可以向主题发送消息,多个消费者可以订阅该主题,并且每个订阅者都会接收到相同的消息,就如同广播一样,所有收听广播的人都能听到相同的内容。例如,在新闻发布系统中,新闻发布者将新闻消息发布到主题,各个新闻客户端作为消费者订阅该主题,这样所有订阅的新闻客户端都能收到最新的新闻消息 。
  1. 生产者(Producer):生产者是负责将消息发送到队列或主题的组件,它可以是一个进程、线程或者是一个应用程序。在电商系统中,订单系统就可以看作是生产者,当用户下单时,订单系统会生成订单消息并将其发送到 ActiveMQ 的队列或主题中,以便其他系统进行后续处理 。
  1. 消费者(Consumer):消费者是从队列或主题中取消息进行处理的组件,同样可以是一个进程、线程或者应用程序。比如在上述电商系统中,库存系统和物流系统就是消费者,它们分别从队列或主题中获取订单消息,库存系统根据消息进行库存扣减操作,物流系统根据消息生成物流单并安排发货 。

三、集群搭建前的准备工作

(一)环境准备

  1. 硬件环境:为了确保 ActiveMQ 集群能够稳定运行并具备良好的性能,建议选择配置较高的服务器。每台服务器至少配备 2 核及以上的 CPU,这能够保证在处理大量消息请求时,服务器有足够的计算资源来高效地进行消息的接收、存储和转发。内存方面,4GB 及以上是较为合适的,充足的内存可以避免因内存不足导致的性能瓶颈,确保消息在内存中能够快速地被处理和传输。硬盘方面,推荐使用高速的固态硬盘(SSD),其读写速度远远高于传统的机械硬盘,能够显著提升消息持久化和读取的速度,保证消息的可靠存储和快速获取。网络方面,服务器之间应通过千兆及以上的网络连接,以确保消息在集群节点之间能够快速、稳定地传输,减少网络延迟对消息处理的影响 。
  1. 软件环境:操作系统可以选择 Linux 系统,如 CentOS 7 或更高版本,Linux 系统具有良好的稳定性、安全性和开源特性,能够为 ActiveMQ 集群提供可靠的运行环境。同时,需要安装 Java 环境,因为 ActiveMQ 是基于 Java 开发的,Java 环境是其运行的基础。建议安装 Java Development Kit(JDK)1.8 及以上版本,安装完成后,需要配置好 JAVA_HOME、PATH 和 CLASSPATH 等环境变量,确保系统能够正确识别和使用 Java。例如,在 CentOS 系统中,可以通过编辑 /etc/profile 文件,添加如下配置:
 

export JAVA_HOME=/usr/local/jdk1.8.0_311 # 根据实际安装路径修改

export PATH=$JAVA_HOME/bin:$PATH

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

配置完成后,执行source /etc/profile命令使配置生效 。

(二)下载与安装 ActiveMQ

  1. 下载途径:可以从 ActiveMQ 的官方网站(http://activemq.apache.org/components/classic/download/ )下载最新版本的 ActiveMQ 安装包。在下载页面,根据操作系统的类型选择对应的安装包,如 Windows 系统选择.zip格式的安装包,Linux 系统选择.tar.gz格式的安装包 。
  1. 安装步骤
    • Windows 系统:下载完成后,解压安装包到指定目录,例如D:\activemq。解压完成后,进入bin\win64目录(如果是 32 位系统,则进入bin\win32目录),该目录下有多个脚本文件,其中activemq.bat是启动 ActiveMQ 的脚本,wrapper.exe也可用于启动服务,InstallService.bat用于将 ActiveMQ 安装为系统服务,UninstallService.bat用于卸载系统服务。可以根据需求选择启动方式,若选择将其安装为系统服务,双击InstallService.bat即可,安装完成后,在系统服务列表中可以找到 ActiveMQ 服务,可通过服务管理器进行启动、停止和管理 。
    • Linux 系统:将下载的.tar.gz安装包上传到服务器,例如/opt目录。使用命令tar -zxvf apache-activemq-5.16.3-bin.tar.gz(假设下载的版本是 5.16.3,根据实际版本修改)解压安装包,解压后会生成一个apache-activemq-5.16.3目录。进入解压后的目录,再进入bin/linux-x86-64目录(根据服务器架构选择对应目录),执行./activemq start命令启动 ActiveMQ。启动过程中,可能会因为防火墙的限制导致无法访问管理页面和消息端口,需要开放相应的端口。例如,使用firewall - cmd命令开放 8161(管理页面端口)和 61616(消息端口):
 

# 开放8161端口策略

firewall - cmd --zone = public --add - port = 8161/tcp --permanent

# 开放61616端口策略

firewall - cmd --zone = public --add - port = 61616/tcp --permanent

# 重新载入防火墙策略

firewall - cmd --reload

启动成功后,可以通过http://服务器IP:8161/admin访问 ActiveMQ 的管理页面,默认用户名和密码都是admin 。

(三)配置文件说明

ActiveMQ 的主要配置文件是conf/activemq.xml,该文件包含了 ActiveMQ 的各种核心配置参数 。

  1. broker 元素:broker元素是activemq.xml文件的核心元素之一,它定义了 ActiveMQ 代理的基本属性。其中,brokerName属性用于指定代理的名称,在集群环境中,所有节点的brokerName必须相同,这样才能确保它们属于同一个集群,例如brokerName="myActiveMQCluster" 。dataDirectory属性指定了 ActiveMQ 的数据存储目录,默认值是${activemq.data},该目录用于存储消息持久化数据、日志文件等重要信息 。
  1. destinationPolicy 元素:destinationPolicy元素用于配置目的地(队列或主题)的相关策略。在destinationPolicy元素内部,可以通过policyMap和policyEntries元素来定义针对不同目的地的具体策略。例如,可以设置消息的存储限制、转发策略等。对于主题(topic),可以设置producerFlowControl属性为true,表示启用生产者流控制,当主题中的消息堆积过多时,生产者将被阻塞,防止消息的无限堆积;optimizedDispatch属性设置为true,可以优化消息的分发策略,提高消息的处理效率 。
  1. persistenceAdapter 元素:persistenceAdapter元素用于配置消息的持久化方式。ActiveMQ 支持多种持久化方式,如kahadb、leveldb等。默认情况下,使用kahadb进行持久化,配置如下:
 

<persistenceAdapter>

<kahaDB directory="${activemq.data}/kahadb"/>

</persistenceAdapter>

在集群环境中,通常会使用基于 Zookeeper 和 LevelDB 的持久化方式,这种方式能够提供更好的高可用性和数据一致性。配置示例如下:

 

<persistenceAdapter>

<replicatedLevelDB

directory="${activemq.data}/leveldb"

replicas="3"

bind="tcp://0.0.0.0:62222"

zkAddress="192.168.1.100:2181,192.168.1.101:2181,192.168.1.102:2181"

hostname="192.168.1.100"

zkPath="/activemq/leveldb-stores/"/>

</persistenceAdapter>

其中,directory指定了 LevelDB 数据存储目录;replicas表示集群中的节点数量,一般设置为奇数,以确保在节点故障时能够正常选举出主节点;bind指定了集群内部通信的端口;zkAddress指定了 Zookeeper 集群的地址;hostname指定了当前节点的 IP 地址;zkPath指定了 ActiveMQ 在 Zookeeper 中存储选举信息和数据同步的路径 。

4. transportConnectors 元素:transportConnectors元素用于配置 ActiveMQ 的传输连接器,定义了客户端与 ActiveMQ 代理进行通信的协议和端口。例如,配置 TCP 协议的传输连接器:

 

<transportConnectors>

<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>

</transportConnectors>

其中,name指定了传输连接器的名称;uri指定了通信的协议(这里是 TCP)、地址(0.0.0.0表示监听所有 IP 地址)和端口(61616),还可以设置一些参数,如maximumConnections表示最大连接数,wireFormat.maxFrameSize表示最大帧大小 。除了 TCP 协议,ActiveMQ 还支持 AMQP、STOMP、MQTT 等多种协议,可根据实际需求进行配置 。

四、ActiveMQ 集群搭建实战

(一)Master - Slave 模式搭建

  1. Pure Master Slave:在 Pure Master Slave 模式中,整个集群由一个 Master 节点和一个 Slave 节点组成。运行时,Slave 节点通过网络实时从 Master 节点复制数据,以此保证消息的一致性和可靠性 。当 Slave 和 Master 失去连接时,Slave 会自动升级为 Master,继续为客户端提供消息服务。

这种模式的优点是实现相对简单,能够提供基本的高可用性保障,适合对集群复杂性要求不高、规模较小的应用场景,在一些小型企业的内部系统中,如果对消息服务的可靠性有一定要求,但又不想投入过多的资源进行复杂的集群配置,就可以采用这种模式 。然而,它也存在明显的缺点,由于只有一个 Master 和一个 Slave,扩展能力非常有限,难以满足大规模业务增长的需求;并且在 Master 失效后,若想恢复 Master,需要停止 Slave,拷贝 Slave 中的数据文件到 Master 中,然后重启,操作过程较为繁琐 。

在配置方面,Master 不需要做特殊配置。对于 Slave broker,在${ACTIVEMQ_HOME}/conf/activemq.xml文件的<broker>节点中添加连接到 Master 的 URI 和设置 Master 失效后不关闭 Slave,示例如下:

 

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="pure_slave"

masterConnectorURI="tcp://0.0.0.0:61616" shutdownOnMasterFailure="false" dataDirectory="${activemq.base}">

同时,需要修改 Slave 的服务端口,以避免与 Master 端口冲突,示例如下:

 

<transportConnectors>

<transportConnector name="openwire" uri="tcp://0.0.0.0:61617"/>

</transportConnectors>

不过需要注意的是,从 ActiveMQ 5.8 版本开始,Pure Master Slave 模式已被废弃,不再推荐使用 。

2. Shared File System Master Slave:基于共享文件系统实现的 Master - Slave 模式,其原理是利用共享文件系统来存储消息数据。ActiveMQ 的默认数据库 kahaDB 底层是文件系统,多个 ActiveMQ 实例共享同一个文件存储目录。哪个 ActiveMQ 实例先获取共享文件的锁,那个实例就是 Master,其它的 ActiveMQ 实例就是 Slave。当当前的 Master 失效时,其它的 Slave 就会去竞争共享文件锁,谁竞争到了谁就是新的 Master 。

这种模式的优势在于 Slave 的个数没有限制,具有较好的扩展性;并且当 Master 失效时,无需手动配置,只要有足够多的 Slave,就可以自动选举出新的 Master,提高了系统的可用性 。在配置共享文件系统时,如果是在同一台机器上进行测试,可以将持久化适配器的存储目录改为本地磁盘的一个固定目录,多个实例共享这个目录,示例如下:

 

<persistenceAdapter>

<kahaDB directory="E:/XXX/XXX/XXX/cluster/shared_file/data/kahadb"/>

</persistenceAdapter>

如果各个 ActiveMQ 实例需要运行在不同的机器上,就需要使用分布式文件系统,如 NFS(Network File System)、Ceph 等。在 broker 配置方面,除了上述持久化适配器的配置外,还需要修改每个 broker 实例的服务端口和 jetty 的服务端口,防止端口占用异常 。

3. JDBC Master Slave:该模式使用数据库作为持久化存储来实现主从模式。其原理与 Shared File System Master Slave 模式类似,多个 ActiveMQ 实例连接到同一个共享数据库,通过争抢数据库连接并锁定数据库操作权限来确定 Master 和 Slave。争抢到连接的称为 Master,其他 broker 称为 Slave 。如果当前 Master 挂掉,另外几个 Slave 会继续争抢,挂掉的 broker 重连成功后仍然作为 Slave 。

在配置时,首先需要在所有的 ActiveMQ 的主配置文件(${ACTIVEMQ_HOME}/conf/activemq.xml)中添加数据源,所有的数据源都指向同一个数据库。以 MySQL 为例,配置示例如下:

 

<bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

<property name="driverClassName" value="com.mysql.jdbc.Driver"/>

<property name="url" value="jdbc:mysql://localhost:3306/cluster_jdbc?relaxAutoCommit=true"/>

<property name="username" value="root"/>

<property name="password" value="root"/>

<property name="maxActive" value="200"/>

<property name="poolPreparedStatements" value="true"/>

</bean>

然后修改持久化适配器,使用jdbcPersistenceAdapter,示例如下:

 

<persistenceAdapter>

<jdbcPersistenceAdapter dataSource="#mysql-ds"/>

</persistenceAdapter>

这种方式的集群相对 Shared File System Master Slave 更加简单,更容易进行分布式部署。但是,如果数据库失效,那么所有的 ActiveMQ 实例都将失效,因此对数据库的可靠性要求较高 。在实际应用中,通常会结合数据库的主从复制、集群等技术来提高数据库的可靠性 。

(二)Broker - Cluster 模式搭建

  1. 静态 Broker - Cluster:静态 Broker - Cluster 采用静态配置的方式,通过硬编码所有已知 ActiveMQ 实例节点的 URI 地址,在多个 ActiveMQ 实例之间进行消息的路由 。其原理是,在一个 broker 的实例内配置networkConnector,指向其他 broker 的 URI,这样各个 broker 之间就可以建立连接并共享队列和消费者列表,实现消息的转发和共享 。

在activemq.xml中配置static network Connector的示例如下:

 

<networkConnectors>

<networkConnector name="local network" uri="static://(tcp://remotehost1:61616,tcp://remotehost2:61616)"/>

</networkConnectors>

在这个示例中,name属性为该网络连接器指定了一个名称,方便管理和识别;uri属性指定了要连接的远程 broker 的地址,这里通过static协议指定了两个远程 broker 的 TCP 地址和端口 。当一个 broker 接收到消息后,如果本地没有对应的消费者,它会根据配置的networkConnector将消息转发到其他 broker 上,由其他 broker 上的消费者进行处理 。

2. 动态 Broker - Cluster:动态 Broker - Cluster 基于组播动态发现 brokers。其原理是通过组播的形式,让各个 broker 自动发现彼此并建立连接。在这种模式下,broker 在启动时会通过组播地址发送和接收发现消息,从而动态地获取可连接的 broker 地址 。

在activemq.xml中,需要对transportConnectors和networkConnectors进行相关配置修改。例如:

 

<broker name="foo">

<transportConnectors>

<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600" discoveryUri="multicast://default"/>

</transportConnectors>

...

<networkConnectors>

<networkConnector uri="multicast://default"/>

</networkConnectors>

</broker>

在上述配置中,transportConnector的discoveryUri属性指定了组播地址为multicast://default,表示该 broker 将通过这个组播地址进行发现;networkConnector的uri属性也设置为multicast://default,表示通过组播来建立网络连接 。这样,各个 broker 就可以通过组播自动发现彼此并建立连接,实现动态的集群配置 。动态 Broker - Cluster 配置相对灵活,不需要手动硬编码每个 broker 的地址,适合在网络环境变化频繁或需要快速扩展集群的场景中使用 。然而,组播在一些网络环境中可能会受到限制,如防火墙的阻挡等,需要在部署时特别注意网络配置 。

(三)生产环境推荐配置(Master - Slave + Broker - Cluster)

在生产环境中,单一的 Master - Slave 模式虽然能解决单点故障问题,保证消息服务的可靠性,但无法实现负载均衡;而单一的 Broker - Cluster 模式虽能实现负载均衡和消息的分布式处理,但在节点故障时可能会出现消息丢失等问题,无法满足高可用性的严格要求 。因此,将 Master - Slave 模式与 Broker - Cluster 模式结合起来,能够充分发挥两者的优势,提供更可靠、高效的消息服务。

在这种组合配置中,首先搭建 Master - Slave 集群,确保消息的可靠存储和高可用性。通过共享文件系统或 JDBC 等方式实现主从节点之间的数据同步和故障转移 。然后,在 Master - Slave 集群的基础上,搭建 Broker - Cluster,实现消息的负载均衡和分布式处理 。各个 Master 和 Slave 节点通过networkConnector相互连接,形成一个更大的集群网络 。

具体的配置步骤如下:

  1. 按照前面介绍的方法,完成 Master - Slave 模式的搭建,无论是 Shared File System Master Slave 还是 JDBC Master Slave 。
  1. 在每个 broker 的activemq.xml文件中,添加networkConnector配置,实现 Broker - Cluster。例如:
 

<networkConnectors>

<networkConnector uri="static:(tcp://broker1:61616,tcp://broker2:61617)" duplex="true"/>

</networkConnectors>

这里假设已经搭建了两个 broker 节点,分别为broker1和broker2,通过static协议配置了它们之间的网络连接,duplex="true"表示启用双向连接,即两个 broker 之间可以相互发送和接收消息 。

3. 配置客户端连接。客户端使用failover协议连接到集群,例如:

 

ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("failover:(tcp://broker1:61616,tcp://broker2:61617)?randomize=false&priorityBackup=true");

在这个示例中,failover协议表示当一个 broker 节点不可用时,客户端会自动切换到其他可用节点;randomize=false表示按列表顺序调用,不随机选择节点;priorityBackup=true表示当randomize为false时,优先选择第一个节点作为主节点 。

通过这种 Master - Slave + Broker - Cluster 的组合配置,既保证了消息服务的高可用性,又实现了负载均衡和分布式处理,能够满足生产环境中复杂、高并发的业务需求 。

相关文章:

ActiveMQ 集群搭建与高可用方案设计(一)

一、引言 在当今分布式系统盛行的时代&#xff0c;消息中间件扮演着至关重要的角色&#xff0c;而 ActiveMQ 作为一款开源的、功能强大的消息中间件&#xff0c;在众多项目中得到了广泛应用。它支持多种消息传输协议&#xff0c;如 JMS、AMQP、MQTT 等 &#xff0c;能够方便地实…...

MySQL数据操作全攻略:DML增删改与DQL高级查询实战指南

知识点4【MySQL的DDL】 DDL&#xff1a;主要管理数据库、表、列等操作。 库→表&#xff08;二维&#xff09;→列&#xff08;一维&#xff09; 数据表的第一行是 列名称 数据库是由一张或多张表组成 我们先学习在数据库中创建数据表 0、常见的数据类型&#xff1a; 1、…...

RabbitMQ 中的六大工作模式介绍与使用

文章目录 简单队列&#xff08;Simple Queue&#xff09;模式配置类定义消费者定义发送消息测试消费 工作队列&#xff08;Work Queues&#xff09;模式配置类定义消费者定义发送消息测试消费负载均衡调优 发布/订阅&#xff08;Publish/Subscribe&#xff09;模式配置类定义消…...

一种基于重建前检测的实孔径雷达实时角超分辨方法——论文阅读

一种基于重建前检测的实孔径雷达实时角超分辨方法 1. 专利的研究目标与实际问题意义2. 专利提出的新方法、模型与公式2.1 重建前检测(DBR)与数据裁剪2.1.1 回波模型与检测准则2.1.2 数据裁剪效果2.2 数据自适应迭代更新2.2.1 代价函数与迭代公式2.2.2 矩阵递归更新2.3 正则化…...

代购平台如何“说本地话,穿本地衣”

当海外消费者点开一个代购商城&#xff0c;看到满屏机械翻译的中式文案&#xff0c;他们大概率会默默关闭页面。还有数据显示&#xff0c;不符合本地审美的页面设计会导致70%的潜在客户流失&#xff0c;而专业的本地化改造能让订单转化率提升3倍以上。 01 AI翻译&#xff1a;让…...

C++调试(叁):编译qBreakpad并使用其生成Dump文件

目录 1.前言 2.生成Dump文件的第三方库 3.第三方库下载链接 4.编译qBreakpad 5.VS中使用qBreakpad 6.qBreakpad测试程序 前言 在第二篇文章中&#xff0c;我主要讲解了如何使用SetUnhandledExceptionFilter函数设置程序的异常回调&#xff0c;在设置的回调函数中调用MiniDumpWr…...

0基础 | STM32 | TB6612电机驱动使用

TB6612介绍及使用 单片机通过驱动板连接至电机 原因&#xff1a;单品机I/O口输出电流I小 驱动板&#xff1a;从外部引入高电压&#xff0c;控制电机驱动 电源部分 VM&#xff1a;电机驱动电源输入&#xff0c;输入电压范围建议为3.7&#xff5e;12V GND&#xff1a;逻辑电…...

Cycleresearcher:通过自动化评审改进自动化研究

1、引言 迄今为止&#xff0c;整个科学发现过程自动化的挑战在很大程度上仍未解决&#xff0c;特别是在生成和改进符合同行评审工作高标准的研究成果方面。此外&#xff0c;很少有工作涉及迭代反馈的整合&#xff0c;这对保持学术的健全性和新奇至关重要。当前的模型往往难以适…...

深入理解Redis SDS:高性能字符串的终极设计指南

&#x1f4cd; 文章提示 10分钟掌握Redis核心字符串设计 | 从底层结构到源码实现&#xff0c;揭秘SDS如何解决C字符串七大缺陷&#xff0c;通过20手绘图示与可运行的C代码案例&#xff0c;助你彻底理解二进制安全、自动扩容等核心机制&#xff0c;文末附实战优化技巧&#xff…...

【tcp连接windows redis】

tcp连接windows redis 修改redis.conf 修改redis.conf bind * -::*表示禁用保护模式&#xff0c;允许外部网络连接 protected-mode no...

【AI平台】n8n入门6:调用MCP服务(非社区节点)

前言 前边用n8n搭建一个MCP服务&#xff0c;现在&#xff0c;用n8n调用其他服务商提供的MCP服务。本文以高德地图服务为例&#xff0c;记录一下操作过程。 实现案例功能 MCP是啥 MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09;是由Anthropi…...

C++负载均衡远程调用学习之 Dns-Route关系构建

目录 1.LARS-DNS-MYSQL环境搭建 2.LARSDNS-系统整体模块的简单说明 3.Lars-Dns-功能说明 4.Lars-Dns-数据表的创建 5.Lars-Dns-整体功能说明 6.Lars-DnsV0.1-Route类的单例实现 7.Lars-DnsV0.1-Route类的链接数据库方法实现 8.Lars-DnsV0.1-定义存放RouteData关系的map数…...

Linux53 百度网盘运行(下载devtoolset11后仍提示stdc++3.0.29缺失 计划用docker容器隔离运行,计划后续再看)

算了 放弃 都用到docker了 计划先看看系统服务后续再研究吧 百度网盘运行(下载devtoolset11后仍提示stdc3.0.29缺失 计划用docker容器隔离运行 但是由于系统服务未扎实&#xff0c;计划后续再看 重新下了el7的版本 刚才已启动成功 单输入xlock不启动 切换用户也不启动 …...

ASP.NET MVC​ 入门与提高指南八

45. 神经形态计算与 MVC 应用性能革新 45.1 神经形态计算概念 神经形态计算是借鉴生物神经系统的结构和工作原理来设计计算系统。它模仿人脑神经元和突触的工作方式&#xff0c;具备低功耗、高并行性和自适应学习等特性&#xff0c;能在处理复杂感知和认知任务时展现出卓越的…...

Python刷题:流程控制(下)

今天刷的是PythonTip的Python 入门挑战中的题&#xff0c;整体难度不高&#xff0c;适合小白练手以及巩固知识点。下面会进行详细讲解。 每日一句 在无人问津的角落里&#xff0c; 默默努力的人独自发光&#xff0c; 孤独是他们奋斗路上的常客&#xff0c; 却也是成就他们的…...

【Bootstrap V4系列】学习入门教程之 组件-徽章(Badge)和面包屑导航(Breadcrumb)

Bootstrap V4系列 学习入门教程之 组件-徽章&#xff08;Badge&#xff09;和面包屑导航&#xff08;Breadcrumb&#xff09; 徽章&#xff08;Badge&#xff09;一、示例二、根据情境改变外观三、胶囊式徽章&#xff08;Pill badges&#xff09;四、链接 面包屑导航&#xff0…...

结合强化学习RL和SFT各自训练优势,让模型边学边练,从而平衡Zero-RL训练中的模仿和探索!!

摘要&#xff1a;最近在大型推理模型&#xff08;LRMs&#xff09;方面的进展表明&#xff0c;通过简单的基于规则的奖励进行强化学习&#xff08;RL&#xff09;&#xff0c;可以涌现出复杂的行为&#xff0c;例如多步推理和自我反思。然而&#xff0c;现有的零强化学习&#…...

ai之paddleOCR 识别PDF python312和paddle版本冲突 GLIBCXX_3.4.30

这里写自定义目录标题 问题一**解决方案****方法 1&#xff1a;使用符号链接将系统库链接到 Conda 环境** **补充说明****验证修复结果** 问题二&#xff1a;**问题根源****解决方案****1. 确认 TensorRT 安装状态****2. 安装 TensorRT 并配置环境变量****3. 验证 TensorRT 与 …...

C++ 单例模式详解

单例模式是一种创建型设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问该实例。 概念解析 单例模式的核心思想是&#xff1a; 限制类的实例化次数&#xff0c;确保在整个应用程序中只有一个实例存在 提供对该实例的全局访问点 控制共享…...

生成器模式(Builder Pattern)

好问题&#xff01;生成器模式&#xff08;Builder Pattern&#xff09;在现实生活和程序开发中非常常见&#xff0c;它适合创建**“一步一步搭建起来的复杂对象”**。 &#x1f9e0; 一句话定义 生成器模式&#xff08;Builder Pattern&#xff09;是一种将复杂对象的构建过程…...

计算机网络八股文--day4 --传输层TCP与UDP

这是面试中最常考到的一层&#xff1a;端到端&#xff08;也就是进程之间&#xff09;的透明数据传输服务&#xff0c;差错控制和流量控制 该层呈上启下&#xff0c;像上面的资源子网提高服务&#xff0c;并使用下面通信子网的服务 端口&#xff0c;用于唯一标识主机上进程的&…...

大型语言模型个性化助手实现

大型语言模型个性化助手实现 目录 大型语言模型个性化助手实现PERSONAMEM,以及用户资料和对话模拟管道7种原位用户查询类型关于大语言模型个性化能力评估的研究大型语言模型(LLMs)已经成为用户在各种任务中的个性化助手,从提供写作支持到提供量身定制的建议或咨询。随着时间…...

步进电机中断函数解释

STM32 motor111.c 中 HAL_TIM_PeriodElapsedCallback 函数逐行解释 下面我们对 STM32 项目中 motor111.c 文件里的 HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) 函数进行逐行解析&#xff0c;帮助初学者理解每一行代码的作用。此函数是在定时器产生更新中断时被调…...

多把锁以及线程死锁问题

在 Java 中&#xff0c;每一个对象都可以作为一把锁&#xff0c;synchronized 通过获取对象头中的锁标志位来实现同步。当一个线程获取到对象的锁后&#xff0c;其他线程就无法再获取该锁&#xff0c;只能等待获取到锁的线程释放锁之后才能继续执行被 synchronized 修饰的代码块…...

Vue 3 Element Plus 浏览器使用例子

Element Plus 是一个基于 Vue 3 的流行开源 UI 库&#xff0c;提供了一系列的组件&#xff0c;帮助开发者快速构建现代化的用户界面。它的设计简洁、现代&#xff0c;包含了许多可定制的组件&#xff0c;如按钮、表格、表单、对话框等&#xff0c;适合用于开发各种 Web 应用。 …...

NoxLucky:个性化动态桌面,打造独一无二的手机体验

在数字时代&#xff0c;手机桌面的个性化设置已经成为许多人表达自我和展示个性的重要方式。今天&#xff0c;我们要介绍的 NoxLucky&#xff0c;就是这样一款功能强大的动态桌面手机应用。它不仅提供了独家的动态壁纸素材库&#xff0c;还支持将抖音、INS等平台的短视频直接设…...

如何在WORD WPS中输入英语音标 批量给英语标注音标

在我国&#xff0c;英语的学习&#xff0c;已经是贯穿小学到大学的课程&#xff0c;英语学习&#xff0c;关键是听说读写&#xff0c;而听说读&#xff0c;都离不开一个字--音&#xff0c;这就涉及到了英语的音标了。音标&#xff08;Phonetics&#xff09;是表示单词发音的一种…...

RUST变量学习笔记

1&#xff0c;作用域概念 捕获环境 2&#xff0c;所有权概念 Rust则是通过所有权和借用来保证内存安全。很多人不理解为啥说Rust是内存安全的&#xff0c;其实就是在默认情况下&#xff0c;你是写不出内存不安全的代码的。 Rust的所有权并不难理解&#xff0c;它有且只有如下…...

n8n工作流自动化平台的实操:本地化高级部署

一、本地高级部署 1.下载 docker pull docker.n8n.io/n8nio/n8n 2.运行 docker volume create n8n_data docker run -dit --name n8n -p 5678:5678 -v n8n_data:/home/node/.n8n -e N8N_SECURE_COOKIEfalse -e N8N_RUNNERS_ENABLEDtrue -e N8N_ENFORCE_SETTINGS_FIL…...

【Ansible自动化运维实战:从Playbook到负载均衡指南】

本文是「VagrantVirtualBox虚拟化环境搭建」的续篇&#xff0c;深入探索Ansible在自动化运维中的核心应用&#xff1a; ✅ Ansible核心技能&#xff1a;Playbook编写、角色&#xff08;Roles&#xff09;模块化、标签&#xff08;Tags&#xff09;精准控制 ✅ 实战场景覆盖&a…...

数据赋能(210)——质量管理——可靠性原则

概述 数据可靠性原则确保数据的准确性、完整性、一致性和可信性&#xff0c;是决策和业务活动对数据质量的基本要求。在信息化和数字化快速发展的今天&#xff0c;数据已成为企业的重要资产&#xff0c;数据可靠性直接影响到企业的决策质量和业务活动效果。数据可靠性是数据质…...

二、机器学习中Python变量基础

二、Python变量基础 像C语言和Matlab一样&#xff0c;变量名由字母、数字、下划线组成&#xff08;但不能以数字开头&#xff0c;字母区分大小写&#xff09;变量名不能与内置的函数同名。 根据变量是否可以充当容器&#xff0c;将变量类型分为基本类型和高级类型。 基本变量…...

有机玻璃材质数据采集活性炭吸附气体中二氧化硫实验装置

JGQ112Ⅱ有机玻璃材质数据采集活性炭吸附气体中二氧化硫实验装置 一.实验目的 1.熟悉活性炭吸附剂的特性和在SO2气体净化方面的应用。 2.掌握活性炭吸附法的流程和实验过程中各参数的控制方法。 3.了解主要参数变化对吸附效率的影响。 4.掌握吸附等温线概念和测定方法。 二.技术…...

Javase 基础入门 —— 07 接口

本系列为笔者学习Javase的课堂笔记&#xff0c;视频资源为B站黑马程序员出品的《黑马程序员JavaAI智能辅助编程全套视频教程&#xff0c;java零基础入门到大牛一套通关》&#xff0c;章节分布参考视频教程&#xff0c;为同样学习Javase系列课程的同学们提供参考。 01 概述 接…...

LangChain:重构大语言模型应用开发的范式革命

2022年10月22日&#xff0c;Harrison Chase在GitHub上提交了名为LangChain的开源项目的第一个代码版本。这个看似普通的代码提交&#xff0c;却悄然开启了一场重塑大语言模型&#xff08;LLM&#xff09;应用开发范式的技术革命。彼时&#xff0c;距离ChatGPT引爆全球人工智能浪…...

【现代深度学习技术】现代循环神经网络04:双向循环神经网络

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上&#xff0c;结合当代大数据和大算力的发展而发展出来的。深度学习最重…...

重塑数学边界:人工智能如何引领数学研究的新纪元

目录 一、人工智能如何重新定义数学研究的边界 &#xff08;一&#xff09;数学与AI的关系&#xff1a;从基础理论到创新思维的回馈 &#xff08;二&#xff09;AI的创造力&#xff1a;突破传统推理的局限 &#xff08;三&#xff09;AI对数学研究的潜在贡献&#xff1a;创…...

链表的回文结构题解

首先阅读题目&#xff1a; 1.要保证是回文结构 2.他的时间复杂度为O(n)、空间复杂度为O(1) 给出思路: 1.首先利用一个函数找到中间节点 2.利用一个函数逆置中间节点往后的所有节点 3.现在有两个链表&#xff0c;第一个链表取头节点一直到中间节点、第二个链表取头结点到尾…...

xLua笔记

Generate Code干了什么 肉眼可见的&#xff0c;在Asset文件夹生成了XLua/Gen文件夹&#xff0c;里面有一些脚本。然后对加了[CSharpCallLua]的变量寻找引用&#xff0c;发现它被XLua/Gen/DelegatesGensBridge引用了。也可以在这里查哪些类型加了[CSharpCallLua]。 public over…...

【Hive入门】Hive与Spark SQL深度集成:通过Spark ThriftServer高效查询Hive表

目录 引言 1 Spark ThriftServer架构解析 1.1 核心组件与工作原理 1.2 与传统HiveServer2的对比 2 Spark ThriftServer部署指南 2.1 环境准备与启动流程 2.1.1 前置条件检查 2.1.2 服务启动流程 2.2 高可用部署方案 2.2.1 基于ZooKeeper的HA架构 3 性能优化实战 3.…...

快速掌握--cursor

Cursor - The AI Code Editor 官网下载安装 详细教程&#xff1a;cursor 下载安装使用&#xff08;保姆教程&#xff09;_cursor下载-CSDN博客 不知道为啥&#xff0c;第一次给我用的是繁体回答 然后改了一下询问方式 codebase就是告诉ai可以从整个项目中找答案&#xff0…...

Linux之基础开发工具(yum,vim,gcc,g++)

目录 一、软件包管理器 1.1、什么是软件包 1.2、yum具体操作 1.2.1、查看软件包 1.2.2、安装软件 1.2.3、卸载软件 1.2.4、安装源 二、编辑器vim 2.1、vim的基本概念 2.2、vim的基本操作 2.3、vim正常模式命令集 2.4、vim末行模式命令集 2.5、替换模式 2.6、视图…...

【计算机视觉】三维重建: OpenMVS:工业级多视图立体视觉重建框架

深度解析OpenMVS&#xff1a;工业级多视图立体视觉重建框架 技术架构与核心算法1. 系统架构设计2. 核心算法解析稠密点云重建表面重建网格优化 实战全流程指南环境配置硬件要求编译安装&#xff08;Ubuntu&#xff09; 数据处理流程输入准备&#xff08;OpenMVG输出&#xff09…...

C++负载均衡远程调用学习之异步消息任务功能与连接属性

目录 1.LarV0.11-异步消息机制的event_loop增添属性分析 2.LARS 3.LarV0.11异步消息发送机制的实现及测试 4.LarV0.11异步消息任务机制bug修复和效果演示 5.LarV0.12链接参数属性的绑定 1.LarV0.11-异步消息机制的event_loop增添属性分析 ## 4) 事件触发event_loop ​ …...

内存性能测试方法

写于 2022 年 6 月 24 日 内存性能测试方法 - Wesley’s Blog dd方法测试 cat proc/meminfo console:/ # cat proc/meminfo MemTotal: 3858576 kB MemFree: 675328 kB MemAvailable: 1142452 kB Buffers: 65280 kB Cached: 992252 …...

游戏引擎学习第256天:XBox 控制器卡顿和修复 GL Blit 伽玛问题

回顾并为今天定下基调 今天的主要任务是让我们的性能分析工具正常工作&#xff0c;因为昨天已经完成了结构性工作。现在&#xff0c;剩下的工作大部分应该是调试和美化。性能分析工具现在应该已经基本可用了。昨天我们在这个方面取得了很大的进展。 接下来&#xff0c;我们将…...

4.29-4.30 Maven+单元测试

单元测试&#xff1a; BeforeAll在所有的单元测试方法运行之前&#xff0c;运行一次。 AfterAll在所有单元测试方法运行之后&#xff0c;运行一次。 BeforeEach在每个单元测试方法运行之前&#xff0c;都会运行一次 AfterEach在每个单元测试方法运行之后&#xff0c;都会运行…...

Android 端如何监控 ANR、Crash、OOM 等严重问题

在移动互联网时代&#xff0c;Android 应用已经成为我们生活中不可或缺的一部分。从社交聊天到在线购物&#xff0c;从娱乐消遣到办公学习&#xff0c;几乎每个人的手机里都装满了各式各样的应用。然而&#xff0c;作为开发者&#xff0c;咱们得面对一个残酷的现实&#xff1a;…...

Spring Boot 微服务打包为 Docker 镜像并部署到镜像仓库实战案例

案例项目素材可以拉取我github上的&#xff1a; https://github.com/AcademicTECHNERD/SpringCoudEurekaDemo 下面的案例将把我的product-service&#xff08;也就是提供者&#xff09;打包为镜像 执行maven命令&#xff1a; mvn clean package -DskipTests在根目录加一个dock…...

springAop代理责任链模式源码解析

目录 两次匹配 Bean 后置处理器中的匹配 方法调用时的匹配 Bean后置处理器中Advisor匹配流程 方法调用时的匹配 Jdk cglib 小小总结 Advisor 收集与排序 责任链执行过程 两次匹配 Bean 后置处理器中的匹配 在 Bean 初始化过程中&#xff0c;Spring 会通过 Bean 后置…...