ActiveMQ 性能优化与网络配置实战(二)
五、性能优化实战
5.1 基础配置调整
5.1.1 增加并发消费者
在 ActiveMQ 中,增加并发消费者是提高消息处理效率的重要手段之一。通过配置多个消费者并行处理消息,可以充分利用系统资源,加快消息的消费速度,从而提高系统的整体吞吐量。
在activemq.xml文件中,可以通过<destinationPolicy>标签来配置并发消费者。以下是一个配置示例:
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry queue=">" concurrentConsumers="10">
<!-- 其他配置 -->
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
在这个示例中,queue=">"表示对所有队列应用此配置,concurrentConsumers="10"表示每个队列配置 10 个并发消费者 。当有消息到达队列时,这 10 个消费者可以同时从队列中获取消息并进行处理,大大提高了消息的处理速度。
在实际应用中,需要根据系统的负载情况和消息处理的复杂程度来合理调整并发消费者的数量。如果并发消费者数量设置过少,可能无法充分利用系统资源,导致消息处理速度缓慢;而如果设置过多,可能会造成资源竞争,反而降低系统性能。可以通过性能测试工具,如 JMeter,模拟不同的负载场景,观察系统的性能指标,如吞吐量、响应时间等,来确定最佳的并发消费者数量。
5.1.2 调整预取限制
预取限制是指 Broker 一次向消费者发送准备消费的消息数量。合理调整预取限制可以提高消费效率,避免消费者频繁向 Broker 请求消息,减少网络开销和系统资源的浪费。
在activemq.xml文件中,同样可以通过<destinationPolicy>标签来配置预取限制。以下是一个配置示例:
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry queue=">" prefetch="100">
<!-- 其他配置 -->
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
在这个示例中,queue=">"表示对所有队列应用此配置,prefetch="100"表示 Broker 一次向消费者发送 100 条消息 。消费者在处理完这些消息后,再向 Broker 请求新的消息。
不同类型的消费者(队列消费者、主题消费者等)有不同的默认预取限制值 。队列消费者的默认预取限制通常为 1000,主题消费者的默认预取限制通常为 32766(short 类型的最大值) 。在实际应用中,需要根据消费者的处理能力和消息的生产速度来调整预取限制。如果消费者处理能力较强,消息生产速度也较快,可以适当提高预取限制,以减少网络请求次数,提高消费效率;反之,如果消费者处理能力较弱,或者消息生产速度不稳定,应适当降低预取限制,避免消费者积压过多未处理的消息。
5.2 高级配置策略
5.2.1 持久化优化
- 异步写盘:ActiveMQ 在处理持久化消息时,默认是同步写盘,即消息写入磁盘后才返回确认信息给生产者。这种方式虽然保证了数据的可靠性,但在高并发场景下,磁盘 I/O 操作会成为性能瓶颈。通过配置异步写盘,可以将消息的存储过程异步执行,降低磁盘 I/O 对性能的影响。在activemq.xml文件中,可以通过修改<persistenceAdapter>标签来配置异步写盘,如下所示:
<persistenceAdapter>
<kahaDB directory="${activemq.data}/kahadb" journalMaxFileLength="32768" journalArchive="true" asyncWrite="true"/>
</persistenceAdapter>
这里的asyncWrite="true"表示开启异步写盘 ,journalMaxFileLength指定了日志文件的最大长度,journalArchive表示是否启用日志归档 。开启异步写盘后,消息会先写入内存缓冲区,然后由后台线程异步写入磁盘,大大提高了消息的处理速度。
- 数据库持久化优化:当使用 JDBC 进行消息持久化时,选择合适的数据库和调整数据库参数可以提高数据存取速度。对于高并发写入操作,应选择支持高并发写入的数据库,如 MySQL、PostgreSQL 等,并根据实际需求和资源情况进行选择。针对选定的数据库,调整其连接池大小、缓存策略等参数,以提高写入性能。在使用 C3P0 连接池时,可以通过以下配置来调整连接池大小:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activemq?relaxAutoCommit=true"/>
<property name="user" value="root"/>
<property name="password" value="password"/>
<property name="initialPoolSize" value="5"/>
<property name="maxPoolSize" value="20"/>
</bean>
这里的initialPoolSize表示初始连接数,maxPoolSize表示最大连接数 ,通过合理调整这些参数,可以提高数据库连接的复用率,减少连接创建和销毁的开销,从而提升消息持久化的性能。
5.2.2 消息压缩设置
开启消息压缩可以减少网络传输的数据量,提高网络传输效率,尤其在网络带宽有限的情况下,能够显著提升系统性能。然而,消息压缩会增加 CPU 的使用率,因为在发送端需要对消息进行压缩,在接收端需要对消息进行解压缩,这都需要消耗 CPU 资源。因此,在开启消息压缩时,需要权衡 CPU 使用率和网络传输效率之间的关系。
在activemq.xml文件中,可以通过<destinationPolicy>标签来配置消息压缩,如下所示:
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry queue=">" useCompression="true">
<!-- 其他配置 -->
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
这里的queue=">"表示对所有队列应用此配置,useCompression="true"表示开启消息压缩 。当消息生产者发送消息时,ActiveMQ 会对消息进行压缩后再发送,消息消费者接收消息后,会对消息进行解压缩后再处理。
为了确定是否适合开启消息压缩以及选择合适的压缩算法,可以进行性能测试 。使用不同的压缩算法(如 GZIP、Snappy 等)进行测试,观察系统在不同负载下的性能表现,包括网络传输时间、CPU 使用率、消息处理延迟等指标,根据测试结果选择最优的配置。
5.2.3 优先级队列使用
在实际业务中,不同的消息可能具有不同的重要性和紧急程度。通过设置消息优先级,ActiveMQ 可以根据消息的优先级来合理调度资源,优先处理高优先级的消息,确保重要业务的时效性。
在 Java 代码中,可以通过以下方式设置消息优先级:
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.Connection;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
public class PriorityMessageProducer {
public static void main(String[] args) throws Exception {
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer producer = session.createProducer(session.createQueue("PriorityQueue"));
// 设置消息优先级为9(最高优先级)
TextMessage highPriorityMessage = session.createTextMessage("High Priority Message");
highPriorityMessage.setJMSPriority(9);
producer.send(highPriorityMessage);
// 设置消息优先级为1(最低优先级)
TextMessage lowPriorityMessage = session.createTextMessage("Low Priority Message");
lowPriorityMessage.setJMSPriority(1);
producer.send(lowPriorityMessage);
session.close();
connection.close();
}
}
在这个示例中,创建了两个消息,一个设置为最高优先级(9),一个设置为最低优先级(1) 。ActiveMQ 在处理消息时,会优先处理高优先级的消息。
优先级队列适用于多种场景,在电商系统中,订单支付成功的消息可以设置为高优先级,以便及时更新库存、发货等操作;而用户评论、反馈等消息可以设置为低优先级,在系统资源空闲时再进行处理。在金融交易系统中,交易确认消息、资金变动消息等对时效性要求较高,应设置为高优先级,确保交易的准确性和及时性。
5.3 硬件及网络优化
在硬件选择方面,磁盘 I/O 性能对 ActiveMQ 的性能影响较大,尤其是在处理持久化消息时。因此,建议选择高性能的 SSD 硬盘,相比传统的机械硬盘,SSD 硬盘具有更快的读写速度和更低的延迟,能够显著提高消息的存储和读取效率。根据负载情况,合理配置 CPU 和内存也至关重要。如果系统负载较高,消息处理任务繁重,应选择多核高性能的 CPU,以确保能够快速处理大量的消息。同时,根据消息量的大小和系统的并发需求,合理分配内存,避免因内存不足导致系统性能下降。
在网络配置方面,使用高质量的网络设备和线路是确保网络通畅的基础。选择性能优良的交换机、路由器等网络设备,以及稳定可靠的网络线路,可以减少网络故障和丢包现象,提高消息传输的稳定性和可靠性。避免网络环境复杂,减少消息传输延迟。在分布式系统中,应尽量优化网络拓扑结构,减少网络跳数,缩短消息传输路径,降低网络延迟。例如,避免在消息传输路径中出现过多的中间节点或网络设备,确保消息能够快速、直接地从生产者传输到消费者。
为了提升磁盘性能,可以采用 RAID 技术。RAID(Redundant Array of Independent Disks)是一种将多个物理磁盘组合成一个逻辑磁盘阵列的技术,通过数据冗余和并行读写等方式,提升磁盘性能和数据安全。RAID 0 可以提高磁盘的读写速度,但不提供数据冗余;RAID 1 提供数据镜像,保证数据的安全性,但读写性能提升有限;RAID 5 则在提供一定数据冗余的同时,兼顾了读写性能的提升。可以根据实际需求选择合适的 RAID 级别,以提高磁盘的性能和可靠性。
在内存优化方面,根据业务量调整 JVM 堆内存大小是关键。如果堆内存过小,可能会导致频繁的垃圾回收,影响消息的处理速度;而堆内存过大,则可能会浪费系统资源。可以通过性能测试工具,如 JProfiler,对系统进行性能分析,观察 JVM 的内存使用情况和垃圾回收频率,根据分析结果合理调整堆内存大小。使用现代 GC 算法,如 G1(Garbage-First),也可以减少 GC 停顿时间。G1 算法采用了分区的内存管理方式,能够更有效地处理大内存和高并发的场景,减少垃圾回收对系统性能的影响。
5.4 集群与负载均衡
搭建 ActiveMQ 集群环境可以提高系统的可用性和性能,通过多个 Broker 节点协同工作,实现自动的消息负载均衡和故障转移。ActiveMQ 提供了多种搭建集群的方式,其中一种常用的方式是使用网络连接器(Network of Brokers)功能 。在activemq.xml文件中,可以通过<networkConnectors>标签来配置集群连接,如下所示:
<networkConnectors>
<networkConnector uri="static:(tcp://192.168.1.100:61616,tcp://192.168.1.101:61616,tcp://192.168.1.102:61616)" duplex="true" name="cluster-connection">
<staticallyIncludedDestinations>
<queue physicalName="Queue.A"/>
<topic physicalName="Topic.B"/>
</staticallyIncludedDestinations>
</networkConnector>
</networkConnectors>
在这个示例中,uri指定了集群中其他 Broker 的地址和端口,duplex="true"表示连接是双向的,name为该连接指定了一个名称 。staticallyIncludedDestinations用于指定哪些队列和主题的消息会被桥接到远程 Broker,这里配置了Queue.A和Topic.B。
在集群环境下,负载均衡策略对于实现消息的高效处理至关重要。静态负载均衡是通过配置文件静态指定 Broker 节点,实现负载均衡。在activemq.xml文件中,可以通过<destinationPolicy>标签来配置静态负载均衡策略,如下所示:
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry queue=">" loadBalancePolicy="round-robin">
<!-- 其他配置 -->
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
这里的queue=">"表示对所有队列应用此配置,loadBalancePolicy="round-robin"表示采用轮询的负载均衡策略 ,即按照顺序依次将消息分配到各个 Broker 节点上进行处理。
动态负载均衡则是通过监控各节点的负载情况,动态调整消息路由,实现更优的负载均衡效果 。ActiveMQ 可以结合一些负载均衡工具,如 Nginx、HAProxy 等,实现动态负载均衡。以 Nginx 为例,可以通过配置 upstream 模块来定义 ActiveMQ 集群的后端服务器,如下所示:
upstream activemq_cluster {
server 192.168.1.100:61616;
server 192.168.1.101:61616;
server 192.168.1.102:61616;
ip_hash;
}
这里的ip_hash表示根据客户端的 IP 地址进行哈希计算,将请求分配到不同的后端服务器上,实现动态负载均衡。Nginx 会实时监控后端服务器的状态,当某个服务器出现故障时,会自动将请求转发到其他正常的服务器上,确保系统的高可用性。
六、监控与维护
6.1 监控 ActiveMQ 状态
使用 JMX(Java Management Extensions)或 Web Console 可以实时监控 ActiveMQ 的状态和性能指标。
- JMX 监控:JMX 是 Java 平台提供的一种管理和监控 Java 应用程序的技术,通过它可以获取 ActiveMQ 的各种内部状态信息。首先,需要在activemq.xml文件中开启 JMX 支持,如下配置:
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" useJmx="true" dataDirectory="${activemq.data}">
<managementContext>
<managementContext createConnector="true"/>
</managementContext>
<!-- 其他配置 -->
</broker>
这里的useJmx="true"表示启用 JMX,createConnector="true"表示创建 JMX 连接器 。然后,可以使用 JConsole 或 VisualVM 等工具连接到 ActiveMQ 的 JMX 服务,以查看各种性能指标。在命令行中输入jconsole,启动 JConsole 工具,在连接对话框中选择 ActiveMQ 的 JMX 服务地址(默认端口为 1099),输入用户名和密码(可在jmx.password和jmx.access文件中配置),即可连接。连接成功后,可以在 JConsole 中查看 ActiveMQ 的内存使用情况、线程状态、消息队列的消息数量、消费者数量等信息。
- Web Console 监控:ActiveMQ 自带的 Web Console 提供了一个直观的 Web 界面,用于监控和管理 ActiveMQ。要使用 Web Console,需要在activemq.xml文件中引入jetty.xml配置文件,如下配置:
<import resource="file:${activemq.conf}/jetty.xml"/>
然后,通过浏览器访问http://localhost:8161/admin(默认用户名和密码为 admin) ,即可进入 Web Console 界面。在 Web Console 中,可以查看 Queues 和 Topics 的详细信息,包括队列或主题中的消息数量、消费者数量、生产者数量、消息的入队和出队速率等。还可以进行一些简单的管理操作,如暂停或恢复队列、清除队列中的消息等。
6.2 日志分析与问题诊断
通过分析 Broker 的日志文件,可以快速定位问题原因,并采取相应的优化措施。ActiveMQ 的日志文件通常位于activemq-data目录下,主要的日志文件是activemq.log 。在日志文件中,记录了 ActiveMQ 的启动过程、消息的收发情况、错误信息等重要内容。
当出现消息丢失的问题时,可以在日志中查找是否有与消息持久化、消息确认机制相关的错误信息。如果使用的是 KahaDB 持久化策略,可能会出现磁盘空间不足导致消息无法持久化的情况,日志中会记录相关的错误提示,如 “Disk space is full, unable to write message to KahaDB” 。通过分析这些错误信息,可以确定是磁盘空间不足导致的问题,进而采取清理磁盘空间或调整持久化存储位置等措施来解决问题。
在日志中还会记录网络连接相关的信息 。当出现网络连接异常时,如连接超时、连接被拒绝等,日志中会记录详细的错误信息,如 “Connection timed out: connect” 或 “Connection refused” 。通过分析这些信息,可以确定网络连接问题的原因,可能是网络配置错误、防火墙限制、目标服务器故障等,然后针对性地进行排查和修复。
6.3 定期维护和调优
定期的系统检查、性能测试和参数调优,是确保 ActiveMQ 长期稳定运行的关键。建议每周进行一次系统检查,检查内容包括服务器的硬件资源使用情况(如 CPU 使用率、内存使用率、磁盘空间等)、ActiveMQ 的运行状态(如消息队列的堆积情况、消费者的活跃状态等)以及日志文件中是否有异常信息。每月进行一次性能测试,使用 JMeter 等工具模拟不同的负载场景,测试 ActiveMQ 的吞吐量、响应时间等性能指标,根据测试结果调整相关参数,如并发消费者数量、预取限制、JVM 堆内存大小等,以确保 ActiveMQ 在各种负载情况下都能保持良好的性能。
随着业务的发展和系统的演进,ActiveMQ 的配置可能需要不断调整 。当业务量突然增加时,可能需要增加并发消费者的数量,以提高消息的处理速度;当消息内容变得更大时,可能需要调整消息压缩策略或增大网络传输的缓冲区大小。定期的维护和调优可以使 ActiveMQ 始终处于最佳运行状态,为业务系统提供可靠的消息通信支持。
七、案例分析
在某电商项目中,系统使用 ActiveMQ 作为消息中间件,用于订单处理、库存更新、物流通知等业务场景。随着业务量的快速增长,系统逐渐出现消息处理延迟、队列堆积等问题,严重影响了业务的正常运行。通过对系统进行全面分析,发现存在以下性能瓶颈:
- 网络延迟:项目中生产者、消费者和 Broker 分布在不同的机房,网络延迟较高,导致消息传输时间长。
- 磁盘 I/O 瓶颈:采用传统机械硬盘存储持久化消息,磁盘 I/O 性能低下,在高并发情况下成为性能瓶颈。
- 内存管理问题:JVM 堆内存设置不合理,频繁的垃圾回收导致消息处理线程阻塞,影响消息处理速度。
- 消息持久化策略:默认的 KahaDB 持久化策略在处理大规模消息时,索引文件增长过快,导致性能下降。
针对以上问题,采取了以下优化措施:
- 网络配置优化:将传输协议从默认的 TCP 改为 NIO,提高网络传输效率;优化网络拓扑结构,减少网络跳数,降低网络延迟;配置连接池,减少连接创建和销毁的开销,提高连接复用率。
- 磁盘 I/O 优化:将磁盘更换为高性能的 SSD 硬盘,显著提升了磁盘的读写速度;采用 RAID 5 技术,在提高磁盘性能的同时,保证数据的安全性。
- 内存管理优化:根据业务量和系统负载情况,合理调整 JVM 堆内存大小;选用 G1 垃圾回收算法,减少垃圾回收的停顿时间,提高系统的响应速度。
- 消息持久化策略优化:将持久化策略从 KahaDB 改为 LevelDB,LevelDB 在处理大规模消息时具有更高的性能和稳定性;同时,调整持久化相关参数,如增加日志文件大小,减少日志切换频率,提高消息存储效率。
经过上述优化后,系统性能得到了显著提升。消息处理延迟从原来的平均几百毫秒降低到了几十毫秒,消息队列堆积问题得到了有效解决,系统的吞吐量提高了数倍,能够满足业务快速增长的需求。通过这个案例可以看出,全面深入地分析性能瓶颈,并采取针对性的优化措施,对于提升 ActiveMQ 性能和保障系统稳定运行至关重要。在实际项目中,应根据具体业务场景和需求,灵活运用各种优化方法,不断调整和优化系统配置,以达到最佳的性能表现。
八、总结与展望
在本次探索中,我们全面剖析了 ActiveMQ 性能优化与网络配置的关键要点。从基础原理回顾,到深入挖掘性能瓶颈,再到详细阐述网络配置和性能优化的实战技巧,以及监控维护和案例分析,每一个环节都紧密相扣,共同构成了提升 ActiveMQ 性能和稳定性的关键体系。
在网络配置方面,合理选择传输协议,精心配置连接池,谨慎设置端口监听与防火墙规则,灵活运用静态和动态网络连接,能够显著改善消息传输的效率和稳定性。而在性能优化领域,基础配置调整如增加并发消费者、调整预取限制,高级配置策略如持久化优化、消息压缩设置、优先级队列使用,以及硬件及网络优化和集群与负载均衡的应用,都能从不同角度提升 ActiveMQ 的性能,使其更好地适应复杂多变的业务需求。
展望未来,随着分布式系统和微服务架构的持续发展,消息中间件将扮演更为重要的角色。ActiveMQ 也在不断演进,未来有望在以下几个方向取得突破:一是进一步提升性能和可扩展性,以应对日益增长的大规模消息处理需求;二是加强对云原生环境的支持,更好地融入云生态系统,实现更便捷的部署和管理;三是持续优化与其他技术的集成,如与大数据、人工智能等领域的深度融合,为企业数字化转型提供更强大的技术支撑。
相信通过不断的技术探索和实践,ActiveMQ 将在未来的技术浪潮中持续发光发热,为各类企业级应用提供可靠、高效的消息通信服务 。希望本文能为大家在 ActiveMQ 的应用和优化之路上提供有益的参考和帮助,共同推动消息中间件技术的发展与创新。
相关文章:
ActiveMQ 性能优化与网络配置实战(二)
五、性能优化实战 5.1 基础配置调整 5.1.1 增加并发消费者 在 ActiveMQ 中,增加并发消费者是提高消息处理效率的重要手段之一。通过配置多个消费者并行处理消息,可以充分利用系统资源,加快消息的消费速度,从而提高系统的整体吞…...
Python 函数装饰器和闭包(装饰器基础知识)
本章内容: Python 如何计算装饰器句法 Python 如何判断变量是不是局部的 闭包存在的原因和工作原理 nonlocal 能解决什么问题 掌握这些基础知识后,我们可以进一步探讨装饰器: 实现行为良好的装饰器 标准库中有用的装饰器 实现一个参数化装饰器…...
“Everything“工具 是 Windows 上文件名搜索引擎神奇
01 Everything 和其他搜索引擎有何不同 轻量安装文件。 干净简洁的用户界面。 快速文件索引。 快速搜索。 快速启动。 最小资源使用。 轻量数据库。 实时更新。 官网:https://www.voidtools.com/zh-cn/downloads/ 通过网盘分享的文件:Every…...
【Machine Learning Q and AI 读书笔记】- 04 彩票假设
Machine Learning Q and AI 中文译名 大模型技术30讲,主要总结了大模型相关的技术要点,结合学术和工程化,对LLM从业者来说,是一份非常好的学习实践技术地图. 本文是Machine Learning Q and AI 读书笔记的第4篇,对应原…...
linux下安装ollama网不好怎么办?
文章目录 前言kkgithub下载脚本,而不是直接运行修改脚本修改权限还是不行?前言 今天想在linux上面更新一下ollama,于是去到官网: https://ollama.com/download/linux linux下安装ollama还是挺简单的: curl -fsSL https://ollama.com/install.sh | sh我也是特别嗨皮地就…...
(A题|支路车流量推测问题)2025年第二十二届五一数学建模竞赛(五一杯/五一赛)解题思路|完整代码论文集合
我是Tina表姐,毕业于中国人民大学,对数学建模的热爱让我在这一领域深耕多年。我的建模思路已经帮助了百余位学习者和参赛者在数学建模的道路上取得了显著的进步和成就。现在,我将这份宝贵的经验和知识凝练成一份全面的解题思路与代码论文集合…...
RDMA高性能网络通信实践
RDMA高性能网络通信实践 一、背景介绍二、方法设计A.实现方案B.关键技术点三、代码及注释四、注意事项一、背景介绍 远程直接内存访问(RDMA)技术通过绕过操作系统内核和CPU直接访问远程内存,实现了超低延迟、高吞吐量的网络通信。该技术广泛应用于高性能计算、分布式存储和…...
【LeetCode Hot100】图论篇
前言 本文用于整理LeetCode Hot100中题目解答,因题目比较简单且更多是为了面试快速写出正确思路,只做简单题意解读和一句话题解方便记忆。但代码会全部给出,方便大家整理代码思路。 200. 岛屿数量 一句话题意 求所有上下左右的‘1’的连通块…...
图论---有向图的强连通分量(Tarjan求SCC)
强连通分量作用:有向图——>(缩点)有向无环图(DAG) 缩点:将所有连通的分量缩成一个点。 有向无环图作用/好处:求最短路/最长路 可以递推,按照拓扑图从前往后递推. x 是否在某个…...
2025年- H17-Lc125-73.矩阵置零(矩阵)---java版
1.题目描述 2.思路 (1)计算矩阵的行数 (2)计算矩阵的列数 (3)设计一个行列的bool数组 (4)遍历矩阵(二维数组),如果遇到元素0,则把…...
【信息系统项目管理师-论文真题】2023下半年论文详解(包括解题思路和写作要点)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 试题(第一批):论信息系统项目的干系人管理1、写作要点2、解题思路项目干系人管理的过程和执行要点项目中所有干系人如何进行分类管理?试题(第二批):论信息系统项目的工作绩效域1、写作要点2、解题思路绩…...
分享5款开源、美观的 WinForm UI 控件库
前言 今天大姚给大家分享5款开源、美观的 WinForm UI 控件库,助力让我们的 WinForm 应用更好看。 WinForm WinForm是一个传统的桌面应用程序框架,它基于 Windows 操作系统的原生控件和窗体。通过简单易用的 API,开发者可以快速构建基于窗体…...
微软推出数款Phi 4“开放式”人工智能模型
微软周三推出了几款新的“开放式”人工智能模型,其中功能最强大的模型至少在一个基准测试上可与 OpenAI 的 o3-mini 相媲美。所有新的授权模型——Phi 4 mini reasoning、Phi 4 reasoning 和 Phi 4 reasoning plus——都是“推理”模型,这意味着它们能够…...
Python实例题:Python实现Python解释器
目录 Python实例题 题目 实现思路 代码实现 代码解释 词法分析器(Lexer): 词法单元类(Token): 抽象语法树节点类(AST): 语法分析器(Parserÿ…...
【IP101】图像滤波技术详解:从均值滤波到高斯滤波的完整指南
🌟 图像滤波魔法指南 🎨 在图像处理的世界里,滤波就像是给图片"美颜"的魔法工具。让我们一起来探索这些神奇的滤波术吧! 📑 目录 1. 均值滤波:图像的"磨皮"大法2. 中值滤波࿱…...
信息系统项目管理师-软考高级(软考高项)2025最新(六)
个人笔记整理---仅供参考 第六章项目管理概论 6.1PMBOK的发展 6.2项目基本要素 组织过程资产指的是项目上的,国产数据库的使用----安保和安全指的是环境因素 6.3项目经理的角色 6.4价值驱动的项目管理知识体系...
算法-堆、排序算法、矩阵乘法
满二叉树、完全二叉树 二叉树遵循下面的规律,当前节点i(但是其实就是逐级填充): 左节点为 ix2右节点为 i*21父节点为 [i/2] 向下取整 使用数组表示二叉树: (二叉树的深度自上而下,高度自下…...
Java 进阶--集合:告别数组的“僵硬”,拥抱灵活的数据容器
作者:IvanCodes 发布时间:2025年5月1日🫡 专栏:Java教程 大家好!👋 还记得我们上次聊的数组 (Array) 吗?它很基础,性能也不错,但有个致命的缺点:长度一旦定…...
Python 数据智能实战 (6):用户评论深度挖掘
写在前面 —— 从繁杂评论到精准洞察:主题发现与情感趋势分析,驱动产品优化与体验提升 在上篇内容中,我们学习了如何利用 LLM 提升用户分群的精度,以及如何超越传统购物篮分析,挖掘商品间的语义关联。今天,我们将聚焦于电商领域 价值密度最高 的非结构化数据之一——用…...
podman/docker国内可用的docker镜像源(2025-05)
一、添加Docker国内镜像 1、修改 /etc/docker/daemon.json 设置 registry mirror,具体命令如下: sudo vim /etc/docker/daemon.json <<EOF {"registry-mirrors": ["https://docker.1ms.run","https://docker.xuanyuan.me",&q…...
机器人--底盘
机器人底盘 底盘是机器人传感器和机器人主机的载体,也是移动机器人的基本形式。移动机器人通常可以采用轮式和足式进行移动。 也就是机器人底盘可以分为轮式底盘和足式底盘。 足式底盘控制复杂,这里只讨论轮式底盘。 底盘运动学模型 轮式机器人底盘按…...
Seata服务端同步提交事务核心源码解析
文章目录 前言一、doGlobalCommit(同步提交)2.1、closeAndClean()2.2、changeGlobalStatus2.3、doGlobalCommit2.3.1、findGlobalSession 总结 前言 本篇介绍Seata服务端TC如何驱动RM提交事务。 一、doGlobalCommit(同步提交) doG…...
2025五一杯B题五一杯数学建模思路代码文章教学: 矿山数据处理问题
完整内容请看文章最下面的推广群 问题1. 根据附件1中的数据和,建立数学模型,对数据A进行某种变换,使得变换后的结果与数据尽可能接近。计算变换后的结果与数据的误差,并分析误差的来源(如数据噪声、模型偏差等…...
C++11新特性_自动类型推导
decltype 和 auto 均为 C 里用于类型推导的关键字,不过它们在使用方式、推导规则和应用场景上存在显著差异。下面为你详细介绍它们的区别: 1. 推导依据 auto:它依据变量的初始化表达式来推导类型。也就是说,auto 定义的变量必须有…...
【AI论文】ReasonIR:为推理任务训练检索器
摘要:我们提出了ReasonIR-8B,这是第一个专门针对一般推理任务进行训练的检索器。 现有的检索器在推理任务上表现出的收益有限,部分原因是现有的训练数据集侧重于与直接回答它们的文档相关的简短事实查询。 我们开发了一个合成数据生成管道&am…...
嵌入式AI还是一片蓝海
发现其实还是挺多人关注嵌入式和人工智能交叉领域的,随便一个问题,浏览量就27万了,但是这方面的内容确实少得可怜……所以干脆我自己来补点干货。 推荐一本最近很热门的新书——《边缘人工智能:用嵌入式机器学习解决现实问题》。 …...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(13): ておきます ています & てあります
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(13): ておきます &ています & てあります 。 1、前言(1)情况说明(2)工程师的信仰 2、知识点(1)&#x…...
CMake管理外部依赖的模块
在 CMake 中,FetchContent 和 ExternalProject 都是管理外部依赖的模块,但它们的 设计目标、使用场景和执行时机 有本质区别。以下通过对比表格、代码示例和场景分析详细说明它们的区别。 核心区别对比表 特性FetchContentExternalProject执行阶段配置阶…...
[计算机科学#7]:CPU的三阶段,取指令、解码、执行
【核知坊】:释放青春想象,码动全新视野。 我们希望使用精简的信息传达知识的骨架,启发创造者开启创造之路!!! 内容摘要:本文详细介绍了CPU的工作原理,包括其结构…...
向量数据库和关系型数据库的区别,优点,缺点和典型应用场景
向量数据库与关系型数据库的全面对比 向量数据库和关系型数据库是两种截然不同的数据管理系统,各自针对特定的数据模型和查询模式进行了优化。随着人工智能和大数据技术的发展,向量数据库作为新兴的数据库类型,在处理非结构化数据方面展现出…...
《跨越边界:探索跨端框架中通用状态管理方案设计》
一款应用往往需要在多个终端,如Web、移动端、桌面端等同时运行,以满足用户多元化的使用场景。在这复杂的跨端开发领域中,状态管理堪称关键枢纽,直接关乎应用的性能、稳定性以及开发与维护的效率。如何设计一套通用的状态管理方案&…...
PHP之CURL通过header传参数及接收
一、传参数之冒号 注意一点,这里的header数据不是KV结构,而是一个一维数组。 看清楚,注意一点,是这样的结构: $ch curl_init(); $headers [X-Custom-Header: value123,Authorization: Bearer your_token_here // …...
【C++】brpc安装
brpc安装教程 环境:Ubuntu24.04 1 简单安装 即安装到系统环境下,依赖也是依赖apt安装。 官方参考教程 依赖准备 安装依赖: sudo apt-get install -y git g make libssl-dev libgflags-dev libprotobuf-dev libprotoc-dev protobuf-com…...
从0开始的c++知识讲解之字符串(1)
作者作为新手,对于知识的讲解也是边输出内容也是边学习,如有缺陷,请多海涵,但同样,我会帮助你从新手视角看到新手的疑惑,并帮助你解决此疑惑 一,开宗明义,立意先行 string在C里有可…...
Linux 第六讲 --- 工具篇(一)yum/apt与vim
前言: 经过前五讲对Linux基础指令与权限系统的系统学习,相信你已经能在命令行中自如地穿梭于文件丛林,精准调配权限密钥。但真正的Linux玩家,绝不会止步于基础操作的重复劳作。 从今天起,我们将打开Linux的"瑞士…...
xml 和 yaml 的区别
XML 和 YAML/YML 是两种常用的数据序列化格式,用于存储和读取结构化数据。以下是它们的核心区别和使用方法: 1. 格式特性对比 特性XMLYAML/YML语法复杂度标签嵌套,结构严格缩进分层,更简洁可读性较低(冗余标签&#…...
1.67g 雨晨 22635.5305 Windows 11 企业版 23H2 极速增强版
五一特别制作 (主要更新简述) 全程由最新YCDISM2025装载制作 1、可选功能: 添加: Microsoft-Windows-LanguageFeatures-Basic-en-us-Package Microsoft-Windows-LanguageFeatures-OCR-en-us-Package 2、功能增强&a…...
【C++】类和对象(中)——默认成员函数详解(万字)
文章目录 上文链接类的默认成员函数1. 构造函数(1) 什么是构造函数(2) 构造函数的使用 2. 析构函数(1) 什么是析构函数(2) 析构函数的使用(3) 小练习 3. 拷贝构造函数(1) 什么是拷贝构造函数(2) 拷贝构造函数的使用 4. 赋值运算符重载(1) 运算符重载(2) 运算符重载的简单应用(3…...
Ubuntu18 登录界面死循环 Ubuntu进不了桌面
今天碰到这个问题,真是把我恶心到了 网上很多方法都不靠谱,最后我还是自己摸索出一个方法 先进入终端 开机后在登陆界面按下shift ctrl F1(或者F2,一直按)进入tty命令行终端登陆后输入(本人的用户名为hpÿ…...
caffe适配cudnn9.6.0(ai修改代码踩坑)
caffe适配cudnn:https://github.com/dyc2424748461/caffe (测试一下,成没成,反正我看到它用gpu了😶) 因为突发奇想,想要玩easymocap,先是简单使用media跑通了一下,然后过…...
【MySQL数据库】视图
1,视图的基本介绍 视图是一个虚拟表,其内容由查询定义。与真实表一样的是,视图包含带有名称的列和行数据;与真实表不一样的是,视图本身并不在数据库中存储数据。视图的数据变化会影响到基表,基表的数据变化…...
Linux日常使用与运维的AI工具全景调研:效率革命的终极指南
Linux日常使用与运维的AI工具全景调研:效率革命的终极指南 引言:当Linux遇上AI,运维世界正在发生什么? 作为一名Linux系统管理员,你是否还在为以下问题困扰: 深夜被报警短信惊醒,却要手动排查复杂的系统故障?面对海量日志文件,像大海捞针一样寻找关键错误信息?重复…...
Linux——线程(3)线程同步
一、线程同步的引入 通过上面的抢票系统我们发现,有的线程,进行工作(挂锁),当其马上结束工作(解锁),发现外面有很多线程在排队等着加锁执行任务,这个线程解锁后就立马给…...
Redis实现分布式锁
分布式锁是分布式系统中解决资源竞争问题的重要机制。Redis凭借其高性能和原子性操作,成为实现分布式锁的热门选择。本文将详细介绍如何使用Java和Redis实现分布式锁,并重点讲解如何通过Lua脚本保证锁操作的原子性。 一、分布式锁的基本要求 一个可靠的…...
JavaScript如何实现类型判断?
判断一个数据的类型,常用的方法有以下几种: typeofinstanceofObject.prototype.toString.call(xxx) 下面来分别分析一下这三种方法各自的优缺点 typeof typeof的本意是用来判断一个数据的数据类型,所以返回的也是一个数据类型。但是会遇到下…...
Spring MVC 与 FreeMarker 整合
以下是 Spring MVC 与 FreeMarker 整合的详细步骤,包含配置和代码示例: 1. 添加依赖 在 pom.xml 中引入 Spring MVC 和 FreeMarker 的依赖(以 Maven 为例): <!-- Spring Web MVC --> <dependency><gr…...
设计模式简述(十五)观察者模式
观察者模式 描述基本组件使用 描述 观察者模式,顾名思义就是一个对象观察着其他对象,一旦被观察的对象发生变化时,观察者对象也要做出相应动作。 其中,被观察者持有观察者的引用。由观察者主动注入被观察者内(有点像…...
用手机相册教我数组概念——照片分类术[特殊字符][特殊字符]
目录 前言一、现实场景1.1 手机相册的照片管理1.2 照片分类的需求 二、技术映射2.1 数组与照片分类的对应关系2.2 数组索引与照片标签的类比 三、知识点呈现3.1 数组的基本概念3.2 数组在编程中的重要性3.3 数组的定义与初始化3.4 数组的常见操作(增删改查ÿ…...
字符串格式漏洞-[第五空间2019 决赛]PWN5
之前其实也写了一篇,现在再来看。又有新的收获了,于是记录一下 前置知识 格式化字符串漏洞详解-CSDN博客 讲得很清楚,我就不照猫画虎了 实践 main函数 首先先办法泄露我们输入的地址 from pwn import * elfpathlevel0 # ioprocess(elfp…...
数据结构学习之顺序表
在C语言学习到一定阶段之后,接下来我们就进入到了数据结构的部分内容。 目录 数据结构与线性表 顺序表 顺序表分类: 接下来我们要写一段代码实现动态顺序表。 首先我们需要准备三个文件: 1.接下来我们要定义一个数据表 2.当创建号我们的…...