目的
这个由7部分组成的博客系列将分享有关如何创建ActiveMQ代理网络以实现高可用性和可伸缩性的信息。
为什么要建立经纪人网络?
ActiveMQ消息代理是企业中消息传递基础结构的核心组件。 它需要高度可用并且可以动态伸缩,以促进具有不同容量需求的动态异构分布式应用程序之间的通信。
如今,在商用硬件上扩展企业应用程序已成为当务之急。 ActiveMQ通过能够创建代理网络来分担负载而很好地满足了这一要求。
很多时候,跨地理分布的数据中心运行的应用程序需要协调消息。 使用代理网络可以更好地设计跨地理区域/数据中心的运行消息生产者和消费者。
ActiveMQ使用传输连接器,通过它与消息生产者和使用者进行通信。 但是,为了促进代理之间的通信,ActiveMQ使用网络连接器 。
网络连接器是两个代理之间的桥梁,允许按需转发消息。
换句话说,如果代理B1启动到代理B2的网络连接器,则如果B2上至少有一个消费者使用同一通道,则B1上的通道(队列/主题)上的消息将转发到B2。 如果将网络连接器配置为双工,则消息将按需从B2转发到B1。
这非常有趣,因为经纪人现在可以彼此动态通信。
在这个由7部分组成的博客系列中,我们将研究以下主题,以了解这一非常强大的ActiveMQ功能:
- 网络连接器基础知识–第1部分
- 双工网络连接器–第2部分
- 在本地/远程代理上平衡消费者的负载–第3部分
- 平衡远程代理上的使用者/订户的负载
- 队列:负载均衡远程并发使用者–第4部分
- 主题:远程代理上的负载均衡持久订阅–第5部分
- 存储/转发消息和使用者故障转移–第6部分
- 如何防止邮件阻塞
- 虚拟目的地–第7部分
为了表示应有的信誉,以下URL帮助我创建了此博客文章系列。
先决条件
- ActiveMQ 5.8.0 –创建代理实例
- Apache Ant –运行ActiveMQ示例生产者和使用者进行演示。
为了便于演示,我们将在同一台计算机上使用多个ActiveMQ代理实例。
网络连接器基础知识–第1部分
下图显示了网络连接器的功能。 它桥接两个代理,并且如果由Broker-1建立消息,则根据需要将消息从Broker-1转发给Broker-2。
网络连接器可以是双工的,因此可以沿相反的方向转发消息。 从Broker-2到Broker-1,一旦Broker-1上存在某个使用者,并且该使用者存在于Broker-2中。 第2部分中的更多内容
在Broker-1和Broker-2之间设置网络连接器
- 创建两个代理实例,例如broker-1和broker-2
Ashwinis-MacBook-Pro:bin akuntamukkala$ pwd
/Users/akuntamukkala/apache-activemq-5.8.0/bin
Ashwinis-MacBook-Pro:bin akuntamukkala$ ./activemq-admin create ../bridge-demo/broker-1
Ashwinis-MacBook-Pro:bin akuntamukkala$ ./activemq-admin create ../bridge-demo/broker-2
由于我们将在同一台计算机上运行两个代理,因此我们将broker-2配置为没有端口冲突。
- 编辑
/Users/akuntamukkala/apache-activemq-5.8.0/bridge-demo/broker-2/conf/activemq.xml
- 将传输连接器从61616更改为61626
- 将AMQP端口从5672更改为6672(此博客不使用它)
- 编辑
/Users/akuntamukkala/apache-activemq-5.8.0/bridge-demo/broker-2/conf/jetty.xml
- 将Web控制台端口从8161更改为9161
- 配置从Broker-1到Broker-2的网络连接器
将以下XML代码段添加到/Users/akuntamukkala/apache-activemq-5.8.0/bridge-demo/broker-1/conf/activemq.xml
networkConnectors>
<networkConnector
name="T:broker1->broker2"
uri="static:(tcp://localhost:61626)"
duplex="false"
decreaseNetworkConsumerPriority="true"
networkTTL="2"
dynamicOnly="true">
<excludedDestinations>
<queue physicalName=">" />
</excludedDestinations>
</networkConnector>
<networkConnector
name="Q:broker1->broker2"
uri="static:(tcp://localhost:61626)"
duplex="false"
decreaseNetworkConsumerPriority="true"
networkTTL="2"
dynamicOnly="true">
<excludedDestinations>
<topic physicalName=">" />
</excludedDestinations>
</networkConnector>
</networkConnectors>
上面的XML代码片段配置了两个网络连接器“ T:broker1-> broker2”(仅队列中的主题除外)和“ Q:broker1-> broker2”(仅队列中的主题除外)。 这样可以很好地分隔用于主题和队列的网络连接器。
尽管我更愿意指定[type]:-> [destination broker],但名称可以是任意的。
URI属性指定如何连接到broker-2
- 启动经纪人2
Ashwinis-MacBook-Pro:bin akuntamukkala$ pwd
/Users/akuntamukkala/apache-activemq-5.8.0/bridge-demo/broker-2/bin
Ashwinis-MacBook-Pro:bin akuntamukkala$ ./broker-2 console
- 开始经纪人1
Ashwinis-MacBook-Pro:bin akuntamukkala$ pwd
/Users/akuntamukkala/apache-activemq-5.8.0/bridge-demo/broker-1/bin
Ashwinis-MacBook-Pro:bin akuntamukkala$ ./broker-1 console
在broker-1上的日志显示与broker-2建立了2个网络连接器
INFO | Establishing network connection from vm://broker-1?async=false&network=true to tcp://localhost:61626
INFO | Connector vm://broker-1 Started
INFO | Establishing network connection from vm://broker-1?async=false&network=true to tcp://localhost:61626
INFO | Network connection between vm://broker-1#24 and tcp://localhost/127.0.0.1:61626@52132(broker-2) has been established.
INFO | Network connection between vm://broker-1#26 and tcp://localhost/127.0.0.1:61626@52133(broker-2) has been established.
broker-1上的Web控制台@ http:// localhost:8161 / admin / connections.jsp显示了已建立到broker-2的两个网络连接器
broker-2上的相同内容未显示任何网络连接器,因为broker-2没有启动任何网络连接器
让我们看看这个动作
让我们在broker-1的名为“ foo.bar”的队列上产生100条持久消息。
Ashwinis-MacBook-Pro:example akuntamukkala$ pwd
/Users/akuntamukkala/apache-activemq-5.8.0/example
Ashwinis-MacBook-Pro:example akuntamukkala$ ant producer -Durl=tcp://localhost:61616 -Dtopic=false -Ddurable=true -Dsubject=foo.bar -Dmax=100
broker-1 Web控制台显示已将100条消息放入队列“ foo.bar”
http:// localhost:8161 / admin / queues.jsp
让我们在Broker-2上的“ foo.bar”队列上启动一个使用者。 这里要注意的重要一点是目标名称“ foo.bar”应该完全匹配。
Ashwinis-MacBook-Pro:example akuntamukkala$ ant consumer -Durl=tcp://localhost:61626 -Dtopic=false -Dsubject=foo.bar
我们发现,来自broker-1的foo.bar队列的所有100条消息都被转发到broker-2的foo.bar队列使用方。
位于http:// localhost:8161 / admin / queues.jsp的broker-1管理控制台
broker-2管理控制台@ http:// localhost:9161 / admin / queues.jsp显示,我们启动的使用者已经使用了从Broker-1按需转发的所有100条消息
foo.bar队列上的broker-2消费者详细信息
broker-1管理控制台显示所有100条消息都已出队[已通过网络连接器转发到broker-2]。
“ foo.bar”队列上的broker-1使用者详细信息显示该使用者是按需创建的:[连接器名称] _ [目标代理] _inbound_
因此,我们已经了解了ActiveMQ中网络连接器的基础。
请继续关注第2部分…
翻译自: https://www.javacodegeeks.com/2014/04/activemq-network-of-brokers-explained.html