ActiveMQ经纪人网络存储和转发

时间:2014-01-20 13:00:37

标签: activemq

我是使用ActiveMQ的新手,我正在尝试了解经纪人网络的运作方式。我已经阅读了activemq文档,并浏览了互联网上的一些文章,例如http://www.jakubkorab.net/2011/11/understanding-activemq-broker-networks.html

我在本地Windows桌面上进行了以下设置。有两个tomcat服务器分别在8080和9080上运行,其中包含一个包含活动mq的Web应用程序。 Web应用程序在启动时启动代理,因此当两台服务器都启动时,我有以下2个代理

经纪人A:在61616上运行 经纪人B:在61617上运行

Broker A的网络连接器设置为与Broker B连接,Broker B与Broker A的网络连接都具有默认配置

我正在观察以下行为

  1. 当我连接到服务器A上的Web应用程序时,发布消息,在服务器B上的Web应用程序上启动消费者并尝试接收消息我收到消息并从代理A和B中删除它。我通过测试尝试随后使用receiveSelected获取消息,但我没有得到任何数据
  2. 当我连接到服务器A上的Web应用程序时,发布消息,在服务器A上的Web应用程序上启动消费者并尝试接收消息我收到消息并从代理A和B中删除它。第1点检查
  3. 我的问题是,在两个经纪人的商店中,消息被删除的时间点 - 我只有在消费者请求消息并确认消息后才会这样做?这是否意味着在发布时,消息是在两个经纪人的本地商店?

1 个答案:

答案 0 :(得分:2)

在确认消费消息时,将从存储中删除消息。此外,对于经纪人网络,经纪人像常规客户一样消费彼此的消息,除非他们等到他们足够的消息等于连接的预取大小的75%,准备好在发送确认之前被确认(这个%是可配置的,与预取大小一样。)

由于默认预取是1000,这意味着750个消息需要通过网桥(两个代理之间的网络连接)并被另一个下游客户端消耗+确认,然后一个代理将消息收回到另一个代理,其中原始生产经纪人可以从持久存储中删除这些消息的时间。

只有一个经纪人以这种方式在网络中“开启”消息。

在发布时,发布者会立即收到与其连接的代理的响应。请注意,响应可能会延迟,直到消息持久存储在磁盘上,或者可能没有 - 取决于多种因素,包括目标类型(队列与主题与临时目标),消息的持久模式(PERSISTENT与NON_PERSISTENT),事务处理模式会议等等。要直接回答这个问题,如果消息同步持久化到磁盘,则只有在send()或commit()调用完成后,才能保证消息在直接服务于该客户端的代理的持久存储中。

经纪人之间以及客户端和经纪人之间存在大量的交互,这是异步执行的,而且很多都是同步执行的。消息的生成符合本地代理上的JMS保证:send()和commit()调用在客户端和代理之间是同步的,只有在满足保证时才会完成。致谢是异步的;在丢失连接或代理中断的情况下,客户端总是需要准备好重新传递消息(当您考虑客户端和服务器之间的事件顺序时,这不能完全消除)。由连接丢失导致的失败的发送()和提交()可能导致丢弃的消息或存储的消息(再次,不能完全解决) - 因此,客户端需要准备好处理重复。