我的编程空间,编程开发者的网络收藏夹
学习永远不晚

ActiveMQ问题分析和解决是怎样的

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

ActiveMQ问题分析和解决是怎样的

ActiveMQ问题分析和解决是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

1)KahaDb和AMQ Message Store两种持久方式如何选择?

官方:

From 5.3 onwards - we recommend you use KahaDB - which offers improved scalability and recoverability over the AMQ Message Store.

The AMQ Message Store which although faster than KahaDB - does not scales as well as KahaDB and recovery times take longer.

非官方:

kaha文件系统实际上上是一个文件索引系统,有两部分组成,一个是数据文件系统,由一个个独立的文件组成,缺省文件大小是32M大(可配置),另外一个是索引文件系统,记录消息在数据文件中的位置信息以及数据文件中的空闲块信息。数据文件是存储到硬盘上的,索引文件是缓存在内存中的。所以这个存储系统对大消息存储有利,象我们的memberId之类的文本消息,实际上是浪费,索引比消息还大,哈。

我方分析:

推荐: Amq持久方式

理由:虽然官方推荐使用KahaDB持久方式,但其提到的优势:可伸缩性和恢复性较好,对于我们实际的应用意义不大。从我们自己的使用经验来看,KahaDB持久方式,Data文件是一个大文件(感觉文件过大后,造成队列服务瘫死的可能性会增大),从官网的相关配置(附录1)也找不到哪里可以设置数据的文件的最大Size。)而Amq持久方式可以设置Data文件最大Size,这样可以保证即时消息积压很多,Data文件也不至于过大。

2)错误:Channel was inactive for too long

解决方法:

在建立连接的Uri中加入: wireFormat.maxInactivityDuration=0

参考资源:

http://jinguo.iteye.com/blog/243153

You can do the following to fix the issues:

1) Append max inactivity duration to your Uri in the format below: wireFormat.maxInactivityDuration=0

2) Use the same Uri at the client side as well as at the server side

Regards,

如果不这样设置,对应的错误会出现:

2008-05-07 09:22:56,343 [org.apache.activemq.ActiveMQConnection]-[WARN] Async exception with no exception listener: org.apache.activemq.transport.InactivityIOException: Channel was inactive for too long: localhost/127.0.0.1:61616

org.apache.activemq.transport.InactivityIOException: Channel was inactive for too long: localhost/127.0.0.1:61616

ActiveMQ的tcp url:tcp://localhost:61616后面要加入?wireFormat.maxInactivityDuration=0 这样的参数,否则当一段时间没有消息发送时会抛出 "Channel was inactive for too long"异常

3)错误:Wire format negotiation timeout: peer did not send his wire format.

解决方法:

1)关闭ActiveMqLog4j

打开:conf/log4j.properties

将:log4j.rootLogger=INFO, console, logfile

修改为:log4j.rootLogger=OFF

2)在建立连接的Uri中加入: maxInactivityDurationInitalDelay=30000

例如北京的测试环境连接Uri:

tcp://192.168.199.80:61616?wireFormat.maxInactivityDuration=0&maxInactivityDurationInitalDelay=30000&connection.AsyncSend=true

 

参考资源:

http://activemq.apache.org/javaxjmsjmsexception-wire-format-negociation-timeout-peer-did-not-send-his-wire-format.html

If you get exception like this,it can mean one of three things:

1. You're connecting to the port not used by ActiveMQ TCP transport

Make sure to check that you're connecting to the appropriate host:port

2. You're using log4j JMS appender and doesn't filter out ActiveMQ log messages

Be sure to read How do I use log4j JMS appender with ActiveMQ and more importantly to never send ActiveMQ log messages to JMS appender

3. Your broker is probably under heavy load (or network connection is unreliable), so connection setup cannot be completed in a reasonable time

If you experience sporadic exceptions like this, the best solution is to use failover transport, so that your clients can try connecting again if the first attempt fails. If you're getting these kind of exceptions more frequently you can also try extending wire format negotiation period (default 10 sec). You can do that by using wireFormat.maxInactivityDurationInitalDelay property on the connection URL in your client.

For example

tcp://localhost:61616?wireFormat.maxInactivityDurationInitalDelay=30000

will use 30 sec timeout.(貌似有问题!!!)

4)错误:Out of memory

解决方法:

1)  设置Java最大内存限制为合适大小:

Bin/activemq.bat 中ACTIVEMQ_OPTS=-Xmx512M(默认是512)

2)Activemq.xml配置节:systemUsage/ systemUsage配置大小合适,并且特别注意:大于所有durable desitination设置的memoryUsage之和。

备注:

1)尖括号:“>”代表通配符

2)ACTIVEMQ_OPTS的配置〉=memoryUsage中配置〉=所有durable desitination设置之和

3)SystemUsage配置设置了一些系统内存和硬盘容量,当系统消耗超过这些容量设置时,amq会“slow down producer”,还是很重要的。

参考资料:

http://m.oschina.net/blog/26216

参考-- http://activemq.apache.org/javalangoutofmemory.html

       对于MQ的内容实用是可管理和可配置的。首先需要判断的是MQ的哪部分系统因内存不足而导致泄漏,是JVM,broker还是消费者、生产者?

       一、内存管理

       JVM内存管理:

       1. 用bin/activemq命令在独立JVM中运行broker。用-Xmx和-Xss命令即可(activemq.bat文件中修改ACTIVEMQ_OPTS选项参数即可);

       2. 默认情况下,MQ用512M的JVM;

       broker内存管理:

       1. broker使用的内存并不是由JVM的内存决定的。虽然受到JVM的限制,但broker确实独立管理器内存;

       2. systemUsage和destination的内存限制与broker内存息息相关;

       3. MQ中内存的关系是:JVM->Broker->broker features;

       4. 所有destination的内存总量不能超过broker的总内存;

       消费者:

       1. 由于消息大小可以配置,prefetch limit往往是导致内存溢出的主要原因;

       2. 减少prefetch limit的大小,会减少消费者内存中存储的消息数量;

       生产者:

       1. 除非消息数量超过了broker资源的限制,否则生产者不会导致内存溢出;

       2. 当内存溢出后,生产者会收到broker的阻塞信息提示;

       二、其他

       将消息缓冲之硬盘:

       1. 只有当消息在内存中存储时,才允许消息的快速匹配与分发,而当消费者很慢或者离开时,内存可能会耗尽;

       2. 当destination到达它的内存临界值时,broker会用消息游标来缓存非持久化的消息到硬盘。

       3. 临界值在broker中通过memoryUsage和systemUsage两个属性配置,请参考activemq.xml;

       4. 对于缓慢的消费者,当尚未耗尽内存或者转变为生产者并发控制模式前,这个特性允许生产者继续发送消息到broker;

       5. 当有多个destination的时候,默认的内存临界值可能被打破,而这种情况将消息缓存到硬盘就显得很有意义;

       6. precentUsage配置:使用百分比来控制内存使用情况;

       多个线程:

       1. 默认情况下,MQ每个destination都对应唯一的线程;

       2. -Dorg.apache.activema.UseDedicatedTaskRunner=false(activemq.bat文件中修改ACTIVEMQ_OPTS选项参数即可),用线程池来限制线程的数量,从而减少内存消耗;

       大数据传输:

       1. destination policies--maxPageSize:控制进入内存中的消息数量;lazyDispatch:增加控制使用当前消费者列表的预取值;

       2. 使用blogMessage或者streamsMessage类型来进行大量文件的传输;

       泄漏JMS资源:

       1. 当session或者producer或者consumer大量存在而没有关闭的时候;

       2. 使用PooledConnectionFactory;

5)采用failover方式连接导致卡死

解决方法

不采用failover连接

分析

采用failover方式连接,如果所要连接的服务器或者Activemq服务宕了,那么程序会一直处于等待状态,不超时,不报错。

二)附录

1)KahaDB持久配置

property name

default value

Comments

directory

activemq-data

the path to the directory to use to store the message store data and log files

indexWriteBatchSize

1000

number of indexes written in a batch

indexCacheSize

10000

number of index pages cached in memory

enableIndexWriteAsync

false

if set, will asynchronously write indexes

journalMaxFileLength

32mb

a hint to set the maximum size of the message data logs

enableJournalDiskSyncs

true

ensure every non transactional journal write is followed by a disk sync (JMS durability requirement)

cleanupInterval

30000

time (ms) before checking for a discarding/moving message data logs that are no longer used

checkpointInterval

5000

time (ms) before checkpointing the journal

ignoreMissingJournalfiles

false

If enabled, will ignore a missing message log file

checkForCorruptJournalFiles

false

If enabled, will check for corrupted Journal files on startup and try and recover them

checksumJournalFiles

false

create a checksum for a journal file - to enable checking for corrupted journals

Available since version 5.4:

  

archiveDataLogs

false

If enabled, will move a message data log to the archive directory instead of deleting it.

directoryArchive

null

Define the directory to move data logs to when they all the messages they contain have been consumed.

databaseLockedWaitDelay

10000

time (ms) before trying to get acquire a the database lock (used by shared master/slave)

maxAsyncJobs

10000

the maximum number of asynchronous messages that will be queued awaiting storage (should be the same as the number of concurrent MessageProducers)

concurrentStoreAndDispatchTopics

false

enable the dispatching of Topic messages to interested clients to happen concurrently with message storage

concurrentStoreAndDispatchQueues

true

enable the dispatching of Queue messages to interested clients to happen concurrently with message storage

2)AMQ持久配置

property name

default value

Comments

directory

activemq-data

the path to the directory to use to store the message store data and log files

useNIO

true

use NIO to write messages to the data logs

syncOnWrite

false

sync every write to disk

maxFileLength

32mb

a hint to set the maximum size of the message data logs

persistentIndex

true

use a persistent index for the message logs. If this is false, an in-memory structure is maintained

maxCheckpointMessageAddSize

4kb

the maximum number of messages to keep in a transaction before automatically committing

cleanupInterval

30000

time (ms) before checking for a discarding/moving message data logs that are no longer used

indexBinSize

1024

default number of bins used by the index. The bigger the bin size - the better the relative performance of the index

indexKeySize

96

the size of the index key - the key is the message id

indexPageSize

16kb

the size of the index page - the bigger the page - the better the write performance of the index

directoryArchive

archive

the path to the directory to use to store discarded data logs

archiveDataLogs

false

if true data logs are moved to the archive directory instead of being deleted

3)systemUsage配置

property name

default value

Comments

memoryUsage

20M

amq使用内存大小,照amq论坛上说,这个值应该大于所有durable desitination设置的

memoryUsage之和,否则会导致硬盘swap,影响性能。

storeUsage

1G

kaha数据存储大小,如果设置不足,性能会下降到1个1个发

tempUsage

100M

非persistent的消息存储在temp区域

4)其他配置

http://activemq.apache.org/nms/configuring.html

4.1)Failover Transport Options

Option Name

Default

Description

transport.timeout

-1

Time that a send operation blocks before failing.

transport.initialReconnectDelay

10

Time in Milliseconds that the transport waits before attempting to reconnect the first time.

transport.maxReconnectDelay

30000

The max time in Milliseconds that the transport will wait before attempting to reconnect.

transport.backOffMultiplier

2

The amount by which the reconnect delay will be multiplied by if useExponentialBackOff is enabled.

transport.useExponentialBackOff

true

Should the delay between connection attempt grow on each try up to the max reconnect delay.

transport.randomize

true

Should the Uri to connect to be chosen at random from the list of available Uris.

transport.maxReconnectAttempts

0

Maximum number of time the transport will attempt to reconnect before failing (0 means infinite retries)

transport.startupMaxReconnectAttempts

0

Maximum number of time the transport will attempt to reconnect before failing when there has never been a connection made. (0 means infinite retries) (included in NMS.ActiveMQ v1.5.0+)

transport.reconnectDelay

10

The delay in milliseconds that the transport waits before attempting a reconnection.

transport.backup

false

Should the Failover transport maintain hot backups.

transport.backupPoolSize

1

If enabled, how many hot backup connections are made.

transport.trackMessages

false

keep a cache of in-flight messages that will flushed to a broker on reconnect

transport.maxCacheSize

256

Number of messages that are cached if trackMessages is enabled.

transport.updateURIsSupported

true

Update the list of known brokers based on BrokerInfo messages sent to the client.

4.2)Connection Options

Option Name

Default

Description

connection.AsyncSend

false

Are message sent Asynchronously.

connection.AsyncClose

true

Should the close command be sent Asynchronously

connection.AlwaysSyncSend

false

Causes all messages a Producer sends to be sent Asynchronously.

connection.CopyMessageOnSend

true

Copies the Message objects a Producer sends so that the client can reuse Message objects without affecting an in-flight message.

connection.ProducerWindowSize

0

The ProducerWindowSize is the maximum number of bytes in memory that a producer will transmit to a broker before waiting for acknowledgement messages from the broker that it has accepted the previously sent messages. In other words, this how you configure the producer flow control window that is used for async sends where the client is responsible for managing memory usage. The default value of 0 means no flow control at the client. See also Producer Flow Control

connection.useCompression

false

Should message bodies be compressed before being sent.

connection.sendAcksAsync

false

Should message acks be sent asynchronously

connection.messagePrioritySupported

true

Should messages be delivered to the client based on the value of the Message Priority header.

connection.dispatchAsync

false

Should the broker dispatch messages asynchronously to the connection's consumers.

 

4.3)OpenWire Options

Option Name

Default

Description

wireFormat.stackTraceEnabled

false

Should the stack trace of exception that occur on the broker be sent to the client? Only used by openwire protocol.

wireFormat.cacheEnabled

false

Should commonly repeated values be cached so that less marshalling occurs? Only used by openwire protocol.

wireFormat.tcpNoDelayEnabled

false

Does not affect the wire format, but provides a hint to the peer that TCP nodelay should be enabled on the communications Socket. Only used by openwire protocol.

wireFormat.sizePrefixDisabled

false

Should serialized messages include a payload length prefix? Only used by openwire protocol.

wireFormat.tightEncodingEnabled

false

Should wire size be optimized over CPU usage? Only used by the openwire protocol.

wireFormat.maxInactivityDuration

30000

The maximum inactivity duration (before which the socket is considered dead) in milliseconds. On some platforms it can take a long time for a socket to appear to die, so we allow the broker to kill connections if they are inactive for a period of time. Use by some transports to enable a keep alive heart beat feature. Set to a value <= 0 to disable inactivity monitoring.

maxInactivityDurationInitalDelay

10000

The initial delay in starting the maximum inactivity checks (and, yes, the word 'Inital' is supposed to be misspelled like that)

 

5)安全配置

控制台安全配置,打开conf/jetty.xml文件,找到

    <bean id="securityConstraint" class="org.eclipse.jetty.http.security.Constraint">

        <property name="name" value="BASIC" />

        <property name="roles" value="admin" />

        <property name="authenticate" value="false" />

    </bean>

   将“false”改为“true”即可。用户名和密码存放在conf/jetty-realm.properties文件中。

生产者和消费者连接MQ需要密码

   打开conf/activemq.xml文件,在<broker>标签里的<systemUsage>标签前加入:

   <plugins>  

<simpleAuthenticationPlugin>  

<users>  

<authenticationUser username="${activemq.username}" password="${activemq.password}" groups="users,admins"/>  

</users>  

</simpleAuthenticationPlugin>  

   </plugins>

 注意必须在<systemUsage>标签前,否则启动ActiveMQ会报错。

 

用户名和密码存放在conf/credentials.properties文件中

关于ActiveMQ问题分析和解决是怎样的问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网行业资讯频道了解更多相关知识。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

ActiveMQ问题分析和解决是怎样的

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

ActiveMQ问题分析和解决是怎样的

ActiveMQ问题分析和解决是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1)KahaDb和AMQ Message Store两种持久方式如何选择?官方:From
2023-06-04

JAVA中文比较问题的分析和解决是怎样的

这篇文章将为大家详细讲解有关JAVA中文比较问题的分析和解决是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 Java的中文问题由来已久,前不久需要做内存中的中文比较排序,对字符串进行
2023-06-03

解决JDBCConnectionReset的问题分析

这篇文章主要介绍了解决JDBCConnectionReset的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-05-18

怎样分析JSF的中文问题

怎样分析JSF的中文问题,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。开始学习JSF的时候有遇上中文问题,看了一些文章后突然想起Struts也有中文问题,当时用
2023-06-03

分析和解决Gitlab不能审批问题

近日有用户反映,在使用Gitlab过程中遇到了一个问题——不能进行审批。这样的问题对于团队合作来说是相当严重的,因此需及时解决。本文将对此进行分析和解决方案的探讨。首先,我们需要理解Gitlab中的审批机制。在Gitlab中,有一个功能叫做
2023-10-22

分析和解决IIS无法加载CSS的问题

IIS 是一种常用的 Web 服务器软件,它能够处理和响应客户端的请求,并向客户端发送网页文件和其他静态资源。在 Web 开发中,CSS(层叠样式表)是一个非常重要的组成部分,它用于定义网页的样式、布局和外观。然而,有时候使用 IIS 时,可能会遇到无法加载 CSS 文件的问题。在本篇文章中,我们将分析 IIS 无法加载 CSS 的原因并提供相应的解决方案。1. 服务器配置问题
2023-05-14

Windows下光驱常见问题的分析和解决

现在,光驱在我们使用电脑中扮演了非常重要的角色,看电影,听音乐,玩游戏。光驱早已经成为电脑的必备设备,作为机器就免不了的有这样或者那样的故障了,有时会遇到机子装好后光驱的盘符却没有了,装系统,换数据线,查CMOS设置,最后费尽了办法才终于把
2023-05-24

怎样分析MySQL中锁的相关问题

这篇文章给大家介绍怎样分析MySQL中锁的相关问题,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。锁分类:从对数据操作的粒度分 :表锁:操作时,会锁定整个表。行锁:操作时,会锁定当前操作行。从对数据操作的类型分:读锁(共
2023-06-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录