ActiveMQ 填坑记
前言
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
ActiveMQ 填坑记的更多相关文章
- UiAutomator2.0升级填坑记
UiAutomator2.0升级填坑记 SkySeraph May. 28th 2017 Email:skyseraph00@163.com 更多精彩请直接访问SkySeraph个人站点:www.sk ...
- Android项目开发填坑记-Fragment的onBackPressed
Github版 CSDN版 知识背景 Fragment在当前的Android开发中,有两种引用方式,一个是 Android 3.0 时加入的,一个是supportV4包中的.这里简称为Fragment ...
- Android项目开发填坑记-Fragment的onAttach
背景 现在Android开发多使用一个Activity管理多个Fragment进行开发,不免需要两者相互传递数据,一般是给Fragment添加回调接口,让Activity继承并实现. 回调接口一般都写 ...
- Android项目开发填坑记-so文件引发的攻坚战
故事的最初 我负责的项目A要求有播放在线视频的功能,当时从别人的聊天记录的一瞥中发现百度有相关的SDK,当时找到的是Baidu-T5Player-SDK-Android-1.4s,项目中Demo的so ...
- minikube windows hyperx填坑记
minikube windows hyperx填坑记 安装了一天半,还是没行,先放弃 开始 minikube start --vm-driver=hyperv --hyperv-virtual-swi ...
- 浅谈html5 video 移动端填坑记
这篇文章主要介绍了浅谈html5 video 移动端填坑记,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 本文介绍了html5 video 移动端填坑记,分享给大家,具体 ...
- Java web 开发填坑记 2 -如何正确的创建一个Java Web 项目
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/72566261 本文出自[赵彦军的博客] Java web 开发填坑记 1-如何正确 ...
- Appium+python自动化(十三)- 输入中文 - 一次填坑记(超详解)
简介 无论你在哪里,在做什么都会遇到很多坑,这些坑有些事别人挖的,有些是自己挖的.别人挖的叫坑人,自己挖的叫自杀,儿子挖的叫坑爹.因此在做app自动化道路上也不会是一帆风顺的,你会踩很多坑,这些坑和你 ...
- Cloudera Manager 5.9 和 CDH 5.9 离线安装指南及个人采坑填坑记
公司的CDH早就装好了,一直想自己装一个玩玩,最近组了台电脑,笔记本就淘汰下来了,加上之前的,一共3台,就在X宝上买了CPU和内存升级了下笔记本,就自己组了个集群. 话说,好想去捡垃圾,捡台8核16线 ...
随机推荐
- unresolved external symbol boost::throw_exception
使用boost库,VS生成的时候一直报错, error LNK2019: 无法解析的外部符号 "void __cdecl boost::throw_exception(class std:: ...
- 慕学在线网0.2_users表设计(1)
1.Django App设计: users-用户管理(任何web中,users表都是第一个被设计的) course-课程管理 organization-机构和教师管理 operation-用户操作管理 ...
- 谷歌浏览器javascript错误提示插件
JavaScript-Errors-Notifier_v2.1.7 下载地址 安装方法: http://chromecj.com/utilities/2014-09/181.html 设置方式:
- 禁用selinux
查看selinux状态: [root@VM000000518 upload]# getenforce Enforcing 禁用: [root@VM000000518 upload]# setenfor ...
- Vim和Vi的常用命令
Vim 文本编辑器 1.Vim 和 Vi: 两者都是多模式编辑器: Vim 是 Vi 升级版,再兼容 Vi 所有指令的同时增加了一些新功能支持: 特点: 语法加亮:使用不同的颜色加亮代码: 多级撤销: ...
- POJ - 2151 (概率dp)
题意:有T个队伍,有M道题,要求每个队至少有一道题,并且有队伍至少过N道题的概率. 这个题解主要讲一下,后面的,至少有一道题解决和至少一道题至N-1道题解决,到底怎么算的,其实,很简单,就是母函数. ...
- 常用类(Date,Calendar,Math,枚举)
1.日期时间类 计算机时间戳是指距离历元(1970-01-01 00:00:00:000)的时间间隔(以毫秒ms为单位). 如:计算机时间2019-04-29 14:14:00是该时间距离历元经过的毫 ...
- Python高级网络编程系列之第二篇
在上一篇中,我们深入探讨了TCP/IP协议的11种状态,理解这些状态对我们编写服务器的时候有很大的帮助,但一般写服务器都是使用C/Java语言,因为这些语言对高并发的支持特别好.我们写的这些简单的服务 ...
- 使用eclipse阅读java源码
很多时候想要阅读java源代码(无论是jdk自带的,还在第三方的),但是我们使用的jar包都是编译好的class包,无法在eclipse中直接打开,此时需要下载源码包. 本文以查看HttpClient ...
- linux安装jenkins和编译发布gitlib项目
1. jenkins下载地址 wget https://updates.jenkins-ci.org/download/war/2.138/jenkins.war 2. 安装插件 安装gitlib和m ...