【问题标题】:ActiveMQ Network of Brokers store and forward代理的 ActiveMQ 网络存储和转发
【发布时间】:2014-01-21 02:29:10
【问题描述】:

我是使用 ActiveMQ 的新手,我正在尝试了解代理网络的工作原理。我已经阅读了activemq文档以及网上的一些文章,例如http://www.jakubkorab.net/2011/11/understanding-activemq-broker-networks.html

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

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

代理 A 的网络连接器设置为与代理 B 建立连接,代理 B 与代理 A 建立网络连接,两者均采用默认配置

我正在观察以下行为

  1. 当我连接到服务器 A 上的 Web 应用程序时,发布一条消息,在服务器 B 上的 Web 应用程序上启动一个使用者并尝试接收消息,我收到消息,它从代理 A 和 B 中删除。我测试随后尝试使用 receiveSelected 获取消息,但我没有收到任何数据
  2. 当我连接到服务器 A 上的 Web 应用程序时,发布一条消息,在服务器 A 上的 Web 应用程序上启动一个使用者并尝试接收消息,我收到消息,它从代理 A 和 B 中删除。与测试相同第1点检查

我的问题是,消息会在什么时候从两个代理的商店中删除 - 我只有在消费者请求消息并确认后才删除?这是否意味着在发布消息时在两个代理的本地存储中?

【问题讨论】:

    标签: activemq


    【解决方案1】:

    在确认消费的消息后,消息会从存储中删除。此外,通过代理网络,代理像普通客户端一样消费来自彼此的消息,除了它们等待直到它们有足够的消息等于连接的预取大小的 75%,在发送确认之前准备好被确认(这个百分比是可配置的,预取大小也是如此)。

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

    一条消息在网络中一次只能由一个代理以这种方式“onwed”。

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

    代理之间以及客户端和代理之间有很多交互,它们是异步执行的,还有很多是同步执行的。消息的生成满足本地代理上的 JMS 保证:send() 和 commit() 调用在客户端和代理之间是同步的,并且仅在满足保证时才完成。确认是异步的;在连接丢失或代理中断的情况下,客户端始终需要为重新传递消息做好准备(当您考虑客户端和服务器之间的事件顺序时,这不能完全消除)。连接丢失导致的失败发送()和提交()可能导致消息丢失或存储消息(同样,不能完全解决) - 因此,客户端需要再次准备好处理重复。

    【讨论】:

    • 感谢您的详细解释。虽然它提供了一些观点,但它并没有回答我的问题是,在我的设置中,经纪人似乎是作为一个集合工作的。因此,无论我向哪个代理发布消息,我都只能从任一代理接收它,一旦收到它,我就无法再次接收它。我正在使用带有以下属性集的 Spring 的 JMS 模板
    • 跨度>
    • JMS 语义适用。队列是对所有消费者的一次且仅一次的消息消费,无论消费者在代理网络中的位置如何(上面提到的重新传递警告)。主题向所有消费者广播消息。
    • 我在本地环境之外尝试过这个,发现下面列出的令人困惑的结果
    • 我的 networkConnector URL 的格式为 static:(tcp://host1:61616,tcp:/host2:61616,tcp:/host3:61616)。我正在使用 receiveSelected 来检索使用 Jms Correlation Id 的特定消息。我有 5 条消息全部发送到主机 1 上的代理。当我明确连接到 host2 以接收特定消息时,我发现随后我永远无法在 host1 上获得其他 4 条消息中的任何一条。似乎在您调用 receiveSelected 的那一刻,代理 1 将所有消息转发到主机 2 上的代理。如果您转到 host3 之后,host1 和 host2 无法提取消息,则相同的级联行为。
    猜你喜欢
    • 2013-03-10
    • 1970-01-01
    • 2012-01-04
    • 2010-11-30
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多