关于artemis使用过程中遇到的问题
Artemis 是一款开源的消息代理服务工具,前后端可以作为客户端使用发布订阅模式来实现消息交互。在使用的过程中遇到了如下问题。
1、由于使用时间越来越长,发现消息代理服务器的内存越来越大,而且偶尔出现内存溢出的问题,于是直接想到的是修改默认启动JVM配置的最大使用内存Xmx
rem Java Opts
set JAVA_ARGS= -XX:+PrintClassHistogram -XX:+UseG1GC -XX:+AggressiveOpts -Xms512M -Xmx1024M -Xbootclasspath/a:%ARTEMIS_HOME%
结果出现了空间不够
Error occurred during initialization of VM
Could not reserve enough space
的问题,最终发现是自己安装的JDK版本不是64位的导致。
2、代理服务经常卡住
每次遇到这种问题,发现进入终端,敲一下回车键之后,会存在大量的资源释放log,然后服务器就恢复正常了,之前一直以为是artemis的bug,不能够正常释放资源,久久无法解决,知道有一天和一个同事谈及此事,其说也遇到过类似的问题,部署后台tomcat后有时候也卡住,后台发现是windows下cmd终端的默认编辑模式的问题,具体参考:
https://www.lanhusoft.com/Article/697.html
3、消息代理服务器磁盘空间占满的问题
由于artemis的消息和日志持久化机制默认和推荐都是只用文件系统, 因此随着订阅者和消息的增多,加之之前没有配置过期时间,会导致存留的消息日志文件越来越多,并且其为了磁盘访问速度更快,对于每一条消息的存储似乎都是按照类似4K这种格式来存储的,也就是一个10M的文件,其实不能够存多少消息,大部分空间都是被填充的。随后根据配置说明修改了单个日志大小和磁盘最大使用比率:
https://stackoverflow.com/questions/54888862/apache-activemq-artemis-message-size-configuration
https://blog.****.net/guiliguiwang/article/details/82145342
其实这些都是治标不治本的,后来发现还是要将过期消息丢弃掉才是解决之道,当然过期时间的配置很重要。
http://activemq.apache.org/components/artemis/documentation/latest/message-expiry.html
expiry-delay
消息有效期, 注意单位为毫秒
最终是采用的新建一个代理示例,将所有要修改的配置配上,也就相当于将原先数据都清理了,后续还需要看情况来确认此方法是否有效。
4、还有很多配置需要了解
client-failure-check-period
失效连接检测,默认30秒
message-expiry-scan-period
消息过期检测,默认30秒
message-expiry-thread-priority
消息过期检测线程优先级,默认为3
监控
http://activemq.apache.org/jmx.html
消息反复投递导致:
https://blog.****.net/guiliguiwang/article/details/82415025
配置 <redelivery-delay>0</redelivery-delay>