(转)关于ActiveMQ的配置
- 格式:pdf
- 大小:197.71 KB
- 文档页数:7
(转)关于ActiveMQ的配置
⽬前常⽤的消息队列组建⽆⾮就是MSMQ和ActiveMQ,⾄于他们的异同,这⾥不想做过多的⽐较。简单来说,MSMQ内置于微软操作系统之中,在部署上包含⼀个隐性条件:Server需要是微软操作系统。(对于这点我并去调研过MSMQ是否可以部署在⾮微软系统,⽐如:Linux,只是拍脑袋想了想,感觉上是不可以)。对于ActiveMQ,微软系统和Linux都是可以部署的。从功能⽅⾯来说,⼀般最常⽤的就是:消息的收/发,感觉差异不⼤。从性能上来说,⼀般的说法是ActiveMQ略⾼。在稳定性上,个⼈感觉MSMQ更好。如果这两种常⽤队列都⽤过的同学,应该来说最⼤的差异在于:MSMQ如果要访问远程队列(⽐如机器A上的程序访问机器B上的队列),会⽐较恶⼼。在数据量⽐较⼤的情况之下,⼀般来说队列服务器会专门的⼀台或者多台(多台的话,⽤程序去做热备+负载⽐较⽅便,也不需要额外的硬件成本。简单来说做法可以这样:消息发送的时候随机向着多台队列服务器上发送消息;接受的时候开多个线程去分别监听;热备⽅⾯,可以维护⼀个带状态的队列连接池,如果消息收发失败那么将状态置为不可⽤,然后起⼀个线程去定时监测坏的连接是否可⽤,这个过程⼀般情况下可以不⽤加锁,为什么,⼤家根据各⾃需要去取舍吧)。最近搞完了短彩信的⽹关连接服务,这两种队列我均使⽤了。⼤致的过程是这样的:上层应⽤如果要发端彩信,那么将消息直接发送⾄ActiveMQ(⽬前⽤的就是上⾯说的多台热备+负载,因为实际中下⾏量⾮常⼤5千万条/天以上),然后端彩信⽹关连接服务部署多套,每套均依赖本机的MSMQ。为什么呢?⽤ActiveMQ的原因是:上层应⽤程序和⽹关连接服务彼此独⽴,消息需要跨机访问。⽤MSMQ的原因是:ActiveMQ中的数据是⼀条不分省的⼤队列,⽹关连接服务需要按省流控,所以端彩信⽹关连接服务:⾸先把消息从ActiveMQ取出来,然后存⾄本机上的分省MSMQ,这样做另外的⼀个好处就是:ActiveMQ不⾄于过多挤压,他的数据会分摊到N台短彩信⽹关连接服务所部署的机器上的MSMQ之中,也就说MSMQ可以起到分摊数据和缓冲的作⽤。
在之前的随笔中,已经介绍过MSMQ,现在先介绍⼀下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
参考资源:
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
参考资源:
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 JMSappender
3. Your broker is probably under heavy load (or network connection is unreliable), so connection setup cannot be completed in areasonable time
If you experience sporadic exceptions like this, the best solution is to use failover transport, so that your clients can try connecting again ifthe 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”,还是很重要的。
参考资料: 对于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确实独⽴管理器内存;