网络连接模式(network connector)
针对海量消息所要求的横向扩展性和系统的高可用性,ActiveMQ提供了网络连接模式的集群功能。简单的说,就是通过把多个不同的broker实例连接在一起,作为一个整体对外提供服务,从而提高整体对外的消息服务能力。通过这种方式连接在一起的broker实例之间,可以共享队列和消费者列表,从而达到分布式队列的目的。
拓扑结构
几种不同的ActiveMQ部署拓扑结构(嵌入、主从复制、网络连接):
配置示例
在activemq.xml的broker节点内添加:
<networkConnectors>
<networkConnectoruri="static:(tcp://localhost:62001)"/>
</networkConnectors>
uri也可以使用其他两种方式:
1. multicast://default
2. masterslave:(tcp://host1:61616,tcp://host2:61616,tcp://..)
其中masterslave方式的第一个url需要是master,其他是slave。
一个broker的实例内可以配置多个networkConnector,如果有两个以上的networkConnector指向同一个broker,则需要显式的指定name。
静态URI配置
使用静态URI方式可以指定多个URL,networkConnector将连接到每一个broker。
<networkConnectors>
<networkConnector uri="static:(tcp://host1:61616,tcp://host2:61616,tcp://..)"/>
</networkConnectors>
URI的几个属性:
属性 |
默认值 |
描述 |
initialReconnectDelay |
1000 |
重连之前等待的时间(ms) (如果useExponentialBackOff为 false) |
maxReconnectDelay |
30000 |
重连之前等待的最大时间(ms) |
useExponentialBackOff |
true |
每次重连失败时是否增大等待时间 |
backOffMultiplier |
2 |
增大等待时间的系数 |
networkConnector配置
配置参数
属性 |
默认值 |
描述 |
name |
bridge |
名称 |
dynamicOnly |
false |
如果为true, 持久订阅被激活时才创建对应的网路持久订阅。默认是启动时激活。 |
decreaseNetworkConsumerPriority |
false |
如果为true,网络的消费者优先级降低为-5。如果为false,则默认跟本地消费者一样为0. |
networkTTL |
1 |
消息和订阅在网络上通过的broker数量 |
conduitSubscriptions |
true |
多个网络消费者是否被当做一个消费者来对待。 |
excludedDestinations |
empty |
不通过网络转发的destination |
dynamicallyIncludedDestinations |
empty |
通过网络转发的destinations,注意空列表代表所有的都转发。 |
staticallyIncludedDestinations |
empty |
匹配的都将通过网络转发-即使没有对应的消费者 |
duplex |
false |
如果为true,则既可消费又可生产消息到网络broker |
prefetchSize |
1000 |
设置网络消费者的prefetch size参数。必须大于0,因为网络消费者不能自己轮询消息。 |
suppressDuplicateQueueSubscriptions |
false |
(从5.3版本开始) 如果为true, 重复的订阅关系一产生即被阻止。 |
bridgeTempDestinations |
true |
是否广播advisory messages来创建临时destination。 |
alwaysSyncSend |
false |
(从 5.6版本开始) 如果为true,非持久化消息也将使用request/reply方式代替oneway方式发送到远程broker。 |
staticBridge |
false |
(从5.6版本开始) 如果为true,只有staticallyIncludedDestinations中配置的destination可以被处理。 |
networkConnector的实现原理是基于ActiveMQ的公告消息(AdvisoryMessage)机制的(参见此处)。当broker2通过networkConnector、duplex方式指向broker1时,发生了什么呢?
假定broker1已经启动,这时候broker2开始启动。
1. broker2先启动自己的connector
2. 然后使用一个vm的connector,创建一个connection,把自己作为一个client,连接到broker1。
3. 通过订阅Advisory Message,拿到相互的Consumer与相应的Queue列表。
至此,双方建立关系。
然后通过broker1的转发,broker1上的消费者,就可以消费broker2的queue上的消息。这个过程可以看做一个消息被消费了两次,broker1作为消费者,消费掉broker2上的消息,broker1再作为broker,把消息投递给实际的消费者。
管道订阅(conduit subscription)
conduitSubscriptions选择决定网络消费者在所有消费者中的比重。假如有2个同一个远程的broker1上的网络消费者和一个broker2的本地消费者。
1. conduitSubscriptions为true,则2个网络消费者只相当于一个消费者,broker1仅仅在broker2上注册了一个消费者。这时往broker2上发送300个消息,2个网络消费者各接收到75个消息,一个本地消费者接收到150 消息。
2. conduitSubscriptions为false,则3个消费者平分所有消息,broker1在broker2上将注册了两个消费者。这时往broker2上发送300个消息,2个网络消费者和本地消费者一样,各接收到100个消息。
双向网络连接(duplex networkConnector)
默认NetworkConnector在需要转发消息时是单向连接的。当duplex=true时,就变成了双向连接,这时配置在broker2端的指向broker1的duplex networkConnector,相当于即配置了
broker2到broker1的网络连接,也配置了broker1到broker2的网络连接。(就是说不管broker1同意与否,都被绑架了。)当然,仅仅在broker1上配置也有同样的效果。
注意:可以在两个broker间建立两个以上的双向网络连接来增加吞吐量或对主题\队列分区,只需要指定他们使用不同的name即可。
指定和限制Destination
通过NetworkConnector共享的destination太多,传输的Advisory Message就会变的非常多,系统的拓扑结构将变得非常复杂,所有才有多种方式来限制这些destination配置:
1. dynamicallyIncludedDestinations
ü 这里匹配到的destination,在需要时将被转发
2. excludedDestinations
ü 这里匹配到的destination,将不会被转发
3. staticallyIncludedDestinations
ü 如果指定了staticBridge为true,则只有这里匹配的destination可以被转发。此时本地broker完全被其他broker代理。并且本broker不会订阅其他broker上的AdvisoryMessage,也不会获取任何远程consumer信息。
这几个配置可以使用通配符,比如“>”,详见wildcard。
示例代码:
<networkConnectors>
<networkConnector uri="static:(tcp://localhost:61617)"
name="bridge"
conduitSubscriptions="true"
decreaseNetworkConsumerPriority="false">
<dynamicallyIncludedDestinations>
<queue physicalName="include.test.foo"/>
<topic physicalName="include.test.bar"/>
</dynamicallyIncludedDestinations>
<excludedDestinations>
<queue physicalName="exclude.test.foo"/>
<topic physicalName="exclude.test.bar"/>
</excludedDestinations>
<staticallyIncludedDestinations>
<queue physicalName="always.include.queue"/>
<topic physicalName="always.include.topic"/>
</staticallyIncludedDestinations>
</networkConnector>
</networkConnectors>
此外,从5.6版本起,可以在networkConnector上设置destinationFilter来指定感兴趣的Advisory Message将被传播。
<networkConnector uri="static:(tcp://host)" destinationFilter="Queue.include.test.foo,ActiveMQ.Advisory.Consumer.Topic.include.test.bar">
<dynamicallyIncludedDestinations>
<queue physicalName="include.test.foo"/>
<topic physicalName="include.test.bar"/>
</dynamicallyIncludedDestinations>
</networkConnector>
被卡住的消息
一个很有意思的场景是,broker1和broker2通过networkConnector连接。一些个consumers连接到broker1,消费broker2上的消息。消息先被broker1从broker2上消费掉,然后转发给这些consumers。不幸的是转发部分消息的时候broker1重启了,这些consumers发现broker1连接失败,通过failover连接到broker2上去了,但是有一部分他们还没有消费的消息被broker2已经分发到了broker1上去了。这些消息,就好像是消失了,除非有消费者重新连接到broker1上来消费。怎么办呢?
办法就是从5.6版本destinationPolicy上新增的选项replayWhenNoConsumers。这个选项使得broker1上有需要转发的消息但是没有消费者时,把消息回流到它原始的broker。同时把enableAudit设置为false,为了防止消息回流后被当做重复消息而不被分发。
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry queue="TEST.>" >
<conditionalNetworkBridgeFilterFactory replayWhenNoConsumers="true" enableAudit="false"/>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
其他说明
1. NetworkConnector基于AdvisoryMessage机制,如果broker的advisorySupport选型被禁用,则NetworkConnector将不起作用。
2. 用作转发的broker中入列出列这些统计信息只记录其转发的数据。
3. 用作转发的broker中无法看到远程broker的相同队列中的数据(browse消息列表为空,queuesize为0)。
相关推荐
ActiveMQ集群:网络连接模式(network connector)详解
高可用之ActiveMQ集群:网络连接模式(network connector)详解
001-ActiveMQ基础;002-安全机制+签收模式+发送模式+MessageProducer;...ActiveMQ集群:网络连接模式(network connector)详解.docx;ActiveMQ集群:网络连接模式(network connector)详解.docx;示例;
unity3d 多人 网络连接,network
(RegionProposal Network)RPN网络结构及详解 - 凹酱的DEEP LEARNING - CSDN博客1
ActiveMQ集群:网络连接模式(network connector)详解.docx
网络Network2 shell perl java sed awk
1.大致流程 2.频道(NetworkChannel) 3.连接服务器 4.频道辅助器(NetworkChannelHelper) 6.消息头(PacketHe
单倍型网络图绘制软件NETWORK 5.0,2020年1月18日更新版本。 Network generates evolutionary trees and networks from genetic, linguistic, and other data. Network can then provide age estimates for any ...
network 网络流 network 网络流 network 网络流 network 网络流 network 网络流
兼容Android29以下获取网络连接及网络类型的工具。
3、用广播WifiManager.NETWORK_STATE_CHANGED_ACTION和ConnectivityManager.CONNECTIVITY_ACTION都行,但判断连接是否成功时,用NetworkInfo的getState()方法和NetworkInfo.State.CONNECTED对比,NetworkInfo.State....
资源内容:ActiveMQ(中文)参考手册;ActiveMQ集群:网络连接模式(network connector)详解;生产者消费者模式实现代码;activemq集群配置文档;
目前全球范围内主要的两大可信网络连接技术是:可信网络连接TNC(Trusted Network Connect,简称TNC)和可信连接架构TCA(Trusted Connect Architecture,简称TCA)。TNC是由2004年可信计算组织(Trusted Computing ...
搬迁神器—网络搬迁工具network_migration_tool.zip
很多朋友都曾问到关于Guest和Host互联,其实这并不是一件困难的事情,只要能够理解VMware的网络模型即可,今天结合着我的虚拟机,来详细介绍一下VMware的3种网络结构
简单的网络协议图 network protocol
VMware workstation安装好之后会多出两个网络连接,分别是VMware Network Adapter VMnet1和VMware Network Adapter VMnet8,这两个是可以在主机的网络连接中可以查看到的,还有一个是VMnet0,可以在virtual network ...
前馈神经网络(Feedforward neural network).pdf 前馈神经网络(Feedforward neural network).pdf 前馈神经网络(Feedforward neural network).pdf 前馈神经网络(Feedforward neural network).pdf 前馈神经网络...
在Ubuntu Server系统安装完成后默认没有使用network-manager管理网络,此文章简单介绍了如何使用network-manager管理网络。