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 的应用和优化之路上提供有益的参考和帮助,共同推动消息中间件技术的发展与创新。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/81229.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++/SDL 进阶游戏开发 —— 双人塔防(代号:村庄保卫战 17)

&#x1f381;个人主页&#xff1a;工藤新一 &#x1f50d;系列专栏&#xff1a;C面向对象&#xff08;类和对象篇&#xff09; &#x1f31f;心中的天空之城&#xff0c;终会照亮我前方的路 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 文章目录 二…

贪心算法精解(Java实现):从理论到实战

一、贪心算法概述 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种在每一步选择中都采取当前状态下最优决策的算法策略。它通过局部最优选择来达到全局最优解&#xff0c;具有高效、简洁的特点。 核心特点&#xff1a; 局部最优选择&#xff1a;每一步都做出当前看…

深度学习框架:PyTorch使用教程 !!

文章目录 一、PyTorch框架简介 1.1 什么是PyTorch 1.2 PyTorch的优势 二、从入门到精通的PyTorch使用教程 2.1 入门阶段 2.1.1 环境安装与配置 2.1.2 Tensor基础操作 2.1.3 自动求导&#xff08;Autograd&#xff09; 2.1.4 构建神经网络&#xff08;nn模块&#xff09; 2.1.5 …

系统架构设计师:设计模式——创建型设计模式

一、创建型设计模式 创建型模式抽象了实例化过程&#xff0c;它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类&#xff0c;而一个对象创建型模式将实例化委托给另一个对象。 随着系统演化得越来越依赖于对象复合而不是类…

Dinero.js - 免费开源的 JavaScript 货币处理工具库,完美解决 JS 浮点数精度丢失问题

今天介绍一个在前后端处理货币的工具库&#xff0c;logo 很可爱&#xff0c;是一只蓝色的招财小猫。 本文封面图底图来自免费 AI 图库 StockCake。 Dinero.js 是一个用于货币计算的 JavaScript 工具库&#xff0c;解决开发者在金融、电商、会计等场景中处理货币时的精度丢失、…

HNUST湖南科技大学-嵌入式考试选择题题库(109道纠正详解版)

HNUST嵌入式选择题题库 1.下面哪点不是嵌入式操作系统的特点。(B) A.内核精简 B.功能强大 C.专用性强 D.高实时性 解析&#xff1a; 嵌入式操作系统特点是内核精简、专用性强、高实时性&#xff0c;而"功能强大"通常指的是通用操作系统&#x…

【工具】Windows批量文件复制教程:用BAT脚本自动化文件管理

一、引言 在日常开发与部署过程中&#xff0c;文件的自动化复制是一个非常常见的需求。无论是在构建过程、自动部署&#xff0c;还是备份任务中&#xff0c;开发者经常需要将某个目录中的 DLL、配置文件、资源文件批量复制到目标位置。相比使用图形界面的复制粘贴操作&#xf…

xray-poc编写示例

禁止未授权扫描和测试行为&#xff01;&#xff01;&#xff01; 1. SQL 时间盲注检测 (Time-Based Blind SQLi) name: generic/time-based-sqli rules:- method: GETpath: "/product?id1 AND (SELECT 1 FROM (SELECT SLEEP(5))a)--"expression: |response.status…

【Day 14】HarmonyOS分布式数据库实战

一、分布式数据库基础 1. 核心概念速记表 术语解释示例场景分布式数据库数据自动同步到同账号设备手机添加商品→平板立即显示KV数据模型键值对存储&#xff08;类似JSON&#xff09;{"cart_item1": {"name":"牛奶","price":10}}数据…

【数据结构】- 栈

前言&#xff1a; 经过了几个月的漫长岁月&#xff0c;回头时年迈的小编发现&#xff0c;数据结构的内容还没有写博客&#xff0c;于是小编赶紧停下手头的活动&#xff0c;补上博客以洗清身上的罪孽 目录 前言&#xff1a; 栈的应用 括号匹配 逆波兰表达式 数制转换 栈的实…

TDA4VM SDK J721E (RTOS/Linux) bootloaders梳理笔记

文章目录 1. 前言2. RTOS BootLoader2.1 引导模式2.2 启动序列2.2.1 流程框图2.2.2 Memory map2.3 镜像格式详解3. Linux BootLoader镜像格式详解启动流程参考1. 前言 TDA4VM的BootLoader包含两部分:RTOS的和Linux的。 2. RTOS BootLoader 这是在SoC上的所有内核运行FreeRTO…

Spring Boot + MyBatis-Plus 的现代开发模式

之前的Maven项目和本次需要的环境配置并不一样 之前使用的是&#xff1a; 传统的 MyBatis 框架&#xff08;非 Spring Boot 环境&#xff09; 手动管理 SqlSession 使用了 .xml 的 Mapper 映射文件 没有 Spring 容器管理&#xff08;没有 Service / RestController 等&…

【Quest开发】极简版!透视环境下抠出身体并能遮挡身体上的服装

前两天发了一个很复杂的版本&#xff0c;又鼓捣了一下发现完全没有必要。我之前的理解有点偏&#xff08;不是错误的但用法错了&#xff09;&#xff0c;但是有一些小伙伴收藏了&#xff0c;害怕里面的某些东西对谁有用&#xff0c;所以写了一篇新的&#xff0c;前两步配置环境…

vue 常见ui库对比(element、ant、antV等)

Element UI 1. 简介 Element UI 是一个基于 Vue 2 和 Vue 3 的企业级 UI 组件库&#xff0c;提供了丰富的组件和主题定制功能。官方网站&#xff1a;Element UI 2. 主要特点 丰富的组件&#xff1a;包括表单、表格、布局、导航、弹窗等多种组件。主题定制&#xff1a;支持主…

MATLAB画一把伞

% 伞的参数num_ribs 5; % 伞骨数量修改为5R 1; % 伞的半径height 0.5; % 伞的高度handle_length 2; % 伞柄长度semicircle_radius 0.26; % 伞柄末端半圆的半径% 生成伞叶网格theta linspace(0, 2*pi, 100);phi linspace(0, pi/2, 50);[Theta, Phi] meshgrid(theta, phi…

如何在 Go 中实现各种类型的链表?

链表是动态内存分配中最常见的数据结构之一。它由一组有限的元素组成&#xff0c;每个元素&#xff08;节点&#xff09;至少占用两块内存&#xff1a;一块用于存放数据&#xff0c;另一块用于存放指向下一个节点的指针。本文教程将说明在 Go 语言中如何借助指针和结构体类型来…

新一代机载相控阵雷达的发展

相控阵雷达以其优越的性能在军事领域中有着广阔的应用前景&#xff0c;但由于复杂的技术、昂贵的造价使其应用范围还存在一定的局限性。然而&#xff0c;国内外对相控阵技术的研究非常重视&#xff0c;并取得了丰硕的成果。 军用相控阵雷达主要分为陆基、海基和空基几种类型。 …

多数元素题解(LC:169)

169. 多数元素 核心思想&#xff08;Boyer-Moore 投票算法&#xff09;&#xff1a; 解题思路&#xff1a;可以使用 Boyer-Moore 投票算法、该算法的核心思想是&#xff1a; 维护一个候选元素和计数器、初始时计数器为 0。 遍历数组&#xff1a; 当计数器为 0 时、设置当前元…

数据库 AI 助手测评:Chat2DB、SQLFlow 等工具如何提升开发效率?

一、引言:数据库开发的 “效率革命” 正在发生 在某互联网金融公司的凌晨故障现场,资深 DBA 正满头大汗地排查一条执行超时的 SQL—— 该语句涉及 7 张核心业务表的复杂关联,因索引缺失导致全表扫描,最终引发交易系统阻塞。这类场景在传统数据库开发中屡见不鲜:据 Gartne…

【中间件】bthread效率为什么高?

bthread效率为什么更高&#xff1f; 1 基本概念 bthread是brpc中的用户态线程&#xff08;也可称为M:N线程库&#xff09;&#xff0c;目的是&#xff1a;提高程序的并发度&#xff0c;同时降低编码难度&#xff0c;在多核cpu上提供更好的scalability和cache locality。其采用…