关于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.csdn.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.csdn.net/guiliguiwang/article/details/82415025

配置 <redelivery-delay>0</redelivery-delay>