activemq 记录
1.集群?
集群:主要是用来错误转发和负载均衡。不过如果服务器里面有没有消费掉的消息,这时候如果服务器down了机,那没有消费掉的消息只能是等服务器好了之后才能继续被消费。?
这个问题的解决方案是用master/slave的模式。(但这个性能上很大影响。Master要恢复也是要把slave停了才可以恢复的。)?
集群分两种:?
Failover:这种是用来解决如果一个服务器down了,马上可以切换到另一台服务器。?
Network: 这种是用来解决一个服务器生产的东西,可以在另一个服务器去消费。?
2.Queue顺序?
Queue中的消息是按照顺序被分发到consumers的。然而,当你有多个consumers同时从相同的queue中提取消息时,你将失去这个保证。因为这些消息是被多个线程并发的处理。?
所以一个queue固定一个消费者来保证顺序。?
3.监控?
用的是JMX?
可以通过RemoteJMXBrokerFacade来得到BrokerViewMBean:?
如:?
public static void main(String[] args) {?
RemoteJMXBrokerFacade createConnector = new RemoteJMXBrokerFacade();?
System.setProperty("webconsole.jmx.url", "service:jmx:rmi:///jndi/rmi://10.200.48.49:1099/jmxrmi");?
//System.setProperty("webconsole.jmx.user","controlRole");?
// System.setProperty("webconsole.jmx.password","abcd1234");?
SystemPropertiesConfiguration configuration = new SystemPropertiesConfiguration();?
createConnector.setConfiguration(configuration);?
try {?
BrokerViewMBean brokerAdmin = createConnector.getBrokerAdmin();?
System.out.println(brokerAdmin.getBrokerName());?
} catch (Exception e) {?
// TODO Auto-generated catch block?
e.printStackTrace();?
}?
}?
4.Activemq.xml简单说明。?
4.1 配置连接用户名和密码:?
<bean password="${activemq.password}" groups="users,admins"/>????
??????????? </users>????
??????? </simpleAuthenticationPlugin>????
??? </plugins>??
应用用户名和密码后?
Java代码?
ConnectionFactory cf = new ActiveMQConnectionFactory("username", "password", "tcp://195.2.199.169:61616")???
4.2 系统持久化空间的配置?
4.2.1 desitination配置:?
1.memorylimit:内存限制,当消息发生累积到限制的数值时,amq会主动控制流量,停止消息的生产?
2.producerFlowControl="false":关闭流量控制?
建议生产环境下应该打开流量控制开关,以避免生成端占用大部分io能力,阻塞消息端的情况?
<policyEntry queue=">" memoryLimit="100mb" producerFlowControl="false"/>?
4.2.2存储配置:?
amq可以使用文件系统或者数据库存储累积的消息,文件系统存储使用的是其自有的kaha存储系统,?
数据库可以使用内嵌的Derby或者mysql,oracle?
persistenceAdapter文件系统配置?
1.indexBinSize:索引文件缓存页面数,缺省为1024,当amq扩充或者缩减存储时,会锁定整个?
broker,导致一定时间的阻塞,所以这个值应该调整到比较大,但是代码中实现会动态伸缩,调整效果不理想?
2.cleanupInterval:定时清楚存储文件,将那些完全为空的文件删除?
3.maxFileLength:数据文件大小?
4.forceRecoverReferenceStore和recoverReferenceStore:?
缺省设置为false,amq重启时每次恢复强制从日志一条一条一次redo恢复,100W数据恢复要半个小时?
??????? <persistenceAdapter>???????????
<amqPersistenceAdapter syncOnWrite="false" directory="${activemq.base}/data" maxFileLength="32 mb"? indexBinSize="8192"?
cleanupInterval="30000" forceRecoverReferenceStore="false" recoverReferenceStore="false"/>?
??????? </persistenceAdapter>?
4.2.3 SystemUsage配置:?
SystemUsage配置设置了一些系统内存和硬盘容量,当系统消耗超过这些容量设置时,amq会放慢生产?
1.memoryUsage:amq使用内存大小,这个值应该大于所有durable desitination设置的memoryUsage之和,否则会导致硬盘swap,影响性能?
2.storeUsage:kaha数据存储大小,如果设置不足,性能会下降到1个1个发的地步?
3.tempUsage:非persistent的消息存储在temp区域,我们系统存储都是persistent的消息,该值可以设置小点?
??????? <systemUsage>?
?????????? <systemUsage>?
??????????????? <memoryUsage>?
??????????????????? <memoryUsage limit="512 mb"/>?
??????????????? </memoryUsage>?
??????????????? <storeUsage>?
??????????? <storeUsage limit="8 gb" name="foo"/>?
??????????????? </storeUsage>?
??????????????? <tempUsage>?
??????????????????? <tempUsage limit="100 mb"/>?
??????????????? </tempUsage>?
??????????? </systemUsage>?
?????? </systemUsage>?
4.3 集群的配置?
Failover: 有两种配置方式一种是静态的,把所有的ip地址都写在配置上,这种方式比较郁闷,改一台机子就要加一个ip,所以用动态的。?
先加上?
? <transportConnectors>?
<transportConnector uri="tcp://0.0.0.0:61616" discoveryUri="multicast://default"/>?
</transportConnectors>?
两只集群的activemq都要加上这一段。?
Java代码这样写?
connectionFactory = new ActiveMQConnectionFactory(???
??????????????? "",???????? "",???
"discovery:(multicast://default)");?
这样连接的时候就会自动可以错误转发了。?
如果214机子坏了,或者重启了,连接会自动切换到49上。?
Network:也是有两种配置方式:一种是静态的,所以也是介绍动态:?
<networkConnectors>?
<networkConnector uri="multicast://default"/>?
</networkConnectors>?
如果是集群的方式通常都是这两种方式结合一起用。?
4.4 master/slave的配置?
Master broker不需要特殊的配置。Slave broker需要进行以下配置?
<broker masterConnectorURI="tcp://masterhost:62001" shutdownOnMasterFailure="false">?
...?
<transportConnectors>?
<transportConnector uri="tcp://slavehost:61616"/>?
</transportConnectors>?
</broker>?
4.5 jmx的配置?
如果要使用jmx.activemq.xml要配置一下。?
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="cmcc" useJmx="true" dataDirectory="${activemq.base}/data" destroyApplicationContextOnStop="true">?
? <managementContext>?
??????????? <managementContext createConnector="true"/>?
</managementContext>?
要把这两个属性都设置为true.?
连接的java代码如上所说。