activeMQ 填坑记

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 前言MQ是现在大型系统架构中必不可少的一个重要中间件,之前有偏文章《MQ(消息队列)常见的应用场景解析》介绍过MQ的应用场景,现在流行的几个MQ是rabbitmq,rocketma,kafka,这几个MQ比较最容易找到相关的文章,而也有些系统使用的是activemq,因activemq是相对比较传统的MQ,在使用过程中还是会遇到很多坑,这里简单列举几个大家可能会遇到的问题,把自己使用acitvemq的经验和大家分享一下。

前言

MQ是现在大型系统架构中必不可少的一个重要中间件,之前有偏文章《MQ(消息队列)常见的应用场景解析》介绍过MQ的应用场景,现在流行的几个MQ是rabbitmq,rocketma,kafka,这几个MQ比较最容易找到相关的文章,而也有些系统使用的是activemq,因activemq是相对比较传统的MQ,在使用过程中还是会遇到很多坑,这里简单列举几个大家可能会遇到的问题,把自己使用acitvemq的经验和大家分享一下。

Mysql 持久化

现在大家使用MQ,基本都是会把数据进行持久化,MQ默认存储持久化数据使用kahaDB,但是鉴于大家对mysql比较熟悉,很多人会选择mysql进行数据的持久化,因为mysql查看数据还是比较方便的。如果需要把持久化方式改为mysql,则需要修改如下配置:

 <persistenceAdapter>
            <jdbcPersistenceAdapter dataDirectory="${activemq.data}" dataSource="#mysql-ds" createTablesOnStartup="false" useDatabaseLock="false"/>
            <!-- 下面是默认的kahaDB方式,注释掉 -->
        <!-- <kahaDB directory="${activemq.data}/kahadb"/> -->
        </persistenceAdapter>

这里的配置有几个地方大家需要关注下:

配置 说明
dataDirectory 需要配置和broker 的dataDirectory 一致
dataSource 数据源的选择,关联数据库的具体配置,下文会具体说明
useDatabaseLock 是否使用数据库锁,主要是在程序启动的时候会同步查询数据,导致数据库锁

还需要配置数据库的连接、账号、密码等:

 <!-- MySql DataSource  Setup -->
    <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://0.0.0.0:3306/activemq?relaxAutoCommit=true"/>
        <property name="username" value="root"/>
        <property name="password" value="******"/>
        <property name="poolPreparedStatements" value="true"/>
    </bean>

其中,id 名和上文提到的datasource应该是一样的。否则,不知道连接哪个实例。

数据库连接池问题

启动activemq如果提示数据库的连接池有问题,这可能是少了lib,增加

  • mysql-connector-java-5.1.30.jar
  • commons-dbcp2-2.1.1.jar
  • commons-pool2-2.4.2.jar

三个包,放到lib目录即可

管理界面无法打开

如果正常启动了,但是管理界面无法启动,那么需要修改下管理界面的数据库连接。

使用MQ主要原因之一是MQ性能比传统关系数据库性能要好,但是把MQ数据存储的mysql其实不是一个很好的选择,反其道而行之,虽然这样用的团队不少,但是强烈推荐不要这么做。还是用默认的存储方式,确保性能为主。

activeMQ过期配置

前文说过,activemq性能本来就不是最优的,特别是使用了mysql作为数据库存储工具后,性能更加不靠谱,所以性能优化,是个重要的工作,定期清理MQ的过期信息,就显的非常重要了。

定期清理无效的队列

配置如下:

<destinationPolicy>
            <policyMap>
              <policyEntries>


                <policyEntry queue=">" gcInactiveDestinations="true" inactiveTimoutBeforeGC="10000">
                <deadLetterStrategy>
                    <sharedDeadLetterStrategy processExpired="true" expiration="30000"/>
                </deadLetterStrategy>
                 </policyEntry>



                <policyEntry topic=">" gcInactiveDestinations="true" inactiveTimoutBeforeGC="10000" >
                   
                  <pendingMessageLimitStrategy>
                    <constantPendingMessageLimitStrategy limit="1000"/>
                  </pendingMessageLimitStrategy>
                </policyEntry>

              </policyEntries>
              
            </policyMap>
        </destinationPolicy>

定期自动清理无效的Topic和Queue,这个配置,只会清除设置的时间内,没有被订阅,同时队列没有遗留数据的队列。
同时,对于boker节点,需要设置schedulePeriodForDestinationPurge 参数,表示多长之间执行一次检测。

 <broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost01" dataDirectory="${activemq.data}" 
    useJmx="true" schedulePeriodForDestinationPurge="5000">

设置消息的全局过期时间

开发的时候,大家应该都知道可以设置消息的过期时间,是否有统一设置消息的过期时间呢?
在broker节点下增加如下的配置:

  <plugins>
          <!-- 86400000 为一天,设置为10天过期 -->
            <timeStampingBrokerPlugin ttlCeiling="10000"
            zeroExpirationOverride="10000" />
        </plugins>

为了便于测试,我设置的是10s,当然,生产环境根据自己的是实际设置的会比较长。过期的时间会进入死信,死信也会沿用此时间,到期后,系统就会自动删除信息了。
经过我个人的实践经验,MQ积累的数据达千万级别后,性能下降的比较厉害,定期清理MQ的消息,是优化性能非常重要的一个操作。

总结

现如今,MQ的选择很多,建议还是优先选择rabbitmq、rocketmq或者是kafka,如果已经选择activemq,需要持续关注MQ的消费情况,最好能设置过期时间,定期清理消息队列的数据,避免数据的积累,造成性能的下降。


微信号:itmifen

img_0b5f11cf82776c7f5db7b411032152c9.jpe
image
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
12月前
|
消息中间件 存储 网络协议
我们一起来学RabbitMQ 五:RabbitMQ 应知应会的面试题
我们一起来学RabbitMQ 五:RabbitMQ 应知应会的面试题
130 0
|
消息中间件 Java Linux
activeMQ入门安装
activeMQ入门安装
257 0
activeMQ入门安装
|
消息中间件 Java Linux
消息中间件系列教程(02) -ActiveMQ -安装&入门案例
消息中间件系列教程(02) -ActiveMQ -安装&入门案例
57 0
|
消息中间件 存储 网络协议
常见的RabbitMQ实战居然还能这样搞?
常见的消息队列很多,主要包括 RabbitMQ、Kafka、RocketMQ 和 ActiveMQ,相关的选型可以看我之前的系列, 这篇文章只讲 RabbitMQ,先讲原理,后搞实战。 文章很长,如果你能一次性看完,“大哥,请收下我的膝盖”,建议大家先收藏,啥时需要面试,或者工作中遇到了,可以再慢慢看。 不 BB,直接上思维导图:
|
消息中间件 存储 NoSQL
剑指offer之消息中间件ActiveMQ知识总结
剑指offer之消息中间件ActiveMQ知识总结
217 3
剑指offer之消息中间件ActiveMQ知识总结
|
存储 消息中间件 关系型数据库
小六六带大家来撸撸rocketmq(五)(上)
前言 文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820… 种一棵树最好的时间是十年前,其次是现在
150 0
|
消息中间件 存储 负载均衡
小六六带大家来撸撸rocketmq(五)(下)
前言 文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820… 种一棵树最好的时间是十年前,其次是现在
163 0
|
消息中间件 RocketMQ
小六六带大家来撸撸rocketmq(四)(4)
前言 文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820… 种一棵树最好的时间是十年前,其次是现在
219 0
|
消息中间件 算法 Java
小六六带大家来撸撸rocketmq(四)(2)
前言 文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820… 种一棵树最好的时间是十年前,其次是现在
144 0
|
消息中间件 Dubbo 应用服务中间件
小六六带大家来撸撸rocketmq(四)(3)
前言 文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820… 种一棵树最好的时间是十年前,其次是现在
88 0