ActiveMQ的network connectors部署集群(七)
网络连接模式
针对海量消息所要求的横向扩展性和系统的高可用性,ActiveMQ提供了网络连接模式的集群功能。简单的说,就是通过把多个不同的broker实例连接在一起,作为一个整体对外提供服务,从而提高整体对外的消息服务能力。通过这种方式连接在一起的broker实例之间,可以共享队列和消费者列表,从而达到分布式队列的目的。
拓扑结构
几种不同的ActiveMQ部署拓扑结构(嵌入、主从复制、网络连接):
配置示例
在activemq.xml的broker节点内添加:
<networkConnectors>
<networkConnectoruri=“static:(tcp://localhost:62001)”/>
</networkConnectors>
uri也可以使用其他两种方式:
multicast://default
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>
此外,从5.6版本起,可以在networkConnector上设置destinationFilter来指定感兴趣的Advisory Message将被传播。
<networkConnector uri="static:(tcp://host)"destinationFilter="Queue.include.test.foo,ActiveMQ.Advisory.Consum er.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,为了防止消息回流后被当做重复消息而不被分发。
ActiveMQ的network connectors部署集群(七)相关推荐
- Kubernetes学习之路(26)之kubeasz+ansible部署集群
目录 1.环境说明 2.准备工作 3.分步骤安装 3.1.创建证书和安装准备 3.2.安装etcd集群 3.3.安装docker 3.4.安装master节点 3.5.安装node节点 3.6.部署集 ...
- Linux部署集群入门
Linux部署集群入门 1.克隆虚拟机 直接复制已有的虚拟机的文件夹复制及可 2.配置网卡和ip地址 2.1配置网卡 2.2 配置ip地址 2.3 重启!!! 3.关闭防火墙 4.关闭seLinux ...
- 云服务器-异地部署集群服务-Kubernetes(K8S)-网络篇
重要!!! 注意: 本文使用二进制安装,过程非常繁琐,所以不推荐大家使用这种安装方式.请使用更简洁的kubeadm安装,具体请参考 云服务器-异地部署集群服务-Kubernetes(K8S)-Kube ...
- Docker-三剑客之machine、compose、swam集群、visualizer监控、stack部署集群、Portainer可视化
目录: 介绍 一.docker-machine 1.machine安装 2.使用docker-machine 二.Docker-compose 1.docker-compose配置 2.修改hapro ...
- Ceph实战(十一):重磅!!!一键部署集群的脚本
您好,我是码农飞哥,本篇文章是Ceph实战专栏的第十一篇文章,前面的系列文章我们分别介绍了集群的部署,介绍了集群的组件,最后到介绍到Ceph的IO流程等等.这一篇文章是结束之作,我将介绍一下重点介绍快 ...
- Kubernetes v1.13 二进制部署集群
Kubernetes v1.13 二进制部署集群(HTTPS+RBAC) 官方提供的几种Kubernetes部署方式 minikube Minikube是一个工具,可以在本地快速运行一个单点的Kube ...
- swarm部署集群_WildFly Swarm –将Java EE应用程序部署为独立的Jar
swarm部署集群 WildFly Swarm提供了一个简单的解决方案,用于将Java EE应用程序部署为独立的Jar文件. 这使得部署应用程序非常容易,尤其是REST或Web服务. Swarm在这方 ...
- SRS部署集群服务 Edge 模式[SRS V4.0]
SRS 部署集群服务 Edge 模式 前言 Edge原理 下载并编译SRS 准备三台服务器,一台也可以,但是播放多了会有卡顿问题 配置SRS 测试SRS集群服务 前言 SRS是一个简单高效的实时视频服 ...
- Docker 三剑客-------docker swam,visualizer监控、stack部署集群、Portainer可视化
Docker 三剑客-------docker swam.visualizer监控.stack部署集群.Portainer可视化 文章目录 Docker 三剑客-------docker swam.v ...
最新文章
- 【Java】 实现一副扑克牌,包含:洗牌+发牌(3个人,一人5张)+输出牌的信息 的逻辑
- 熟悉常用的HDFS操作
- 【二分图最大匹配】【HDU2063】过山车
- Java开发者必备的六款工具
- SpringBoot实现过滤器、拦截器与切片源码分析
- mysql存储过程中as_Mysql存储过程中的delimiter
- VMware 安装ubuntu 18.04遇到的问题
- Golang 处理 Json(二):解码
- P3174 [HAOI2009]毛毛虫(树形dp)
- linux目录树(书本上看到)
- 解决eclipse出现The superclass javax.servlet.http.HttpServlet was not found on the Java Build Path
- 解密 Go interface 的类型转换原理
- mysql 深入视图和索引
- How to Install Jdownloader on Ubuntu
- ramda 函数 logic
- Web前端开发技术课程大作业——南京旅游景点介绍网页代码html+css+javascript
- 小型双轮差速底盘实现触须避障
- Go语言中的条件变量Cond
- 对极验geetest滑块验证码图片还原算法的研究
- ABB系统备份与恢复(重做系统)S4C系统