`

4.5.1静态网络

阅读更多
第一种配置和连接代理网络的方法时通过使用静态配置的URI--配置一个可连接的代理URI列表。唯一的先决条件是你要知道你想使用的所有代理的地址。一旦你有了这些地址,你需要知道如何在配置中使用它们。所以让我们看看建立静态代理网络的可用连接器。
静态连接器
静态连接器被用来在一个网络中建立一个多个代理的静态配置。该协议使用了一个组合URI--一个包含其它URI的URI。一个组合URI包含多个在网络连接另外一端的代理地址或URI。
这里是静态协议的URI语法:
static:(uri1,uri2,uri3,...)?key=value
你能在ActiveMQ网站(http://mng.bz/r74v)上找到该传输的完整的说明文档。
现在看一下下面的配置示例:
<networkConnectors>
  <networkConnector name="local network"
    uri="static://(tcp://remotehost1:61616,tcp://remotehost2:61616)"/>
</networkConnectors>

假设这个配置是在localhost上的代理的并且在remotehost1和remotehost2上的代理起了并运行了,当你启动本地代理的时候你将注意到下面的信息:
...
INFO DiscoveryNetworkConnector - Establishing network connection between
from vm://localhost to tcp://remotehost1:61616
INFO TransportConnector - Connector vm://localhost Started
INFO DiscoveryNetworkConnector - Establishing network connection between
from vm://localhost to tcp://host2:61616
INFO DemandForwardingBridge - Network connection between vm://
localhost#0
and tcp://remotehost1:61616 has been established.
INFO DemandForwardingBridge - Network connection between vm://
localhost#2
and tcp://remotehost2:61616 has been established.
...

这些输出代表了在localhost上的代理已成功配置了连接另外两个运行于远程主机的代理的转发桥(forwarding bridge)。换句话说,发送到本地的消息会被转发到运行于remotehost1和
remotehost2的代理,但只是在有消费者请求这些信息的时候。
最好的理解的方式是通过修改使用股票示例。图4.6提供一个在该示例中使用的代理技术的透视图。(图略)
在该图中,两个代理已连接。代理通过URI和静态协议使用网络。消费者被绑定到代理B的一个目标中,它将穿过网络连接器请求消息。当生产者向代理B中相同的目标发送消息的时候,消息会被转发到有请求的代理上。这种情况中,代理A转发消息到代理B。接下来的例子将过一下这种基本的使用方法。
为了使例子工作,首先我们需要开启这两个连上的代理,让我们从代理B开始:
<broker xmlns="http://activemq.apache.org/schema/core"
brokerName="BrokerB"
dataDirectory="${activemq.base}/data">
<transportConnectors>
<transportConnector name="openwire" uri="tcp://localhost:61617" />
</transportConnectors>
</broker>

这个简单的配置启动了一个代理监听端口61617。我们可以通过下面的命令启动这个代理:
${ACTIVEMQ_HOME}/bin/activemq console \
xbean:src/main/resources/org/apache/activemq/book/ch4/brokerA.xml

现在是时候配置代理器A了:
<broker xmlns="http://activemq.apache.org/schema/core"
brokerName="BrokerA"
dataDirectory="${activemq.base}/data">
<transportConnectors>
<transportConnector name="openwire" uri="tcp://localhost:61616" />
</transportConnectors>
<networkConnectors>
<networkConnector uri="static:(tcp://localhost:61617)" />
</networkConnectors>
</broker>

除了传输连接器监听者61616端口,它定义了连接到代理B的网络连接。在另外独立的控制台窗口,你能像这样开启这个代理:
${ACTIVEMQ_HOME}/bin/activemq console \
xbean:src/main/resources/org/apache/activemq/book/ch4/brokerB.xml

现在我们已经启动了这两个代理,让我们运行股票示例。首先我们会打开我们的publisher并把它连接到代理A:
$ mvn exec:java -Dexec.mainClass=org.apache.activemq.book.ch4.Publisher \
-Dexec.args="tcp://localhost:61616 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
...

实际上它与早前TCP连接示例的命令是相同的。现在启动消费者并连接到代理B:
$ mvn exec:java -Dexec.mainClass=org.apache.activemq.book.ch4.Consumer \
-Dexec.args="tcp://localhost:61617 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
...

使用该设置,消息会被提交到代理A。这些消息将被转发到代理B,并被消费者接收。这个例子的所有功能没有改变并且publisher和consumer的表现和原来单个代理如出一辙。唯一不同的是它们现在连接不同的代理,这些代理被静态协议网在一起。
从这个简单的例子你能推断这个特定配置能帮助你处理这样的情况:你需要你的分布式客户端受益于与本地代理交互而不是远程代理的性能优点。
使用静态协议的示例
情况不同配置代理网络能也会不同。静态协议的使用考虑到一个明确标记网络应该存在。考虑这样的情况:位于远程办公室的客户端正在连接家里办公室的代理。根据每个远程办公室的客户端的数量,你可能最终会有太多的广域网连接到你的家庭办公室。这可能导致不必要的网络负担。为了使连接最小化,你可能想要在每个远程办公室里放置一个代理并允许一个在远程办公室代理和家庭办公室代理间的网络。这不仅会最小化远程办公室和家庭办公室网络连接数,而且会允许远程办公室的客户端应用运行得更有效率。在广域网上长连接的迁移意味着较少的潜在因素,并会减少对客户端应用的等待时间。
故障转移(FAILOVER)协议
在至今为止的示例中,客户端被配置去连接唯一特定的代理。但是万一你无法连接想连的代理或你的连接在之后的阶段掉了你该怎么办?你的客户端有两种选择:他们将优雅的死去或者尝试连接相同或一些其他代理并回复他们的工作。正如你可能猜到的,股票示例使用这些协议运行至今并不免于网络问题和不可用的代理。那就是例如故障转移协议来实现自动重连的地方。与网络连接器的情况类似,有两种方法提供一个合适的可用于客户端连接的代理的列表。在第一种情况下,你提供一个可用代理的列表。这种方式用户故障转移交互连接器(failover transport connector)。在第二种情况下,动态发现可用代理被使用。这会在下面一章介绍。这节将检验故障转移交互连接器。
故障转移器的URI语法类似之前的静态网络连接器的URI。实际上有两种格式:
failover:(uri1,...,uriN)?key=value
或者
failover:uri1,...,uriN
完整的说明信息可以在ActiveMQ的网站(http://mng.bz/u58s)上找到。
默认的,该协议使用一个随机算法来选择一个优先连接器。如果这个连接失败(在开启的时候或者后面的阶段),传输会选择另外一个URI并尝试连接。默认的配置也实现了重连延迟逻辑,意味着传输会在第一次尝试重连时有10毫秒延迟并在后面的尝试时翻倍,直到30000毫秒。同时,重连逻辑会无限期尝试重连。当然,所有的重连参数可以根据你的需要使用合适的传输选项进行配置。
回忆在上一节定义的静态代理网络。在那个示例中,所有发送到本地代理的信息可能被转发到位于remotehost1和remotehost2上的代理。因为所有的信息可能被同时发送到这两个代理,那些消息能被其中一台代理消耗。在这同样如此。唯一不同的是故障转移传输在代理的故障转移中会自动尝试重连。为了体验这个传输的使用,运行股票消费者和配置它使用故障转移连接器连接到代理:
$ mvn exec:java -Dexec.mainClass=org.apache.activemq.book.ch4.Consumer \
-Dexec.args="failover:(tcp://remotehost1:61616,tcp://
remotehost2:61616) CSCO ORCL"

这个解决方案的优美之处在于它在代理失败的事件中为了增加对自动重连的支持不需要对应用做改变。
现在让我们看看工作中的故障转移连接器。想象故障转移传输中的随机算法已被选择去连接host1上的代理。你能预见消费者会在启动时打印下面的log信息:
org.apache.activemq.transport.failover.FailoverTransport$1 iterate INFO: \
Successfully reconnected to tcp://host1:61616

正如我们所说的,所有发布者发送到本地代理的消息会被转发到host1上的代理并被消费者接收。现在尝试通过关闭host1上的代理模拟一个代理失败。消费者会打印如下的日志信息:
org.apache.activemq.transport.failover.FailoverTransport handleTransportFailure
WARNING: Transport failed,
attempting to automatically reconnect due to: java.io.EOFException
java.io.EOFException
at java.io.DataInputStream.readInt(DataInputStream.java:375)
at org.apache.activemq.openwire.OpenWireFormat.unmarshal(OpenWireFormat.java:268)
at org.apache.activemq.transport.tcp.TcpTransport.readCommand(TcpTransport.java:192)
at org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:184)
at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:172)
at java.lang.Thread.run(Thread.java:619)
org.apache.activemq.transport.failover.FailoverTransport$1 iterate
INFO: Successfully reconnected to tcp://host2:61616

注意最初的异常指出了失败,接着是重连到另外一个代理的日志信息。这个意味着消费者成功连接到另外一个代理并且你能看到在没有任何的帮助下它恢复了它的正常操作。
故障转移使用示例
由于它的重连能力,你为所有的客户端使用故障转移协议是非常明智的,即使一个客户端只连接到一个代理。例如,当代理因任何原因关闭的时候下面的URI会尝试恢复对同一个代理的连接:
failover:(tcp://localhost:61616)
它的优点是在代理失败(或维护等待)的情况下客户端不需要被手动重启。一旦代理再次可用客户端会自动重连。这意味着通过简单的利用ActiveMQ的特性是你的应用更健壮。
故障转移传输连接器在实现例如高性能和平衡加载的高级功能上扮演了一个重要的角色,也将会在第12章说明。
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    jna-4.5.1.jar

    它支持32位和64位架构,并且可以访问动态库(.dll/.so)和静态库(.lib)。 在`jna-4.5.1.jar`中,包含的主要组件有: 1. **com.sun.jna** 包:这是JNA的核心库,提供了对本地函数调用的基本支持。 2. **...

    opencv4.5.1 已经make好的源文件,直接调用

    在该版本中,开发者可以利用高效的图像处理函数、机器学习模型,以及深度学习模块,如DNN(深度神经网络)。直接调用这个预编译的源文件,可以节省开发时间,快速集成到项目中。 在CMake构建系统中,通常需要指定...

    openCV4.5.1X86.7z

    此外,OpenCV还提供了机器学习和深度学习模块,如SVM(支持向量机)、Haar级联分类器、以及现在的DNN(深度神经网络)模块,可以用来搭建和运行预训练的深度学习模型。 在VS2019中,开发者可以通过管理项目属性来...

    Professional C# 5.0 and .NET 4.5.1

    - 基于上下文的断言(Code Contracts):提供静态和运行时检查,确保代码的正确性。 - 动态编程:`dynamic`类型允许在运行时绑定对象,增强了与动态语言的交互。 2. **.NET Framework 4.5.1**: - Web API:一个...

    opencv-4.5.1-x86-64-gcc-10.2.0.zip

    在这个名为"opencv-4.5.1-x86-64-gcc-10.2.0.zip"的压缩包中,包含了使用MSYS2 MinGW环境下gcc 10.2.0编译器编译的64位版本OpenCV库,包括动态库和静态库,为开发者提供了在Windows平台上进行图像处理和机器学习应用...

    毕业设计:Python基于循环神经网络的情感分类系统设计与实现(源码 + 数据库 + 说明文档)

    毕业设计:Python基于循环神经网络的情感分类系统设计与实现(源码 + 数据库 + 说明文档) 2 相关技术支撑 10 2.1 循环神经网络(RNN) 10 2.2 GRU框架 11 2.3 Python语言 12 2.4 Mysql技术 12 2.5 Django框架 12 3 ...

    C#.NET网络编程.part1

    gui程序的编写和编译运行 4.4 基于udp协议的网络会话实例 4.4.1 服务器端编程 4.4.2 客户端编程 4.4.3 编译运行 4.5 基于udp广播的自动收报机的实现 4.5.1 服务器和客户端的公共类 4.5.2 ...

    最全面的门户网站架构设计方案.doc

    9 4.5 设备清单 11 4.5.1 硬件设备配置清单 11 4.5.2 设备技术规格 12 4.6 平台扩容的建议 12 网站的性能瓶颈分析 网站的性能影响因素很多,下面主要从如下4个方面进行分析说明: 1) 网络负载 a) 公网负载 b) 内网...

    安防天下智能网络视频监控技术详解与实践part2

    3.2 静态图像压缩技术 53 3.2.1 色相变换过程 54 3.2.2 区块切割与采样 55 3.2.3 离散余弦(dct)变换 57 3.2.4 量化过程介绍 58 3.2.5 z字形编码过程 59 3.2.6 dc系数及ac系数编码 59 3.2.7 熵编码介绍...

    网络互连_网桥.路由器.交换机和互连协议

    4.5.1 带宽费用 83 4.5.2 配置难易度 84 4.5.3 普遍性 84 4.5.4 网桥的费用和性能 85 4.6 改善源路由网桥的方法 85 4.6.1 源路由网桥的自动配置 85 4.6.2 使指数级的开销固定 86 第5章 集线器、交换机、虚拟局域网与...

    计算机网络工程实践教程—基于华为路由器和交换机

    计算机网络工程实践教程——基于华为路由器和交换机目录第2章交换机VLAN配置55 2.1交换机VLAN的端口划分和配置55 2.1.1操作内容和环境55 2.1.2VLAN的划分56 2.1.3操作步骤57 2.2VLAN之间的路由协议配置58 2.2.1操作...

    安防天下智能网络视频监控技术详解与实践.part3

    3.2 静态图像压缩技术 53 3.2.1 色相变换过程 54 3.2.2 区块切割与采样 55 3.2.3 离散余弦(dct)变换 57 3.2.4 量化过程介绍 58 3.2.5 z字形编码过程 59 3.2.6 dc系数及ac系数编码 59 3.2.7 熵编码介绍 61 ...

    onvif spec v2.0

    ONVIF设备支持动态和静态IP地址配置,这使得它们能够在不同的网络环境中灵活部署。 **4.3 设备发现** 使用WS-Discovery协议,设备可以在网络上被自动发现。这一过程简化了网络视频系统的设置过程,使得用户无需手动...

    安防天下智能网络视频监控技术详解与实践part1

    3.2 静态图像压缩技术 53 3.2.1 色相变换过程 54 3.2.2 区块切割与采样 55 3.2.3 离散余弦(dct)变换 57 3.2.4 量化过程介绍 58 3.2.5 z字形编码过程 59 3.2.6 dc系数及ac系数编码 59 3.2.7 熵编码介绍...

    GPRS基本原理与入门

    - **4.5.1 用户鉴权** 确认用户身份的真实性。 - **4.5.2 用户识别码保密** 对用户的身份信息进行加密保护。 - **4.5.3 用户数据和GMM/SM信令保密** 保障数据传输的安全性。 - **4.5.4 用户身份检查** 验证用户...

    GPRS基本原理,描述GPRS通信基本原理

    - **6.2.1 静态地址与动态地址**:静态地址为预先分配的固定IP地址,而动态地址则由网络自动分配。 - **6.2.2 PDP上下文的激活规程**:创建并初始化PDP上下文的过程。 - **6.2.3 PDP上下文的修改**:更新现有PDP上...

    MW153R 150M

    - **4.5.1 WAN口设置**:配置外网接入方式(如PPPoE、静态IP、动态IP等)。 - **4.5.2 LAN口设置**:设置局域网IP地址段、子网掩码等。 - **4.5.3 MAC地址克隆**:用于解决某些ISP限制MAC地址的问题。 **4.6 无线...

    ARRAY2600手册

    - **4.5.1 为接口配置IP地址** - 如何为网络接口分配IP地址。 - **4.5.2 为网关配置IP地址** - 设置默认网关的步骤。 - **4.5.3 检查IP地址的配置** - 查看已配置的IP地址信息。 - **4.5.4 激活WebUI** - ...

    CentOS.5系统管理-part1

    4.5.1 正则表达式基础 4.5.2 grep 4.6 文件编辑器Vi 4.6.1 Vi及其3种运行模式 4.6.2 普通模式下的操作 4.6.3 命令行模式下的操作 4.7 sed和awk 4.7.1 sed 4.7.2 awk 4.8 进程管理和作业控制 4.8.1 进程概述 4.8.2 ...

    juniper培训--中文版

    - 静态路由由网络管理员手动配置,适用于小型网络。 **5.2 Aggregated Routes和Generated Routes** - Aggregated routes和generated routes用于简化路由表,提高查找效率。 **5.3 Martian Routes** - Martian ...

Global site tag (gtag.js) - Google Analytics