网络连接模式

针对海量消息所要求的横向扩展性和系统的高可用性,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部署集群(七)相关推荐

  1. Kubernetes学习之路(26)之kubeasz+ansible部署集群

    目录 1.环境说明 2.准备工作 3.分步骤安装 3.1.创建证书和安装准备 3.2.安装etcd集群 3.3.安装docker 3.4.安装master节点 3.5.安装node节点 3.6.部署集 ...

  2. Linux部署集群入门

    Linux部署集群入门 1.克隆虚拟机 直接复制已有的虚拟机的文件夹复制及可 2.配置网卡和ip地址 2.1配置网卡 2.2 配置ip地址 2.3 重启!!! 3.关闭防火墙 4.关闭seLinux ...

  3. 云服务器-异地部署集群服务-Kubernetes(K8S)-网络篇

    重要!!! 注意: 本文使用二进制安装,过程非常繁琐,所以不推荐大家使用这种安装方式.请使用更简洁的kubeadm安装,具体请参考 云服务器-异地部署集群服务-Kubernetes(K8S)-Kube ...

  4. Docker-三剑客之machine、compose、swam集群、visualizer监控、stack部署集群、Portainer可视化

    目录: 介绍 一.docker-machine 1.machine安装 2.使用docker-machine 二.Docker-compose 1.docker-compose配置 2.修改hapro ...

  5. Ceph实战(十一):重磅!!!一键部署集群的脚本

    您好,我是码农飞哥,本篇文章是Ceph实战专栏的第十一篇文章,前面的系列文章我们分别介绍了集群的部署,介绍了集群的组件,最后到介绍到Ceph的IO流程等等.这一篇文章是结束之作,我将介绍一下重点介绍快 ...

  6. Kubernetes v1.13 二进制部署集群

    Kubernetes v1.13 二进制部署集群(HTTPS+RBAC) 官方提供的几种Kubernetes部署方式 minikube Minikube是一个工具,可以在本地快速运行一个单点的Kube ...

  7. swarm部署集群_WildFly Swarm –将Java EE应用程序部署为独立的Jar

    swarm部署集群 WildFly Swarm提供了一个简单的解决方案,用于将Java EE应用程序部署为独立的Jar文件. 这使得部署应用程序非常容易,尤其是REST或Web服务. Swarm在这方 ...

  8. SRS部署集群服务 Edge 模式[SRS V4.0]

    SRS 部署集群服务 Edge 模式 前言 Edge原理 下载并编译SRS 准备三台服务器,一台也可以,但是播放多了会有卡顿问题 配置SRS 测试SRS集群服务 前言 SRS是一个简单高效的实时视频服 ...

  9. Docker 三剑客-------docker swam,visualizer监控、stack部署集群、Portainer可视化

    Docker 三剑客-------docker swam.visualizer监控.stack部署集群.Portainer可视化 文章目录 Docker 三剑客-------docker swam.v ...

最新文章

  1. 【Java】 实现一副扑克牌,包含:洗牌+发牌(3个人,一人5张)+输出牌的信息 的逻辑
  2. 熟悉常用的HDFS操作
  3. 【二分图最大匹配】【HDU2063】过山车
  4. Java开发者必备的六款工具
  5. SpringBoot实现过滤器、拦截器与切片源码分析
  6. mysql存储过程中as_Mysql存储过程中的delimiter
  7. VMware 安装ubuntu 18.04遇到的问题
  8. Golang 处理 Json(二):解码
  9. P3174 [HAOI2009]毛毛虫(树形dp)
  10. linux目录树(书本上看到)
  11. 解决eclipse出现The superclass javax.servlet.http.HttpServlet was not found on the Java Build Path
  12. 解密 Go interface 的类型转换原理
  13. mysql 深入视图和索引
  14. How to Install Jdownloader on Ubuntu
  15. ramda 函数 logic
  16. Web前端开发技术课程大作业——南京旅游景点介绍网页代码html+css+javascript
  17. 小型双轮差速底盘实现触须避障
  18. Go语言中的条件变量Cond
  19. 对极验geetest滑块验证码图片还原算法的研究
  20. ABB系统备份与恢复(重做系统)S4C系统

热门文章

  1. windows终止处理程序( __try __finally) 简单解析
  2. 容器网络|深入理解Cilium
  3. 从Java角度看Golang
  4. 研究发现视频会议增加员工压力、 谷歌地球升级4D交互体验、Apple新品发布、网飞用户增长缓慢等|Decode the Week
  5. 微博客户端播放器的演进之路
  6. ClickHouse留存分析工具十亿数据秒级查询方案
  7. 极速搭建一个个人博客网站
  8. 如何从零到一地开始机器学习?
  9. 分析redis中大key的几种办法
  10. go corn定时器