ActiveMQ(二)

26 篇文章 0 订阅
7 篇文章 0 订阅

ActiveMQ的静态网络链接 

ActiveMQ的networkConnector是什么在某些场景下,需要多个ActiveMQ的Broker做集群,那么就涉及到Broker到Broker的通信,这个被称为ActiveMQ的networkConnector。

ActiveMQ的networkConnector默认是单向的,一个Broker在一端发送消息,另一Broker在另一端接收消息。这就是所谓的“桥接”。 ActiveMQ也支持双向链接,创建一个双向的通道对于两个 Broker,不仅发送消息而且也能从相同的通道来接收消息,通常作为duplex connector来映射,如下

 

 

“discovery“的概念一般情况下,

discovery是被用来发现远程的服务,客户端通常想去发现所有可利用的brokers;

另一层意思,它是基于现有的网络Broker去发现其他可用的Brokers。 有两种配置Client到Broker的链接方式,一种方式:Client通过Statically配置的方式去连接Broker,一种方式:Client通过discovery agents来dynamically的发现Brokers

 

Static networks

Static networkConnector是用于创建一个静态的配置对于网络中的多个Broker。

这种协议用于复合url,一个复合url包括多个url地址。格式如下: static:(uri1,uri2,uri3,...)?key=value

1:配置示例如下:

<networkConnectors>

<networkConnector name="local network" uri="static://(tcp://remotehost1:61616,tcp://remotehost2:61616)"/>

</networkConnectors>

 

Static networkConnector的基本原理示意图:

 

 

上图中,两个Brokers是通过一个static的协议来网络链接的。一个 Consumer链接到brokerB的一个地址上,当Producer在brokerA上以相同的地址 发送消息时,此时它将被转移到brokerB上。也就是,BrokerA会转发消息到 BrokerB上。 

 

networkConnector配置的可用属性:

1:name:默认是bridge

2:dynamicOnly:默认是false,如果为true, 持久订阅被激活时才创建对应的网路持久订阅。默认是启动时激活 3:decreaseNetworkConsumerPriority:默认是false。设定消费者优先权,如果为true,网络的消费者优先级降低

为-5。如果为false,则默认跟本地消费者一样为0

4:networkTTL :默认是1 ,网络中用于消息和订阅消费的broker数量

5:messageTTL :默认是1 ,网络中用于消息的broker数量

6:consumerTTL:默认是1 ,网络中用于消费的broker数量

7:conduitSubscriptions :默认true,是否把同一个broker的多个consumer当做一个来处理

8:dynamicallyIncludedDestinations :默认为空,要包括的动态消息地址,类似于excludedDestinations,

如:

<dynamicallyIncludedDestinations>

    <queue physicalName="include.test.foo"/>

    <topic physicalName="include.test.bar"/>
</dynamicallyIncludedDestinations>

9:staticallyIncludedDestinations :默认为空,要包括的静态消息地址。类似于excludedDestinations,

如:

<staticallyIncludedDestinations>

    <queue physicalName="always.include.queue"/>
</staticallyIncludedDestinations>

10:excludedDestinations :默认为空,指定排除的地址,示例如下:

<networkConnectors>

<networkConnector uri="static://(tcp://localhost:61617)" name="bridge" dynamicOnly="false" conduitSubscriptions="true" decreaseNetworkConsumerPriority="false">

<excludedDestinations>

<queue physicalName="exclude.test.foo"/>

<topic physicalName="exclude.test.bar"/>

</excludedDestinations>

<dynamicallyIncludedDestinations>

<queue physicalName="include.test.foo"/>

<topic physicalName="include.test.bar"/>

</dynamicallyIncludedDestinations>

<staticallyIncludedDestinations>

<queue physicalName="always.include.queue"/>

<topic physicalName="always.include.topic"/>

</staticallyIncludedDestinations>

</networkConnector>

</networkConnectors>

 

11:duplex :默认false,设置是否能双向通信

12:prefetchSize :默认是1000,持有的未确认的最大消息数量,必须大于0,因为网络消费者不能自己轮询消息 13:suppressDuplicateQueueSubscriptions:默认false,如果为true, 重复的订阅关系一产生即被阻止

14:bridgeTempDestinations :默认true,是否广播advisory messages来创建临时destination

15:alwaysSyncSend :默认false,如果为true,非持久化消息也将使用 request/reply方式代替oneway方式发送到远程broker。

16:staticBridge :默认false,如果为true,只有staticallyIncludedDestinations中配置的destination可以被处理。

 

“丢失”的消息,有这样的场景,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=">" enableAudit="false">

<networkBridgeFilterFactory>

<conditionalNetworkBridgeFilterFactory replayWhenNoConsumers="true"/>

</networkBridgeFilterFactory>

</policyEntry>

</policyEntries>

</policyMap>

</destinationPolicy>

 

容错的链接 

Failover Protocol 前面讲述的都是Client配置链接到指定的broker上。但是,如果Broker的链接失败怎么办呢?此时,Client有两个选项:要么立刻死掉,要么去连接到其它的broker上。 Failover协议实现了自动重新链接的逻辑。这里有两种方式提供了稳定的brokers列表对于Client链接。

第一种方式:提供一个static的可用的Brokers列表。

第二种方式:提供一个dynamic 发现的可用Brokers。

 

Failover Protocol 的配置方式

failover:(uri1,...,uriN)?key=value 或者 failover:uri1,...,uriN n Failover Protocol 的默认配置

默认情况下,这种协议用于随机的去选择一个链接去链接,如果链接失败了,那么会链接到其他的Broker上。默认的配置定义了延迟重新链接,意味着传输将会在10秒后自动的去重新链接可用的 broker。当然所有的重新链接参数都可以根据应用的需要而配置。

 

Failover Protocol 的使用示例,在客户端程序里面:

ConnectionFactory connectionFactory = new

ActiveMQConnectionFactory("failover:(tcp://192.168.1.106:61679,tcp://192.168.1.106:61819)

?randomize=false");

 

Failover Protocol 可用的配置参数:

1:initialReconnectDelay:在第一次尝试重连之前等待的时间长度(毫秒),默认10

2:maxReconnectDelay:最长重连的时间间隔(毫秒),默认30000

3:useExponentialBackOff:重连时间间隔是否以指数形式增长,默认true

4:backOffMultiplier:递增倍数,默认2.0

5:maxReconnectAttempts: 默认-1|0,自版本5.6起:-1为默认值,代表不限重试次数;0代表从不重试 (只尝试连接一次,并不重连),5.6以前的版本:0为默认值,代表不限重试次数所有版本:如果设置 为大于0的数,代表最大重试次数

6:startupMaxReconnectAttempts:初始化时的最大重连次数。一旦连接上,将使用maxReconnectAttempts 的配置,默认0

7:randomize:使用随机链接,以达到负载均衡的目的,默认true

8:backup:提前初始化一个未使用连接,以便进行快速失败转移,默认false

9:timeout:设置发送操作的超时时间(毫秒),默认-1

10:trackMessages:设置是否缓存[故障发生时]尚未传送完成的消息,当broker一旦重新连接成功,便将这些缓存中的消息刷新到新连接的代理中,使得消息可以在broker切换前后顺利传送,默认false

11:maxCacheSize:当trackMessages启用时,缓存的最大字节,默认为128*1024bytes 12:updateURIsSupported:设定是否可以动态修改broker uri(自版本5.4起),默认true

 

ActiveMQ的动态网络链接 

多播协议multicast

ActiveMQ使用Multicast 协议将一个Service和其他的Broker的Service连接起来。IP multicast是一个被用于网络中传输数据到其它一组接收者的技术。Ip multicast传统的概念称为组地址。组地址是ip地址在224.0.0.0到239.255.255.255之间的ip地址。 ActiveMQ broker使用multicast协议去建立服务与远程的broker的服务的网络链接。

基本的格式配置 multicast://ipadaddress:port?transportOptions transportOptions如下:

1:group:表示唯一的组名称,缺省值default

2:minmumWireFormatVersion:被允许的最小的wireformat版本,缺省为0

3:trace:是否追踪记录日志,默认false

4:useLocalHost:表示本地机器的名称是否为localhost,默认true

5:datagramSize:特定的数据大小,默认值4 * 1024 6:timeToLive:消息的生命周期,默认值-1

7:loopBackMode:是否启用loopback模式,默认false

8:wireFormat:默认用wireFormat命名

9:wireFormat.*:前缀是wireFormat

 

配置示例 1:默认配置,请注意,默认情况下是不可靠的多播,数据包可能会丢失

multicast://default 2:特定的ip和端口

multicast://224.1.2.3:6255 3:特定的ip和端口以及组名

multicast://224.1.2.3:6255?group=mygroupname

 

Activemq使用multicast协议的配置格式如下

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="multicast" dataDirectory="${activemq.base}/data">

<networkConnectors>

<networkConnector name="default-nc" uri="multicast://default"/>

</networkConnectors>

<transportConnectors>

<transportConnector name="openwire" uri="tcp://localhost:61616" discoveryUri="multicast://default"/>

</transportConnectors>

</broker>

 

上面的配置说明

1:uri=“multicast://default”中的default是activemq默认的ip,默认动态的寻找地址

2:“discoveryUri”是指在transport中用multicast的default的地址传递

3:“uri”指动态寻找可利用的地址

4:如何防止自动的寻找地址?

(1)名称为openwire的transport,移除discoveryUri=”multicast://default”即可。传输链接用默认的名称openwire来配置broker的tcp多点链接,这将允许其它broker能够自动发现和链接到

可用的broker中。

(2)名称为“default-nc”的networkConnector,注释掉或者删除即可。

ActiveMQ默认的networkConnector基于multicast协议的链接的默认名称是default-nc, 而且自动的去发现其他broker。去停止这种行为,只需要注销或者删除掉default-nc网络链接。

(3)使brokerName的名字唯一,可以唯一识别Broker的实例,默认是localhost n Multicast 协议和普通的tcp协议 它们是差不多的,不同的是Multicast能够自动的发现其他broker,从而替代了使用 static功能列表brokers。用multicast协议可以在网络中频繁的添加和删除ip不会有影响。

multicast协议的好处是:能够适应动态变化的地址。 缺点:自动的链接地址和过度的销耗网络资源。

 

Discovery协议 Discovery是在multicast协议的功能上定义的。功能类似与failover功能。它将动态的发现multicast 协议的broker的链接并且随机的链接其中一个broker。

基本配置格式如下:

discovery:(discoveryAgentURI)?transportOptions

transportOptions如下:

1:reconnectDelay:再次寻址等待时间,缺省值10

2:initialReconnectDelay:初始化设定再次寻址等待时间,缺省值10

3:maxReconnectDelay:最大寻址等待时间, 缺省值30000

4:useExponentialBackOff:是否尝试BackOff重链接,默认是true

5:backOffMultiplier:尝试Backoff的次数,默认是2

6:maxReconnectAttempts:如果异常,最大的重新链接个数,默认是0

7:group:组唯一的地址,默认是default

示例: discovery:(multicast://default)?initialReconnectDelay=100

Discovery协议的配置示例

<broker name="foo">

<transportConnectors>

<transportConnector uri="tcp://localhost:0" discoveryUri="multicast://default"/>

</transportConnectors>

</broker>

 

Peer协议

ActiveMQ提出了peer transport connector 以让你更加容易的去嵌入broker中网络中。它将创建一个优于vm链接的p2p网络链接。 默认格式如下: peer://peergroup/brokerName?key=value

 

Peer协议基本使用 当我们启动了用peer协议时,应用将自动的启动内嵌broker,也将会自动的去配置其它broker来建立链接,当然了,前提是必须属于一个组。

配置如下: peer://groupa/broker1?persistent=false 另外,生产者和消费者都各自链接到嵌入到自己应用的broker,并且在在本地的同一个组名中相互访问数据。

 

Peer协议的基本原理示意图

 

 

在本地机器断网的情况下,本地的client访问本地brokerA将任然正常。在断网的情况下发送消息到本地brokerA,然后网路链接正常后,所有的消息将重新发送并链接到 brokerB

 

Fanout协议 Fanout协议是同时链接多个broker,默认的格式如下: fanout:(fanoutURI)?key=value

示例:fanout:(static:(tcp://host1:61616,tcp://host2:61616,tcp://host3:61616)) 表示client将试图链接到三个static列表中定义的三个URI

 

Fanout协议的配置方式如下: fanout:(discoveryURI)?transportOptions transportOptions如下:

1:initialReconnectDelay:重新链接的等待时间,默认是10

2:maxReconnectDelay:最大重新链接的等待时间,默认是30000

3:useExponentialBackOff:是否尝试BackOff重链接,默认是true

4:backOffMultiplier:尝试Backoff的次数,默认是2

5:maxReconnectAttempts:如果异常,最大的重新链接个数,默认是0

6:fanOutQueues:是否将topic消息转换queue消息,默认false

7:minAckCount:Broker链接的最小数,默认是2

配置示例: fanout:(static:(tcp://localhost:61616,tcp://remotehost:61616))?initialReconne

ctDelay=100

特别提醒

Activemq不推荐使Consumer使用fanout协议。当Provider发送消息到多个broker中, 测试Consumer可能收到重复的消息

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值