`

网络连接模式(network connector)详解

阅读更多

网络连接模式(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)详解.docx

    ActiveMQ 集群网络连接模式(Network Connector)详解 ActiveMQ 集群网络连接模式(Network Connector)是 ActiveMQ 提供的一种集群功能,旨在提高消息服务的横向扩展性和高可用性。通过将多个不同的 broker 实例...

    高可用之ActiveMQ集群:网络连接模式(network connector)详解.docx

    【ActiveMQ集群网络连接模式详解】 ActiveMQ 是一个开源的消息代理服务器,它支持多种消息协议,如AMQP、STOMP等。在面对大规模消息处理需求和追求系统高可用性时,ActiveMQ 提供了集群解决方案,其中网络连接模式...

    消息队列中间件ActiveMQ入门到精通视频教程及资料

    001-ActiveMQ基础;002-安全机制+签收模式+发送模式+MessageProducer;...ActiveMQ集群:网络连接模式(network connector)详解.docx;ActiveMQ集群:网络连接模式(network connector)详解.docx;示例;

    network-connector:NPM插件以允许连接到HmSYS网络。 在HmSYS-Control和Panda2.0中使用

    《network-connector:NPM插件与HmSYS网络连接详解》 在现代软件开发中,集成和通信是至关重要的环节。"network-connector"是一个NPM(Node Package Manager)插件,它专为实现与HmSYS网络的连接而设计。这个插件的...

    Java消息中间件ActiveMQ学习资料

    "ActiveMQ集群:网络连接模式(network connector)详解"这部分内容,将深入探讨ActiveMQ的集群特性。在高可用性和负载均衡的场景下,ActiveMQ可以通过网络连接器在网络中的不同节点间建立连接,实现消息的同步和复制...

    Mina长连接(Android客户端-Java服务器)简单应用

    《Mina长连接在Android客户端与Java服务器中的应用详解》 Mina(Minimal Asynchronous Network)是一个开源的网络通信框架,广泛应用于Java平台,尤其在处理高性能、高并发的网络应用时表现出色。本篇文章将深入...

    详细讲解Hyper-V虚拟机的网络配置

    它通过在物理网卡上运行“Microsoft Virtual Network Switch Protocol”来模拟二层交换机的功能,支持VLAN划分,从而能够灵活地构建满足企业需求的网络环境。 **外部虚拟网络的关键功能包括:** - **VLAN支持**:...

    配置ActiveMQ 静态集群

    网络连接器(network connector)用于让不同的ActiveMQ实例相互通信。在`&lt;networkConnectors&gt;`元素下添加如下配置,设置集群间的通信: ```xml &lt;networkConnectors&gt; (tcp://node1-host:61616,tcp://node2-host:...

    基于Android开发MINA框架使用详解

    此时,我们可以借助开源框架MINA(Multi-purpose Infrastructure for Network Applications)来构建高效、可扩展的网络应用程序。MINA是一个用Java编写的高性能、异步I/O框架,适用于多种传输协议,如TCP/IP和UDP/IP...

    Mina通信Demo

    - 网络连接管理:处理连接超时、异常断开等问题。 - 数据压缩:提高数据传输效率,减少网络负载。 - 多线程处理:提高并发性能,避免阻塞主线程。 - 安全性:使用SSL/TLS加密通信,保障数据安全。 通过这个"Mina...

    Mina通信框架应用示例

    - IoSession:表示网络连接,包含与连接相关的状态信息和操作。 - IoProcessor:负责实际的I/O操作,如读写数据到网络。 - Transport:提供不同类型的传输层,如TCP、UDP等。 4. 使用MINA直接传送对象 MINA提供...

    mina服务器和客服端实现

    Apache Mina(Minimum Asynchronous Network)是一个高度可扩展的网络通信框架,它为开发者提供了构建高性能、高可用性的网络应用程序的基础。在本文中,我们将深入探讨如何利用Mina来实现服务器和客户端的通信,...

    Android mina 包

    Apache Mina(Model-View-Controller for Network Applications)是一个网络通信框架,它简化了开发高性能、高可用性的网络服务的过程。Mina提供了异步事件驱动的网络应用程序架构,适用于TCP/IP和UDP/IP协议。在...

    mina详细学习资料

    Apache MINA(Multipurpose Infrastructure for Network Applications)是一个Java框架,专为开发高性能和高可用性的网络应用程序而设计。MINA提供了高级通信抽象,如NIO(非阻塞I/O)和事件驱动的架构,简化了网络...

    可以运行的Mina udp demo

    Mina (Java Invented Network Application Platform) 是一款强大的网络通信框架,主要用于构建高性能、高可用性的网络应用。它提供了一种简单的方式来处理TCP/IP和UDP/IP协议,使得开发者无需深入理解底层网络编程的...

    JDBC_driver.rar

    **JDBC驱动详解** JDBC(Java Database Connectivity)是Java编程语言中用来规范客户端程序如何访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC驱动是实现JDBC标准的Java类库,它使得Java...

    cpp-Skynet是一个轻量级的为在线游戏服务器打造的框架

    1. **事件驱动**: Skynet 采用事件驱动模型,通过消息队列处理各种事件,如网络连接、游戏逻辑更新等。这种模型允许服务器在等待事件时挂起,节省 CPU 资源。 2. **服务(Service)**: 在 Skynet 中,每个服务都是...

    集成电路的英语注释缩写

    ### 集成电路的英语注释缩写详解 #### 定时基准 Timing reference **定义:** 在集成电路设计及应用领域中,“定时基准”指的是一个标准的时间参考信号,用于同步系统中的各种操作。它是确保数据正确传输和处理的...

Global site tag (gtag.js) - Google Analytics