第十章 代理商拓扑结构【笔记】
10.1、概述:本章主要是ActiveMQ 集群 拓扑结构设计
10.2、代理商高可用性
一般故障分为 网络故障,硬件故障,软件故障,对于ActiveMQ来说就是如何改善的软件故障来提供高可用性。
介绍三种 主/从结构
10.2.1. 分享式主从结构
到主代理器挂了,有两种操作
第一种:从代理器也关闭
第二种:从代理器上位成主代理器
如果是第二种可以如下配置
failover://(tcp://masterhost:61616,tcp://slavehost:61616)?randomize=false
10.2.1.1.配置分享式主/从
remoteURI:主代理器监听地址
userName: 可选,用户名
password : 可选,密码
master(主代理器配置)
<services>
<masterConnector remoteURI= "tcp://localhost:62001" userName="Rob" password="Davies"/>
</services>
slave(从代理器配置)
shutdownOnmasterFailure : 默认值false, 当master挂了,slave将会关闭
waitForslave: 默认值false , 在从代理器没有与主代理器通讯时不允许客户端访问
shutdownOnslaveFailure , 默认值为false, 如果为true,如果slave断开的时候,master将会关闭
10.2.1.2.什么时候使用master/slave
可以人工干预,你可以用于已经运行中代理器中配置高可用性
10.2.2. 分享数据库 主从
10.2.2.1、什么时候使用数据库主从
它的性能低于分享式主从,它不需要额外配置和slave数量的限制
10.2.3.分享式文件系统主从
SAN(Storage area network): 例如 Network File System (NFS) 、Global File System (GFS)
10.2.3.1、什么时候使用分享文件系统主从
它与AMQMessageStore 或KahaDB整合使用,它的唯一缺陷,只支持分布锁环境文件系统
10.3 网络代理器
通过网络进行传输数据
10.3.1、 存储和传输
以上是单向通道,如果是双向通道
文件配置为:
<networkConnectors>
<networkConnector uri="static://(tcp://backoffice:61617)"
name="bridge"
duplex="true"
conduitSubscriptions="true"
decreaseNetworkConsumerPriority="false">
</networkConnector>
</networkConnectors>
配置的顺序要求
<?xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://activemq.org/config/1.0">
<broker brokerName="receiver" persistent="true" useJmx="true">
<networkConnectors>
<networkConnector uri="static:(tcp://backoffice:61617)" />
</networkConnectors>
<persistenceAdapter>
<kahaDB />
<kahaDB></kahaDB>
</persistenceAdapter>
<transportConnectors>
<transportConnector uri="tcp://localhost:62002" />
</transportConnectors>
</broker>
</beans>
高性能网络配置
引用《ActiveMQ in Action》
10.3.2. 网络发现
网络发现有两种:
1、动态(dynamic):自动搜索发现新代理器(使用multicast)
2、静态(Static):列举所有网络(static)
<networkConnectors>
<networkConnector uri="multicast://default"/>
</networkConnectors>
<networkConnectors>
<networkConnector uri="static:(tcp://remote-master:61617,tcp://remote-slave:61617)"/>
</networkConnectors>
static 的配置参数有:
initialReconnectDelay(默认值为1000)单位毫秒初始化重连延迟,只有useExponentialBackOff不可用
maxReconnectDelay (默认值为30000)最大延迟,只有useExponentialBackOff不可用
useExponentialBackOff: (默认值为true)重连时间等待时间会更长
backOffMultiplier:(默认值为2) 这是增加useExponentialBackOff重连等待时间的基数
例如:
<networkConnectors>
<networkConnector uri="static:(tcp://remote:61617)?useExponentialBackOff=false"/>
</networkConnectors>
10.3.3,网络配置
10.3.3.1. 网络属性:dynamicOnly
默认值为false,如果为true,活动时候才会传递消息给远程代理器
10.3.3.2、网络属性:prefetchSize
默认值为1000,读取远程代理器打包消息大小
10.3.3.3网络属性:conduitSubscriptions
避免多个代理器发送消息重复
10.3.3.4.网络属性:excludedDestinations
去除目的地
它优先级高于staticallyIncludedDestinations和dynamicallyIncludedDestinations.(也就是这两个属性设置无效)
例子:
<networkConnectors>
<networkConnector uri="static:(tcp://remote:61617)?useExponentialBackOff=false" />
<excludedDestinations>
<queue physicalName="audit.queue-1" />
<queue physicalName="audit.queue-2" />
<queue physicalName="local.>" />
<topic physicalName="local.>" />
</excludedDestinations>
</networkConnectors>
10.3.3.5、网络属性:dynamicallyIncludedDestinations
包含目的地(白名单)10.3.3.6、网络属性:staticallyIncludedDestinations
包含目的地(白名单)
<networkConnectors>
<networkConnector uri="static:(tcp://remote:61617)?useExponentialBackOff=false" />
<staticallyIncludedDestinations>
<queue physicalName="management.queue-1" />
<queue physicalName="management.queue-2" />
<queue physicalName="global.>" />
<topic physicalName="global.>" />
</staticallyIncludedDestinations>
</networkConnectors>
10.3.3.7、网络属性:decreaseNetworkConsumerPriority
默认值为false,如果设置true,表示本地优先级高于远程10.3.3.8、网络属性:networkTTL
默认值为1,心跳
10.3.3.9,网络属性:name
默认值是bridge,一般忽略这个参数,保证唯一
<networkConnectors>
<networkConnector uri="static://(tcp://remotehost:61617)" name="queues_only" duplex="true">
<excludedDestinations>
<topic physicalName=">" />
</excludedDestinations>
</networkConnector>
<networkConnector uri="static://(tcp://remotehost:61617)" name="topics_only" duplex="true">
<excludedDestinations>
<queue physicalName=">" />
</excludedDestinations>
</networkConnector>
</networkConnectors>
10.4、应用分割
实现高并发,负载均衡
10.4.1、垂直分割
设置传输为nio<broker>
<transportConnectors>
<transportConnector name="nio" uri="nio://localhost:61616"/>
</<transportConnectors>
</broker>
设置线程池
ACTIVEMQ_OPTS="-Dorg.apache.activemq.UseDedicatedTaskRunner=false"
同时设置虚拟机内存大小
ACTIVEMQ_OPTS="-Xmx1024M -Dorg.apache.activemq.UseDedicatedTaskRunner=false"
设置代理器的内存大小:对于100多个连接最小内存大小512MB
<systemUsage>
<systemUsage>
<memoryUsage>
<memoryUsage limit="512 mb" />
</memoryUsage>
<storeUsage>
<storeUsage limit="10 gb" name="foo" />
</storeUsage>
<tempUsage>
<tempUsage limit="1 gb" />
</tempUsage>
</systemUsage>
</systemUsage>
为了减少CPU加载连接,需要将tightEncodingEnabled设置为false
String uri = "failover://(tcp://localhost:61616?wireFormat.tightEncodingEnabled=false)";
ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory(url);
设置队列最优化
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry queue=">" optimizedDispatch="true" />
</policyEntries>
</policyMap>
</destinationPolicy>
“>”表示所有队列(Queues)
整体配置文件如下
<?xml version="1.0"?>
<broker xmlns="http://activemq.org/config/1.0" brokerName="amq-broker" dataDirectory="${activemq.base}/data">
<persistenceAdapter>
<kahaDB directory="${activemq.base}/data" journalMaxFileLength="32mb" />
</persistenceAdapter>
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry queue=">" optimizedDispatch="true" />
</policyEntries>
</policyMap>
</destinationPolicy>
<systemUsage>
<systemUsage>
<memoryUsage>
<memoryUsage limit="512 mb" />
</memoryUsage>
<storeUsage>
<storeUsage limit="10 gb" name="foo" />
</storeUsage>
<tempUsage>
<tempUsage limit="1 gb" />
</tempUsage>
</systemUsage>
</systemUsage>
<!-- The transport connectors ActiveMQ will listen to -->
<transportConnectors>
<transportConnector name="openwire" uri="nio://localhost:61616" />
</transportConnectors>
</broker>
10.4.2.水平分割
随机连接
failover://(tcp://broker1:61616,tcp://broker2:61616)?randomize=true
为了代理器之间消息不孤立,如下设置
<networkConnector uri="static://(tcp://remotehost:61617)"
name="bridge"
dynamicOnly="true"
prefetchSize="1"
</networkConnector>
10.4.3、交通分配(traffic partitioning )
traffic partitioning 是垂直和水平分割的混合体,
上一篇: 使用Python编写一个最基础的代码解释器的要点解析
下一篇: laya中的transform
推荐阅读