4.5.2动态网络

4.5.2动态网络
迄今我们已经看到如何通过明确的代理URI(传输和网络连接器)建立代理网络并连接它们。如你将在本节看到的,ActiveMQ实现了几个机制,它们能被代理和客户端用

来发现彼此并建立必要的连接。
多路广播连接器
在一个IP网络,IP多路广播是被用来从一个发起者到一组兴趣接收点的简单数据传输(一对多交互)。IP多路广播的一个基本概念被称为组地址。这个组地址是一个在

224.0.0.0到239.255.255.255的范围的地址,它被用在发起者和接收方。发起者使用这个地址作为数据的目的地,然而接收方使用它表示它们在那组数据中的兴趣。
当IP多路广播被配置,ActiveMQ代理使用多路广播协议去广播它们的服务并定位其他代理的服务区建立代理网络。另一方面,客户端使用多路广播定位代理并建立与它

们的连接。这一节讨论代理如何利用多路广播;客户端对它的利用会晚一点介绍。
多路广播的URI语法如下:
multicast://ipadaddress:port?key=value
除了scheme部分与之前的URI没有什么不同。
这儿有一个ActiveMQ使用多路广播的默认配置的片段:
<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>

在这个示例中,default这个组名被用来替代特定的IP地址。这里有两个重要的东西实现了这个配置片段。首先传输连接器的discoveryUri属性被用来在默认组通知这

个传输器的URI。对发现可用代理感兴趣的所有客户端会使用这个连接器。这会在下面这节展示。
然后,网络连接器的uri属性被用来查询可用代理并和它们建立网络。在这种情况下,代理就像客户端一下运作,并使用多路广播查找目标。你能在ActiveMQ的网站上

找到完整说明([uri]http://mng.bz/14yJ[/uri])。
现在你知道了如何在代理端配置发现器,我确定你想知道你会在哪里使用到这个协议。
多路广播协议的使用示例
多路广播协议与TCP协议有些不同。不同处是自动发现其他代理替代了静态代理列表。
代理增加和移除频繁的地方和代理该表IP地址频繁的地方使用多路广播协议很普遍。这些情况下,与其为每次修改手动配置每个代理,利用发现协议更简单。
使用多路广播协议的一个缺点是发现是自动的。如果有代理你不希望被自动加到给定的组里,你必须小心建立代理网络的初始配置。代理网络的小心分割是重要的,因

为你不想要详细在他们不属于的代理网络被结束。另外的缺点是在网络上它可能极度爱聊天。因为这个原因,许多网络管理员不允许使用它。请在花时间使用多路广播

协议配置网络之前和你的网络管理员确认。
因为IP多路广播能在代理端被用来发现,这里有一个用于客户端的类似的发现协议。
发现协议
发现传输协议位于ActiveMQ多路广播功能的客户端。在表现说这个协议基本和故障转移协议是一样的。唯一的不同是它会使用多路广播发现可用的代理并随机选择一个

连接。
这个协议的语法是:
discovery:(discoveryAgentURI)?key=value
它的完整说明可以在ActiveMQ官方网站找到([uri]http://mng.bz/96wI[/uri])。
使用之前介绍的多路广播代理的配置,你能使用下面的命令运行代理:
${ACTIVEMQ_HOME}/bin/activemq console \
xbean:src/main/resources/org/apache/activemq/book/ch4/
activemq-multicast.xml

一旦代理被启动,使用如下的命令运行股票发布者:
$ mvn -e exec:java \
-Dexec.mainClass=org.apache.activemq.book.ch4.Publisher \
-Dexec.args="discovery:(multicast://default) CSCO ORCL"

你会在应用启动的时候看到如下的日志信息:
Jun 18, 2008 2:13:18 PM
org.apache.activemq.transport.discovery.DiscoveryTransport onServiceAdd
INFO: Adding new broker connection URL: tcp://localhost:61616
Jun 18, 2008 2:13:19 PM
org.apache.activemq.transport.failover.FailoverTransport doReconnect
INFO: Successfully connected to tcp://localhost:61616
...
Sending: {price=65.713356601409, stock=JAVA, offer=65.779069958011, up=true}
on destination: topic://STOCKS.JAVA
Sending: {price=66.071605671946, stock=JAVA, offer=66.137677277617, up=true}
on destination: topic://STOCKS.JAVA
Sending: {price=65.929035001620, stock=JAVA, offer=65.994964036622, up=false}
on destination: topic://STOCKS.JAVA
...

这些信息能告诉你发布者客户端成功使用多路广播发现和连接了本地代理。
PEER代理
如我们之前看到的,代理网络和嵌入式代理是有用的概念,他们允许你的代理符合你的基础设施需要。当然,理论上有可能建立嵌入式代理网络,但是手动配置会变得

很繁重。这是为什么ActiveMQ提供peer传输连接器,因为它允许你有更简单的网络嵌入式代理。peer连接器是一个实用的传输器,它是一个建立peer到peer的嵌入式代

理网络的VM连接器的超集。
这个协议的URI语法如下:
peer://peergroup/brokerName?key=value
你能在ActiveMQ网站(http://mng.bz/bIaH)上找到完整说明。
当启动peer协议URI,应用会自动启动一个嵌入式代理(如同VM协议的例子),但是也会配置代理建立到其他本地使用相同组名的代理的网络连接。
让我们用股票示例过一下这个协议的例子。在这种情况下,发布者和消费者会使用它们自己的会自动相连的嵌入式代理。图4.7提供了这个方案的更好地描述。
像这样使用group1发布股票发布者去建立它的嵌入式代理:
$ mvn -e exec:java -Dexec.mainClass=org.apache.activemq.book.ch4.Publisher \
-Dexec.args="peer://group1 CSCO ORCL"
...
Sending: {price=65.713356601409, stock=JAVA, offer=65.779069958011, up=true}
on destination: topic://STOCKS.JAVA
Sending: {price=66.071605671946, stock=JAVA, offer=66.137677277617, up=true}
on destination: topic://STOCKS.JAVA
Sending: {price=65.929035001620, stock=JAVA, offer=65.994964036622, up=false}
on destination: topic://STOCKS.JAVA
...

同样像这样使用group1发布股票消耗者:
$ mvn -e exec:java -Dexec.mainClass=org.apache.activemq.book.ch4.Consumer \
-Dexec.args="peer://group1 CSCO ORCL"
...
ORCL 65.71 65.78 up
ORCL 66.07 66.14 up
ORCL 65.93 65.99 down
CSCO 23.30 23.33 up
...

这两个命令启动了两个嵌入式代理(一个应用一个)并在两个代理间建立名字为group1的peer到peer代理网络。所有发送到代理的信息会在其他代理商像任何其他加入

group1的代理商一样有用。注意整个系统运行起来想两个应用使用了同一个集中代理。
PEER协议的使用示例
考虑应用位于一个区域销售代表的笔记本上,它经常于办公室的网络断开连接但是还需要应用在断开的模式下成功运行。这是客户端应用需要无视网络是否可用继续工

作的普遍情节。这是peer协议能被用来使嵌入式代理允许笔记本应用保持成功运行的情况。实际上,当在断开的模式下,应用简单的将信息发送到本地代理商,信息会

排队直到网络再次可用时发送出去。销售代表也能在笔记本断开连接的时候查看客户端调用访问日志等等。当笔记本被再次连上网络,所有的排队消息会被发送到需要

的消费者客户端。
FANOUT 连接器
fanout是另外一个被客户端用来同时连接到多个代理并重复操作到其他的代理的实用的连接器。它的URI语法是:
fanout:(fanoutURI)?key=value
你能在ActiveMQ网站(http://mng.bz/J7i0)上找到完整的说明。
fanoutURI能利用一个静态URI或者一个多路广播URI。考虑下面的例子:
fanout:(static:(tcp://host1:61616,tcp://host2:61616,tcp://host3:61616))
在图4.8中,客户端会使用这个静态协议去尝试连接三个静态定义的代理。
简单使用下面URI可能实现相同的效果:
fanout:(multicast://default)
这个假设这些代理被配置为使用多路广播发布他们的传输连接器。
默认的,fanout协议会等待最少两个代理被连上并且不会重复命令到队列(只有主题)。当然这两种特性可通过适当的选项配置。
最后,如果你计划使用fanout协议有一些事情你需要注意。首先,不建议用在消费消息。它的唯一的目的是生产消息到多个代理。同时,你使用的代理在同一个代理网

络中,可能某个消费者会接收到重复的消息。所以基本上,fanout协议仅被建议来发布消息到多个不相连的代理上。
以fanout协议,我们来结束关于代理网络和网络连接器的讨论。为了参考的目的,表4.2提供了一个本节所有协议的概要:
Table 4.2 Summary of protocols used to network brokers:
Protocol  Description
Static Used for defining networks of brokers with known addresses
Failover Used to provide reconnection logic for clients to the network of brokers or a single broker
Multicast Used for defining dynamic networks of brokers (broker addresses are not staticallydefined)
Discovery Used by clients to connect to dynamic network of brokers
Peer Used to easily connect multiple embedded brokers
Fanout Used to produce messages to multiple unconnected brokers
在本节我们看见ActiveMQ不仅是一个独立的消息代理;它能被用来建立复杂的网络来允许你实现良好的可伸缩性和可用性的消息传递基础设施。
4.6总结
ActiveMQ的连接选项是极其重要的,并且是用户遭遇的第一个项目。ActiveMQ的URI的格式被设计为容易理解并且它极大化地简化了连接。连接不仅通过传输连接器延

伸到客户端,也通过网络连接器延伸到其他代理。嵌入式代理和代理网络已简洁的介绍过了并将在第8和第10章详细讨论。同样重要的是证明了ActiveMQ连接选项真正

力量的重新连接协议和发现代理。当你选择你的消息系统的整体技术的时候,了解连接器的类型和个别协议的本质是重要的。ActiveMQ另外一个重要特性是消息持续化

,这将在下一章讨论。

猜你喜欢

转载自flxchy4.iteye.com/blog/1695271