ActiveMQ 集群搭建与高可用方案设计(二)
五、高可用方案设计与优化
(一)Zookeeper 在 ActiveMQ 集群中的应用
- 作用:在 ActiveMQ 集群中,Zookeeper 扮演着至关重要的角色。它主要用于选举 Master 节点,通过其内部的选举机制,从众多的 ActiveMQ Broker 节点中挑选出一个作为 Master,其他节点则作为 Slave。只有 Master 节点能够对外提供服务,当 Master 节点因为故障不能正常工作时,Zookeeper 会利用选举机制,迅速从 Slave 节点中选举出一个新的 Master 节点,继续对外提供消息服务,从而有效排除单点故障引起的服务中断,保证了集群的高可用性 。
同时,Zookeeper 还负责维护集群的一致性。它通过分布式协调服务,帮助 ActiveMQ 集群中的各个 Broker 节点保持数据同步。各个 Broker 节点会将一些关键信息,如消息队列的状态、消费者的订阅信息等,存储在 Zookeeper 的节点上。当某个 Broker 节点发生变化时,Zookeeper 会及时通知其他节点,使它们能够同步更新状态,确保整个集群的数据一致性 。
- Zookeeper 集群搭建步骤:
-
- 下载与解压:从 Zookeeper 官方网站(Apache ZooKeeper )下载合适版本的安装包,如apache-zookeeper-3.8.0-bin.tar.gz。下载完成后,将安装包上传到服务器,使用命令tar -zxvf apache-zookeeper-3.8.0-bin.tar.gz解压到指定目录,例如/usr/local/zookeeper 。
-
- 配置文件修改:进入/usr/local/zookeeper/conf目录,将zoo_sample.cfg文件复制一份并改名为zoo.cfg。编辑zoo.cfg文件,修改以下关键配置:
tickTime=2000 # 基本时间单元,以毫秒为单位,用于心跳检测等
initLimit=10 # Leader和Follower之间初始连接时能容忍的最多心跳数
syncLimit=5 # Leader和Follower之间请求和应答之间能容忍的最多心跳数
dataDir=/usr/local/zookeeper/data # 数据存储目录,需要提前创建该目录
clientPort=2181 # 客户端连接端口
server.1=192.168.1.100:2888:3888 # 配置集群中的服务器,格式为server.id=ip:port1:port2,id为服务器的唯一标识,port1用于Leader和Follower之间的通信,port2用于选举
server.2=192.168.1.101:2888:3888
server.3=192.168.1.102:2888:3888
- 创建 myid 文件:在dataDir指定的目录(/usr/local/zookeeper/data)下创建myid文件,文件内容为当前服务器的id值。例如,在192.168.1.100服务器上,myid文件内容为1;在192.168.1.101服务器上,myid文件内容为2;在192.168.1.102服务器上,myid文件内容为3 。
- 启动 Zookeeper 集群:分别在三台服务器上进入/usr/local/zookeeper/bin目录,执行./zkServer.sh start命令启动 Zookeeper 服务。可以使用./zkServer.sh status命令查看服务状态,正常情况下,会有一个节点被选举为 Leader,其他节点为 Follower 。
- ActiveMQ 与 Zookeeper 集成配置:在 ActiveMQ 的activemq.xml配置文件中,修改persistenceAdapter元素,使用replicatedLevelDB实现基于 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 中存储选举信息和数据同步的路径 。
(二)消息持久化策略
- KahaDB:KahaDB 是 ActiveMQ 从 5.4 版本开始的默认持久化方式,它基于日志文件进行消息存储 。在activemq.xml文件中,默认配置如下:
<persistenceAdapter>
<kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>
KahaDB 使用一个事务日志和一个索引文件来存储所有的消息地址。消息存储在db-n.log文件中,当文件满了会创建新的文件,n会递增。db.data文件是 BTree 索引文件,用于索引消息数据记录中的消息;db.free文件记录当前db.data文件中哪些页面是空闲的;db.redo文件用于在 KahaDB 消息存储强制退出后启动时恢复 BTree 索引;lock文件表示当前获得 KahaDB 读写权限的 broker 。
优点是性能较好,恢复能力较强,适用于大多数常规场景,对典型的消息使用模式进行了优化 。缺点是在高并发写入场景下,性能可能会受到一定限制,因为它使用自定义 B - Tree 实现来索引独写日志 。
2. LevelDB:LevelDB 是从 ActiveMQ 5.8 之后引进的一种基于文件的本地数据库存储形式 。配置示例如下:
<persistenceAdapter>
<levelDB directory="activemq-data"/>
</persistenceAdapter>
它提供比 KahaDB 更快的持久性,因为它不使用自定义 B - Tree 实现来索引独写日志,而是使用基于 LevelDB 的索引 。不过,目前 ActiveMQ 官网对于 LevelDB 和 KahaDB 的选择没有明确的定论,虽然 LevelDB 性能更优越,但 ActiveMQ 仍然默认使用 KahaDB 。
3. JDBC:JDBC 方式是将消息持久化到数据库中 。配置步骤如下:
- 添加驱动包:将 MySQL 等数据库的驱动包添加到 ActiveMQ 的lib文件夹 。
- 配置数据源:在activemq.xml文件中添加数据源配置,例如:
<bean id="mysql-ds" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://192.168.1.100:3306/activemq?relaxAutoCommit=true"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
<property name="maxTotal" value="200"/>
<property name="poolPreparedStatements" value="true"/>
</bean>
- 修改持久化适配器:修改persistenceAdapter元素,使用jdbcPersistenceAdapter,如下:
<persistenceAdapter>
<jdbcPersistenceAdapter dataSource="#mysql-ds" createTablesOnStartup="true"/>
</persistenceAdapter>
createTablesOnStartup属性表示是否在启动时创建数据表,默认值是true 。
JDBC 方式的优点是数据存储在数据库中,便于管理和查询,与数据库相关的工具和技术可以直接应用 。缺点是数据库的读写性能可能不如基于文件的存储方式,尤其是在高并发场景下,频繁的数据库操作可能会成为性能瓶颈,并且依赖于数据库的稳定性,如果数据库出现故障,会影响 ActiveMQ 的正常运行 。
4. 适用场景分析:如果应用场景对性能要求较高,且数据量不是特别大,KahaDB 和 LevelDB 是比较好的选择,它们基于文件存储,读写速度相对较快 。对于需要与数据库紧密结合,或者对数据的管理和查询有较高要求的场景,JDBC 方式更为合适,例如在一些需要对消息数据进行复杂统计分析的业务中 。
(三)客户端连接与故障转移
- failover 协议:客户端使用failover协议连接到 ActiveMQ 集群中的 broker,该协议提供了故障转移和自动重连的功能 。连接示例如下:
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("failover:(tcp://broker1:61616,tcp://broker2:61616,tcp://broker3:61616)?randomize=false&priorityBackup=true");
在这个示例中,failover协议后面的括号内列出了多个 broker 的地址和端口,客户端会尝试依次连接这些 broker 。
2. 故障转移机制原理:当客户端使用failover协议连接到集群时,它会按照配置的顺序尝试连接各个 broker。如果当前连接的 broker 出现故障,客户端会立即检测到连接中断,然后根据配置的策略,自动尝试连接到其他可用的 broker 。例如,在上述示例中,如果broker1出现故障,客户端会自动尝试连接broker2,如果broker2也不可用,会继续尝试连接broker3 。
randomize=false表示按列表顺序调用,不随机选择节点;priorityBackup=true表示当randomize为false时,优先选择第一个节点作为主节点 。这样,在集群中某个节点出现故障时,客户端能够快速切换到其他可用节点,保证消息的发送和接收不受影响,从而提高了系统的可用性和稳定性 。
3. 配置参数说明:除了上述的randomize和priorityBackup参数外,还有一些其他常用的配置参数 。initialReconnectDelay参数用于设置首次重连的延迟时间,单位是毫秒,例如initialReconnectDelay=1000表示首次重连延迟 1 秒,这可以避免在网络瞬间波动时频繁重连 。maxReconnectAttempts参数用于设置最大重连次数,默认值为-1,表示无限次重连,如果设置为一个具体的数值,如maxReconnectAttempts=5,则当重连次数达到 5 次后,客户端将不再尝试重连 。useExponentialBackOff参数用于设置是否使用指数退避算法来调整重连间隔,设置为true时,重连间隔会随着重连次数的增加而指数级增长,避免在故障未恢复时过于频繁地重连,影响系统性能 。
(四)性能优化建议
- 内存配置:合理配置 ActiveMQ 的内存参数对于提升性能至关重要。可以通过修改ACTIVEMQ_OPTS环境变量来调整 JVM 的堆内存大小。例如,在启动 ActiveMQ 的脚本中,将ACTIVEMQ_OPTS设置为-Xms512m -Xmx1024m,表示初始堆内存为 512MB,最大堆内存为 1024MB 。如果系统中消息量较大,并且需要处理大量的并发请求,可以适当增加堆内存的大小,但也要注意不要设置过大,以免导致垃圾回收时间过长,影响系统的响应速度 。同时,可以根据实际情况调整新生代和老年代的比例,例如使用-XX:NewRatio=2表示新生代和老年代的比例为 1:2,以优化垃圾回收的性能 。
- 线程池调整:ActiveMQ 使用线程池来处理消息的接收、发送和其他任务。可以通过修改activemq.xml配置文件中的线程池参数来优化性能 。例如,调整transportConnectors中的executor参数,增加线程池的大小,以提高处理并发连接的能力 。默认情况下,executor的配置如下:
<transportConnectors>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600">
<transportParam name="executor" value="threadPool"/>
</transportConnector>
</transportConnectors>
可以在broker元素中添加threadPool的配置,如:
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="myBroker" dataDirectory="${activemq.data}">
<bean id="threadPool" class="org.apache.activemq.util.ServiceStoppingTaskExecutor">
<property name="corePoolSize" value="20"/>
<property name="maximumPoolSize" value="100"/>
<property name="keepAliveTime" value="30000"/>
</bean>
...
</broker>
其中,corePoolSize表示线程池的核心线程数,maximumPoolSize表示线程池的最大线程数,keepAliveTime表示线程在空闲状态下的存活时间,单位是毫秒 。根据系统的负载情况,合理调整这些参数,可以提高 ActiveMQ 对并发请求的处理能力 。
3. 网络优化:在网络方面,确保服务器之间的网络带宽充足,减少网络延迟。可以通过优化网络拓扑结构,使用高速网络设备,如千兆网卡、高性能交换机等,来提高网络传输速度 。同时,合理配置防火墙规则,开放 ActiveMQ 所需的端口,避免端口被阻塞导致通信失败 。在 ActiveMQ 的配置中,可以调整transportConnectors的一些网络相关参数,如wireFormat.maxInactivityDuration参数,用于设置连接在多长时间内没有数据传输后会被关闭,适当增大这个值可以避免因短暂的网络波动而导致连接关闭 。例如:
<transportConnectors>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600&wireFormat.maxInactivityDuration=30000"/>
</transportConnectors>
这里将wireFormat.maxInactivityDuration设置为 30000 毫秒(30 秒) 。另外,还可以启用 TCP 的一些优化参数,如TCP_NODELAY,减少网络延迟,在transportConnector的uri中添加wireFormat.tcpNoDelay=true即可 。
六、集群测试与验证
(一)测试工具与环境搭建
- 测试工具选择:在测试 ActiveMQ 集群时,JMeter 是一款常用且功能强大的测试工具。它基于 Java 开发,能够对各种服务进行性能测试,包括 ActiveMQ 消息中间件。JMeter 提供了丰富的组件和插件,方便用户进行各种场景的测试。例如,它可以模拟大量的生产者和消费者并发访问 ActiveMQ 集群,测试集群在高并发情况下的性能表现 。
- 环境搭建步骤:
-
- 安装 Java 环境:由于 JMeter 是基于 Java 的工具,首先需要确保系统中安装了 Java 环境。如果尚未安装,按照前面介绍的方法,安装 JDK 1.8 及以上版本,并配置好 JAVA_HOME、PATH 和 CLASSPATH 等环境变量 。
-
- 下载与安装 JMeter:从 JMeter 官方网站(Apache JMeter - Download Apache JMeter )下载最新版本的 JMeter 安装包。下载完成后,解压安装包到指定目录,例如/usr/local/jmeter 。
-
- 配置 ActiveMQ 相关依赖:为了让 JMeter 能够与 ActiveMQ 进行通信,需要将 ActiveMQ 的客户端库添加到 JMeter 的类路径中。将 ActiveMQ 安装目录下的lib/activemq-all-x.x.x.jar(x.x.x为 ActiveMQ 的版本号)文件复制到 JMeter 安装目录下的lib目录中 。
-
- 启动 JMeter:进入 JMeter 的bin目录,执行jmeter.sh(Linux 系统)或jmeter.bat(Windows 系统)命令启动 JMeter。启动成功后,会出现 JMeter 的图形化界面,在该界面中可以进行各种测试场景的配置 。
(二)功能测试
- 消息的发送与接收测试:在 JMeter 中创建一个线程组,设置线程数为 10(可根据实际情况调整),表示模拟 10 个并发的生产者或消费者。在线程组中添加一个 JMS Point to Point Sampler,配置如下:
-
- QueueConnectionFactory:填写 ActiveMQ 的连接工厂地址,例如tcp://192.168.1.100:61616(根据实际的 ActiveMQ 服务器地址和端口修改) 。
-
- JNDI name Request queue:指定发送消息的队列名称,如testQueue 。
-
- Content:设置发送的消息内容,例如 “Hello, ActiveMQ Cluster!” 。
-
- Initial Context Factory:填写org.apache.activemq.jndi.ActiveMQInitialContextFactory 。
-
- Provider URL:同样填写 ActiveMQ 的服务器地址和端口 。
启动测试后,观察 JMeter 的结果树,查看是否成功发送和接收消息。如果在结果树中能够看到发送的消息内容以及接收的响应,说明消息的发送与接收功能正常 。
- 持久化消息处理测试:修改上述测试配置,将消息的发送模式设置为持久化模式。在 JMS Point to Point Sampler 中,找到Delivery Mode选项,设置为PERSISTENT 。然后发送一定数量的持久化消息,例如 100 条。发送完成后,关闭 ActiveMQ 集群中的一个节点,再重新启动该节点。启动成功后,再次使用 JMeter 进行消息接收测试,检查是否能够接收到之前发送的持久化消息。如果能够正常接收,说明持久化消息处理功能正常,即使节点故障重启,持久化的消息也不会丢失 。
- 集群节点间消息同步测试:在集群中创建多个队列,例如queue1、queue2、queue3 。使用 JMeter 分别向不同节点上的队列发送消息,然后在其他节点上尝试接收这些消息。例如,向节点 1 上的queue1发送消息,然后在节点 2 和节点 3 上接收queue1的消息。如果能够在其他节点上成功接收到消息,说明集群节点间的消息同步功能正常,消息能够在集群中的各个节点之间正确传递 。
(三)高可用测试
- 模拟 broker 节点故障:在 ActiveMQ 集群运行过程中,使用命令行工具或系统管理工具,停止集群中的一个 broker 节点。例如,在 Linux 系统中,可以使用kill -9命令停止 ActiveMQ 进程对应的 PID 。
- 验证故障转移功能:在停止一个 broker 节点后,立即使用 JMeter 进行消息发送和接收测试。观察 JMeter 的测试结果,查看是否能够正常发送和接收消息。同时,查看 ActiveMQ 集群的日志文件,确认是否有其他节点成功接管了故障节点的工作。如果 JMeter 能够正常发送和接收消息,且日志中显示其他节点已接管故障节点的任务,说明集群的自动故障转移功能正常,在节点故障时能够保证消息服务的连续性 。
- 验证消息一致性:在故障转移完成后,检查集群中各个节点上的消息队列状态和消息内容。确保在故障转移过程中,没有消息丢失或重复,消息的顺序和内容与故障前保持一致。可以通过查询 ActiveMQ 的管理界面、数据库(如果使用 JDBC 持久化)或其他相关工具来验证消息的一致性 。
(四)性能测试
- 测试指标设定:在 JMeter 中配置性能测试场景,设定测试指标,如吞吐量(TPS,Transactions Per Second)、响应时间(Response Time)、并发性能(Concurrent Performance)等 。设置线程组的线程数从 10 逐渐增加到 100,模拟不同并发程度的访问。设置测试的持续时间为 10 分钟,以获取足够的测试数据 。
- 测试结果分析:启动性能测试后,JMeter 会生成详细的测试报告。在测试报告中,分析吞吐量指标,如果随着并发数的增加,吞吐量逐渐上升并趋于稳定,说明集群能够有效地处理并发请求;如果吞吐量在某个并发数下出现明显下降,可能表示集群已经达到性能瓶颈 。分析响应时间指标,如果平均响应时间随着并发数的增加而逐渐增加,但仍在可接受范围内,说明集群的响应性能良好;如果响应时间突然大幅增加,可能存在性能问题,需要进一步排查,如网络延迟、线程池耗尽等 。分析并发性能指标,观察集群在高并发情况下的稳定性,是否出现连接超时、消息丢失等异常情况。通过对这些测试结果的分析,可以评估 ActiveMQ 集群的性能表现,并根据分析结果对集群进行优化和调整 。
七、常见问题与解决方案
在搭建和使用 ActiveMQ 集群的过程中,可能会遇到各种问题,以下是一些常见问题及对应的解决方案:
(一)连接失败
- 问题描述:客户端无法连接到 ActiveMQ 集群,报出连接超时或拒绝连接的错误。
- 原因分析:
-
- ActiveMQ 服务未启动或端口被占用。例如,在启动 ActiveMQ 时,由于系统中其他进程占用了 ActiveMQ 默认的 61616 端口,导致 ActiveMQ 无法正常监听该端口,从而使客户端无法连接 。
-
- 防火墙或安全组拦截了客户端与 ActiveMQ 之间的通信端口。在一些服务器环境中,防火墙默认会阻止外部对某些端口的访问,如果没有开放 ActiveMQ 所需的端口,就会导致连接失败 。
-
- 配置的 IP 地址或端口与实际服务不匹配。比如在客户端的连接配置中,错误地填写了 ActiveMQ 服务器的 IP 地址或端口号,就无法建立有效的连接 。
- 解决方案:
-
- 检查 ActiveMQ 状态,在 Linux 系统中,可以使用ps -ef | grep activemq命令查看 ActiveMQ 进程是否存在;在 Windows 系统中,可以通过任务管理器查看 ActiveMQ 服务是否运行 。如果服务未启动,根据前面介绍的启动方法启动 ActiveMQ。
-
- 验证端口监听,在 Linux 系统中,使用netstat -tlnp | grep 端口号命令查看指定端口是否处于监听状态;在 Windows 系统中,可以使用 TCPView 等工具查看端口占用情况 。如果端口被占用,找到占用端口的进程并停止它,或者修改 ActiveMQ 的配置,使用其他未被占用的端口 。
-
- 调整防火墙规则,临时关闭防火墙测试(生产环境慎用),如果关闭防火墙后能够正常连接,说明是防火墙的问题。在生产环境中,应该开放 ActiveMQ 所需的端口,如在 CentOS 系统中,使用firewall - cmd --zone = public --add - port = 61616/tcp --permanent命令开放 TCP 协议的 61616 端口,使用firewall - cmd --zone = public --add - port = 8161/tcp --permanent命令开放 Web Console 的 8161 端口,然后执行firewall - cmd --reload命令使配置生效 。
-
- 核对连接配置,确保客户端代码中的连接 URL 与 ActiveMQ 服务器的实际配置一致,包括传输协议、IP 地址和端口号等 。例如,如果 ActiveMQ 配置了 SSL 连接,客户端也需要相应地配置 SSL 相关参数 。
(二)消息丢失
- 问题描述:在消息的发送和接收过程中,出现消息丢失的情况,导致业务数据不一致。
- 原因分析:
-
- 网络问题,网络不稳定或者网络断开可能导致消息在传输过程中丢失。比如在网络波动较大的环境中,消息在从生产者发送到 ActiveMQ 服务器,或者从服务器发送到消费者的过程中,可能会因为网络中断而丢失 。
-
- 系统崩溃,ActiveMQ 服务宕机或者客户端崩溃也可能导致消息丢失。如果在消息尚未持久化到存储介质时,ActiveMQ 服务器突然崩溃,内存中的消息就会丢失;同样,客户端在接收消息后但尚未处理完成时崩溃,也可能导致消息丢失 。
-
- 配置问题,错误的配置(如不恰当的持久化设置)可能导致消息在未被处理前丢失。例如,将消息设置为非持久化模式,且在消息处理过程中出现异常,就可能导致消息丢失 。
-
- 其他原因,消息队列满、错误的消息处理逻辑等,也可能导致消息丢失。如果消息队列达到了最大容量,新的消息将无法进入队列,从而导致丢失;另外,如果消费者在处理消息时出现错误,没有进行适当的异常处理,也可能导致消息被错误地丢弃 。
- 解决方案:
-
- 消息持久化,使用 KahaDB、LevelDB 或 JDBC 等持久化方式,确保消息在服务器崩溃等情况下不会丢失 。例如,配置 KahaDB 持久化:
<persistenceAdapter>
<kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>
- 消息确认机制,使用合适的消息确认模式,如 CLIENT_ACKNOWLEDGE,消费者接收到消息后需要显式调用消息的 acknowledge 方法来确认,避免在消息处理过程中丢失 。在代码中,设置消息确认模式的示例如下:
Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
- 事务管理,在消息处理过程中使用事务,确保消息被完整处理。例如,在发送多条消息时,将这些消息放在一个事务中,只有当所有消息都成功发送后,事务才会提交,否则回滚,保证消息的一致性 。
Session session = connection.createSession(true, Session.SESSION_TRANSACTED);
try {
// 发送多条消息的代码
session.commit();
} catch (Exception e) {
session.rollback();
}
- 网络连接和异常处理,优化网络连接,使用重试机制和合理的异常处理策略可以减少因网络问题导致的消息丢失 。在客户端代码中,可以使用failover协议来实现自动重连和故障转移,并且在捕获到网络异常时,进行适当的重试操作 。例如:
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("failover:(tcp://broker1:61616,tcp://broker2:61616,tcp://broker3:61616)?randomize=false&priorityBackup=true");
- 配置优化,合理配置消息队列的大小、消费者的数量等参数,避免系统过载 。在activemq.xml文件中,可以设置destinationPolicy来调整队列的相关参数,如concurrentConsumers设置并发消费者的数量,prefetch设置预取限制等 。
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry queue=">" concurrentConsumers="10" prefetch="100"/>
</policyEntries>
</policyMap>
</destinationPolicy>
(三)性能瓶颈
- 问题描述:ActiveMQ 集群在高并发情况下,出现吞吐量下降、响应时间延长等性能问题。
- 原因分析:
-
- 网络延迟,在分布式场景下,网络延迟对 ActiveMQ 性能的影响尤为明显,特别是在跨地理位置部署时更为显著。例如,客户端与 ActiveMQ 服务器之间的网络带宽不足,导致消息传输速度缓慢 。
-
- 磁盘 I/O 瓶颈,Broker 在处理持久化消息时,需要频繁地进行磁盘读写操作,如果磁盘性能不佳,将极大限制消息的处理效率。比如使用传统的机械硬盘,其读写速度远低于固态硬盘,在高并发写入消息时,容易出现 I/O 瓶颈 。
-
- 内存管理限制,不合理的 JVM 设置可能导致频繁的垃圾回收,从而影响到消息的处理速度。如果 JVM 堆内存设置过小,在处理大量消息时,容易导致内存溢出,引发频繁的垃圾回收,使系统响应变慢 。
-
- 消息持久化策略不佳,选择不合适的持久化策略,或者持久化配置不合理,会影响消息的发送和消费效率。例如,使用 JDBC 持久化时,如果数据库配置不当,可能会导致数据库连接池耗尽,从而影响消息的持久化速度 。
- 解决方案:
-
- 网络优化,使用高质量的网络设备和线路,确保网络通畅,减少网络延迟。例如,升级网络带宽,使用千兆或万兆网络;优化网络拓扑结构,减少网络跳数 。同时,可以启用 TCP 的一些优化参数,如TCP_NODELAY,减少网络延迟,在transportConnector的uri中添加wireFormat.tcpNoDelay=true即可 。
<transportConnectors>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600&wireFormat.tcpNoDelay=true"/>
</transportConnectors>
- 磁盘性能提升,采用 RAID 技术提升磁盘性能和数据安全,或者使用高性能的 SSD 硬盘,以减少数据写入的延迟 。同时,合理规划磁盘的 I/O 容量,避免瓶颈 。在 ActiveMQ 的配置中,可以调整transportConnectors的一些网络相关参数,如wireFormat.maxInactivityDuration参数,用于设置连接在多长时间内没有数据传输后会被关闭,适当增大这个值可以避免因短暂的网络波动而导致连接关闭 。
<transportConnectors>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600&wireFormat.maxInactivityDuration=30000"/>
</transportConnectors>
- 内存优化,根据业务量调整 JVM 堆内存大小,使用现代 GC 算法,如 G1,减少 GC 停顿时间 。在启动 ActiveMQ 的脚本中,可以通过修改ACTIVEMQ_OPTS环境变量来调整 JVM 的堆内存大小 。例如:
export ACTIVEMQ_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC"
- 持久化优化,选择合适的持久化策略,并进行相应的配置优化。如果使用 JDBC 持久化,选择支持高并发写入操作的数据库,如 MySQL、Oracle 等,并调整数据库参数,如连接池大小、缓存策略等,以提高写入性能 。如果使用 KahaDB 或 LevelDB 持久化,可以启用异步写盘,通过配置使得消息的存储过程异步执行,降低磁盘 I/O 对性能的影响 。
<persistenceAdapter>
<kahaDB directory="${activemq.data}/kahadb" asyncWrite="true"/>
</persistenceAdapter>
(四)消息堆积
- 问题描述:消息的生产速度远大于消费速度,导致消息在队列中大量堆积,最终耗尽存储资源。
- 原因分析:
-
- 消费者处理能力不足,消费者的业务逻辑复杂,或者消费者的数量过少,导致无法及时处理接收到的消息 。例如,在一个订单处理系统中,消费者在处理订单消息时,需要进行复杂的业务校验和数据库操作,导致处理一条消息的时间较长,从而造成消息堆积 。
-
- 消息生产突发高峰,在某些业务场景下,如电商促销活动、限时抢购等,会出现消息生产的突发高峰,而系统没有足够的处理能力来应对 。
-
- 消费逻辑错误,消费者的消费逻辑中存在死循环、异常处理不当等问题,导致消费者无法正常消费消息 。比如消费者在处理消息时,捕获到异常后没有进行适当的处理,而是直接退出循环,导致后续消息无法被消费 。
- 解决方案:
-
- 增加消费者数量,通过增加并发消费者的数量,可以提高消息的并行消费能力 。在activemq.xml文件中,可以通过destinationPolicy配置来设置并发消费者的数量 。
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry queue=">" concurrentConsumers="10"/>
</policyEntries>
</policyMap>
</destinationPolicy>
- 优化消费逻辑,简化消费者的业务逻辑,减少不必要的操作,提高消息处理速度 。同时,完善消费逻辑中的异常处理,确保在出现异常时,消费者能够继续正常消费消息 。
try {
// 消费消息的业务逻辑
} catch (Exception e) {
// 异常处理逻辑,记录日志,进行重试等操作
}
- 流量削峰,采用消息队列的流量削峰机制,如设置消息的过期时间,避免无限制堆积 。在activemq.xml文件中,可以为队列设置timeToLive属性,指定消息的过期时间 。
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry queue=">" timeToLive="60000"/> <!-- 消息60秒后过期 -->
</policyEntries>
</policyMap>
</destinationPolicy>
- 消息批量处理,消费者可以采用批量处理的方式,一次从队列中获取多个消息进行处理,减少与 ActiveMQ 服务器的交互次数,提高处理效率 。在客户端代码中,可以设置prefetch参数来调整一次预取的消息数量 。
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://broker:61616?jms.prefetchPolicy.all=100");
八、总结与展望
通过本文的介绍,我们全面深入地了解了 ActiveMQ 集群搭建与高可用方案设计的相关知识。从基础概念入手,详细阐述了 ActiveMQ 的核心概念,包括消息、队列、主题、生产者和消费者等,这些概念是理解和使用 ActiveMQ 的基石 。接着,对集群搭建前的准备工作进行了详细说明,涵盖了环境准备、下载与安装 ActiveMQ 以及配置文件的解读,为后续的集群搭建奠定了坚实的基础 。
在集群搭建实战部分,深入探讨了 Master - Slave 模式和 Broker - Cluster 模式的搭建方法,并针对生产环境推荐了 Master - Slave + Broker - Cluster 的组合配置,这种配置方式充分发挥了两种模式的优势,既保证了高可用性,又实现了负载均衡 。在高可用方案设计与优化方面,详细介绍了 Zookeeper 在 ActiveMQ 集群中的应用,包括选举 Master 节点和维护集群一致性;分析了消息持久化策略,如 KahaDB、LevelDB 和 JDBC 等的特点和适用场景;讲解了客户端连接与故障转移的机制,以及相关的配置参数;还提出了一系列性能优化建议,如内存配置、线程池调整和网络优化等 。
在集群测试与验证环节,介绍了使用 JMeter 进行功能测试、高可用测试和性能测试的方法,通过测试可以及时发现集群中存在的问题,并进行针对性的优化 。最后,对搭建和使用 ActiveMQ 集群过程中可能遇到的常见问题,如连接失败、消息丢失、性能瓶颈和消息堆积等,进行了原因分析,并给出了相应的解决方案 。
展望未来,随着分布式系统和微服务架构的不断发展,消息中间件的需求将持续增长。ActiveMQ 作为一款成熟的开源消息中间件,也将不断演进和发展。未来,ActiveMQ 有望在性能优化、功能扩展和与新兴技术的融合等方面取得更大的突破 。在性能优化方面,将进一步提升消息的处理速度和吞吐量,降低延迟,以满足高并发、低延迟的业务需求 。在功能扩展方面,可能会增加对更多消息协议的支持,提供更丰富的消息处理功能,如消息过滤、消息转换等 。在与新兴技术的融合方面,ActiveMQ 可能会更好地与云计算、容器技术、大数据等技术相结合,为企业提供更全面、高效的消息通信解决方案 。同时,随着安全和隐私问题的日益重要,ActiveMQ 也将加强安全机制的建设,确保消息的安全传输和存储 。总之,ActiveMQ 在未来的消息中间件领域仍将发挥重要作用,为分布式系统的发展提供有力支持 。
相关文章:
ActiveMQ 集群搭建与高可用方案设计(二)
五、高可用方案设计与优化 (一)Zookeeper 在 ActiveMQ 集群中的应用 作用:在 ActiveMQ 集群中,Zookeeper 扮演着至关重要的角色。它主要用于选举 Master 节点,通过其内部的选举机制,从众多的 ActiveMQ Br…...
多协议 Tracker 系统架构与传感融合实战 第六章 多传感器时钟同步与数据对齐
第六章 多传感器时钟同步与数据对齐 摘要 本章围绕多源传感融合系统中——尤其是 IMU 与 UWB——的时钟同步与数据对齐问题展开,系统介绍: 硬件时钟源类型及漂移特性 软件校准策略:NTP/PTP 与自定义心跳同步 多源时钟同步算法:两阶段对齐与漂移补偿 数据缓冲与双队列对齐架…...
【算法基础】插入排序算法 - JAVA
一、算法基础 1.1 什么是插入排序 插入排序是一种简单直观的排序算法,它的工作原理类似于我们打牌时整理手牌的过程。插入排序的核心思想是将数组分为已排序和未排序两部分,每次从未排序部分取出一个元素,插入到已排序部分的适当位置。 1.…...
#Paper Reading# DeepSeek-R1
论文题目: DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning 论文地址: https://arxiv.org/pdf/2501.12948 论文发表于: arXiv 2025年1月 论文所属单位: DeepSeek 论文大体内容 本文提出DeepSeek-R1模型,主要是以DeepSeek-V3[…...
HTML与CSS实现风车旋转图形的代码技术详解
在前端开发中,HTML和CSS是构建网页的基础技术。通过巧妙运用HTML的结构搭建和CSS的样式控制,我们能够实现各种精美的视觉效果。本文将对一段实现旋转图形效果的HTML和CSS代码进行详细解读,剖析其中的技术要点。 一、运行效果 HTML与CSS实现风…...
AWS在跨境电商中的全场景实践与未来生态构建
AWS在跨境电商中的全场景实践与未来生态构建 一、核心应用场景与技术赋能 1. AI驱动运营效率革命 • 智能选品与市场分析:通过Amazon SageMaker机器学习平台,跨境电商企业可构建精准选品模型。陕西自贸试验区案例显示,AI对亚马逊等平台销…...
AWS云服务深度技术解析:架构设计与最佳实践
作为全球市场份额占比32%的云服务提供商(Synergy Research 2023数据),AWS的技术体系已成为企业级应用架构的标杆。本文将深入剖析AWS核心技术组件的实现原理,并附可落地的架构设计范式。 AWS云服务器:中国企业出海的“…...
130. 被围绕的区域
题目链接:130. 被围绕的区域 思路:使用两遍dfs,第一遍找到可以被替换区域的可进入点并记录,第二遍就从所有的可进入点入手遍历区域内所有点并替换。 这是我的思路,感觉还是挺新颖的(应该很少有人这样想我…...
【Linux】进程优先级与进程切换理解
🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:Linux 目录 前言 一、进程优先级 1. 什么是进程优先级 2. 为什么有进程优先级 3. 进程优先级的作用 4. Linux进程优先级的本质 5. 修改进程优先级 二、进…...
数据分析与可视化实战:从鸢尾花到乳腺癌数据集
数据分析是现代数据科学中不可或缺的一部分,它帮助我们理解数据、发现模式并做出明智的决策。本文将分享两个实战案例:鸢尾花数据集分析和乳腺癌数据集预处理,展示如何使用Python进行数据探索和可视化。 鸢尾花数据集分析 数据加载与基本统…...
怎样提升社交机器人闲聊能力
怎样提升社交机器人闲聊能力 本文聚焦社交机器人闲聊能力,指出闲聊在社交中意义重大,当前大语言模型(LLMs)驱动社交机器人闲聊存在不足。通过实验评估ChatGPT-3.5、Gemini Pro和LLaMA-2等LLMs闲聊表现,发现其与人类闲聊存在差异。 为此提出基于观察者模型的反馈重定向方…...
图论之幻想迷宫
题目描述: 幻象迷宫可以认为是无限大的,不过它由若干个 NM 的矩阵重复组成。矩阵中有的地方是道路,用 . 表示;有的地方是墙,用 # 表示。LHX 和 WD 所在的位置用 S 表示。也就是对于迷宫中的一个点(x,y),如…...
数学实验Matlab
一、Matlab语言环境和线性代数实验 1.Matlab语言环境 Matlab简介 Matlab:Matrix Laboratry 矩阵实验室 Matlab 提供了强大的科学计算、灵活的程序设计流程、高质量的图形可视化与界面设计等功能,被广泛应用于科学计算、控制系统、信息处理等领域的分…...
AI日报 · 2025年5月03日|Perplexity 集成 WhatsApp,苹果传与 Anthropic 合作开发 Xcode
1、Perplexity AI 功能更新:新增 WhatsApp 集成与多项优化 Perplexity 于 5 月 2 日发布其每周更新摘要,重点包括新增 WhatsApp 集成,用户现可直接在 WhatsApp 内与 Perplexity AI 交互,显著提升了信息获取的便捷性 [1]。此次更新…...
Maven 实现多模块项目依赖管理
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
【JavaScript-Day 2】开启 JS 之旅:从浏览器控制台到 `<script>` 标签的 Hello World 实践
Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...
Windows 中使用dockers创建指定java web 为镜像和运行容器
以下是在 Windows 中使用 Docker 创建 Java Web 应用镜像并运行容器的分步指南: 步骤 1:安装 Docker 下载并安装 Docker Desktop for Windows启动 Docker Desktop,确保使用 WSL 2 后端(推荐)或 Hyper-V。 步骤 2&…...
机器人--MCU
MCU MCU(Microcontroller Unit,微控制器) 是机器人的“神经末梢”,负责 实时控制、传感器接口、低层通信 等关键任务。 作用 MCU的核心作用 功能具体任务示例实时控制电机PWM生成、PID调节、紧急制动机械臂关节控制、无人机电调…...
从融智学视域快速回顾世界历史和主要语言文字最初历史证据(列表对照分析比较)
融智学视域下世界历史与语言文字起源对照分析表 以下从融智学五个基本范畴(物、意、文、道、理义法),梳理主要古代文明的文字起源,及其历史证据,并进行跨文明比较: 文明/文字 物(载体…...
JavaScript性能优化实战(8):缓存策略与离线优化
前言 在Web应用中,性能优化不仅仅是关于代码执行速度,还与资源获取和数据持久化密切相关。合理的缓存策略可以显著减少网络请求,提升应用响应速度,同时有效降低服务器负载和用户流量消耗。离线优化则进一步解决了网络不稳定或断网场景下的用户体验问题,为Web应用提供类似…...
quantization-大模型权重量化简介
原文地址 https://towardsdatascience.com/introduction-to-weight-quantization-2494701b9c0c/ https://towardsdatascience.com/4-bit-quantization-with-gptq-36b0f4f02c34/ 权重量化简介 大型语言模型(LLM) 以其庞大的计算需求而闻名。通常,模型的大小是通过将参…...
unity ScriptObject的使用
1.先定义一个类数据类型 [Serializable] public class FoodItemData { public int foodID; // 食物唯一ID public string foodName; // 食物名称 [TextArea(3, 10)] // 多行文本输入 public string description; // 食物描述 pu…...
广义线性模型三剑客:线性回归、逻辑回归与Softmax分类的统一视角
文章目录 广义线性模型三剑客:线性回归、逻辑回归与Softmax分类的统一视角引言:机器学习中的"家族相似性"广义线性模型(GLMs)基础三位家族成员的统一视角1. 线性回归(Linear Regression)2. 逻辑回归(Logistic Regression)3. Softmax分类(Softm…...
Linux时钟与时间API
深入理解 Linux 时钟与时间 API 时间是计算领域的基础概念之一。在 Linux 系统中,精确可靠的时间管理对于系统日志记录、任务调度、网络通信、性能分析、文件系统操作乃至应用程序的正确运行都至关重要。本文将深入探讨 Linux 中的时钟类型、相关的 C API、使用示例…...
闭包(Closure)及其作用和影响
一、闭包是什么 闭包(Closure)指的是一个函数能够记住并访问其词法作用域(lexical scope),即使该函数在其词法作用域之外执行。换句话说,闭包让函数可以“记住”它被创建时的环境。 闭包的核心特…...
toLua笔记
基本 LuaState luaStatenew LuaState(); luaState.Start(); luaState.DoString("xxx"); luaState.DoFile("yyy.lua"); luaState.Require("zzz");//不要加.lua后缀 luaState.CheckTop();//检查解析器栈顶为空 luaState.Dispose(); luaStatenull;…...
20:深度学习-多层感知器原理
深度学习-多层感知器的原理 ------------------常州龙熙机器视觉培训班-课程资料 1.单层感知机 多层感知机是由感知机推广而来,感知机学习算法(PLA: Perceptron Learning Algorithm)用神经元的结构进行描述的话就是一个单独的。 首先了解下单层感知机: b--常量 …...
高频数据冲击数据库的技术解析与应对方案
目录 前言一、问题现象与影响分析1.1 典型场景表现1.2 核心问题分类 二、失效根源深度剖析2.1 架构设计缺陷2.2 缓存策略缺陷 三、解决方案与最佳实践3.1 缓存架构设计3.1.1 分层缓存架构3.1.2 热点数据识别 3.2 缓存策略优化3.2.1 动态过期时间算法3.2.2 缓存更新策略对比 3.3…...
(37)VTK C++开发示例 ---纹理地球
文章目录 1. 概述2. CMake链接VTK3. main.cpp文件4. 演示效果 更多精彩内容👉内容导航 👈👉VTK开发 👈 1. 概述 将图片纹理贴到球体上,实现3D地球的效果。 该代码使用了 VTK (Visualization Toolkit) 库来创建一个纹理…...
LeetCode - 1137.第N个泰波那契数
目录 题目 解法 动态规划解法 核心思想 执行流程 具体例子 时间复杂度和空间复杂度 代码 题目 1137. 第 N 个泰波那契数 - 力扣(LeetCode) 解法 动态规划解法 核心思想 动态规划是一种通过将复杂问题分解为更小子问题来解决的算法方法。我将…...
智能决策支持系统的系统结构:四库架构与融合范式
前文我们已经了解了智能决策支持系统的基本概念以及基本构件,接下来我们了解一下系统结构。 有关“智能决策支持系统的基本概念”的内容,可看我文章:智能决策支持系统的基本概念与理论体系-CSDN博客 有关“智能决策支持系统的基本构建”的…...
单片机裸机环境下临界区保护
目录 1、直接中断屏蔽法 2、嵌套计数优化法 3、BASEPRI寄存器应用 4、动态优先级调整策略 5、LDREX/STREX指令应用 6、位带别名区原子访问 7、上下文感知保护 8、中断延迟优化技术 在嵌入式系统开发中,临界区保护是确保系统可靠性的关键技术。本文以ARM Cor…...
【数字电路】第六章 时序逻辑电路
一、时序逻辑电路概述 1.逻辑电路的分类 2.时序逻辑电路的一般结构形式 3.时序逻辑电路的描述方法 4.时序逻辑电路按触发器动作特点分类 5.时序逻辑电路按输出信号特点分类 6.常用时序逻辑电路 二、同步时序逻辑电路的分析 1.同步时序逻辑电路的分析方法 TTL触发器允许输入端…...
Spring Boot的GraalVM支持:构建低资源消耗微服务
文章目录 引言一、GraalVM原生镜像技术概述二、Spring Boot 3.x的GraalVM支持三、适配GraalVM的关键技术点四、构建原生镜像微服务实例五、性能优化与最佳实践总结 引言 微服务架构已成为企业应用开发的主流模式,但随着微服务数量的增加,资源消耗问题日…...
MySQL中的窗口函数
深入理解窗口函数(Window Functions) 窗口函数确实经常用于分组后为行分配序号(如1,2,3…),但它的功能远不止于此。窗口函数是SQL中极其强大的分析工具,可以让你在不减少行数的情况下进行复杂计算。 窗口函…...
WITH在MYSQL中的用法
WITH 子句(也称为公共表表达式,Common Table Expression,简称 CTE)是 SQL 中一种强大的查询构建工具,它可以显著提高复杂查询的可读性和可维护性。 一、基本语法结构 WITH cte_name AS (SELECT ... -- 定义CTE的查询…...
人工智能:如何快速筛选出excel中某列存在跳号的单元格位置?
前提: 电脑上必须提前安装好了【office AI】软件工具 方法如下: 1、打开要操作的excel表格,点击上方的【officeAI】,再点击左边的【右侧面板】按钮,就会出现如下右侧的【OfficeAI助手】 2、在OfficeAI助手的聊天框…...
动态功耗与静态功耗
0 英文缩写 SOI(Silicon on Insulator)绝缘体上硅FET(Field-Effect Transistor)场效应管CMOS(Complementary Metal Oxide Semiconductor)互补金属氧化物半导体 1 功耗分类 CMOS电路功耗主要可以通过如下…...
Webug4.0靶场通关笔记10- 第14关链接注入
目录 第14关 链接注入 1.打开靶场 2.源码分析 3.渗透实战 (1)方法1:跳转外部网页 (2)方法2:获取cookie 4.漏洞防御 本文通过《webug靶场第14关 链接注入》来进行渗透实战。 第14关 链接注入 链接注…...
PyTorch_指定运算设备 (包含安装 GPU 的 PyTorch)
PyTorch默认会将张量创建在 CPU 控制的内存中,即:默认的运算设备为 CPU。我们也可以将张量创建在 GPU 上,能够利用对于矩阵计算的优势加快模型训练。 将张量移动到 GPU 上有两种方法: 使用 cuda 方法直接在 GPU 上创建张量使用 …...
Pytorch-CUDA版本环境配置
Pytorch-CUDA版本环境配置 电脑如果是Windows平台下的Nvidia GPU的用户,需配置Pytorch的CUDA版本,分为三步: 1. 安装或更新NVIDA显卡驱动 官方驱动下载地址: https://www.nvidia.cn/Download/index.aspx?langcn 2. 安装CUDA To…...
力扣:24两两交换链表的节点
目录 1.题目描述: 2.算法思路: 3.代码展示: 1.题目描述: 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能…...
SETNX的存在问题和redisson进行改进的原理
首先分布式锁的原理就是当锁不存在时则创建,创建到锁的线程则执行业务。但是在这些操作中会有一些问题,下面是redis命令setNX设置锁的代码片段 if(缓存中有){返回缓存中的数据 }else{获取分布式锁if(获取锁成功){try{查询数据库}finally{释放…...
抽象工厂模式(Abstract Factory Pattern)
很好!你现在已经开始接触设计模式了,而**抽象工厂模式(Abstract Factory Pattern)是一种常用于“创建一系列相关产品”**的经典设计模式。 我会一步步帮你理解: 🧠 一句话解释 抽象工厂模式:提…...
AVIOContext 再学习
这个目前阶段用的不多,暂时不要花费太多精力。 url 的格式不同,使用的传输层协议也不同。这块看代码还没看到自己想的这样。 目前看的信息是:avformatContext 的 io_open 回调函数 在默认情况下叫 io_open_default,在解复用的 av…...
Power Query精通指南1:查询结构设计、数据类型、数据导入与迁移(平面文件、Excel、Web)
文章目录 零、Power Query简介0.1 Power Query 主要功能0.2 Power Query 的优势0.3 Power Query 组件 一、Power Query数据处理基本流程1.1 前期准备1.2 提取1.3 转换1.3.1 Power Query 编辑器界面1.3.2 默认转换1.3.3 自定义转换 1.4 加载1.4.1 自动检测数据类型1.4.2 重命名查…...
Linux 内核升级问题
一、内核升级后启动失败 原因:initramfs 镜像未正确生成或 GRUB 配置错误。 处理步骤如下: 1、进入旧内核启动系统。 2、重新生成 initramfs: sudo dracut -f --regenerate-all 3、更新 GRUB 配置: sudo grub2-mkconfig -o /boo…...
Linux 进程间通信(IPC)详解
进程间通信(IPC)深入解析 一、进程间通信概述 在操作系统里,不同进程间常常需要进行数据交换、同步协调等操作,进程间通信(Inter - Process Communication,IPC)机制应运而生。在Linux系统中&a…...
第3章 Python 3 基础语法001
文章目录 一、缩进规则1. 基本规则2. 示例3. 多级缩进4. 常见错误二、注释规则1. 单行注释2. 多行注释3. 特殊注释4. 注释规范三、代码块规则1. 控制结构2. 函数定义3. 类定义4. 上下文管理器四、总结与最佳实践五、调试技巧以下是 Python 3 基础语法规则的详细说明,涵盖 缩进…...
数据库介绍以及windows下mysql安装
文章目录 1. 前言2. MySQL概述2.1 相关概念2.2 DBMS的分类2.3 数据库交互图2.4 MySQL 介绍 3. MySQL 安装 数据库介绍以及windows下mysql安装 1. 前言 我们浏览的淘宝商品页面详情、刷视频网站的一个个视频,这些数据其实都是存储在公司的存储系统中的。想象一下&…...