【问题标题】:ActiveMQ distribution of messagesActiveMQ 消息分发
【发布时间】:2009-03-31 15:59:30
【问题描述】:

我有几台从 Python 生成 xml 文件的服务器和一些其他使用 Java 使用这些 xml 的服务器。我最近才研究了 JMS 和 ActiveMQ 并决定尝试使用它来传递 xml 文件。

所以我在消费者服务器上设置了 ActiveMQ 守护进程,并想在产品上实现一些循环方法,以便在消费者之间平均分配 xml。

Python  -----------------------------> ActiveMQ ---> Java
        \                           /
         \                         /
          ---------------------------> ActiveMQ ---> Java
                                 /  /
Python  ----------------------------

为了测试,我运行了一个生产者和一个消费者并查看了结果。

令我惊讶的是,来自生产者的消息分布在网络上的所有 ActiveMQ 服务器上。由于我只运行了一个消费者,因此它只接收到该机器上的 ActiveMQ 守护程序的 xml,其余的 xml 正在其他机器上的其他 ActiveMQ 守护程序上耐心等待。

Python  -----------------------------> ActiveMQ ---> Java (work)
                                          |
                                          |
                                       ActiveMQ (xmls piling up)

编辑:这不是实际发生的事情,抱歉。详情见下文

现在,我没有抱怨,因为无论如何这就是我想要的,但我有点困惑:实现我所追求的这个多对多队列的正确方法是什么?

我是否也应该在我的生产者机器上设置 ActiveMQ 守护程序,将 xmls 发送到 localhost ActiveMQs 并信任自动发现以将 xmls 发送给消费者?

Python ---> ActiveMQ ------------------------------ ActiveMQ ---> Java
                |                                      |
                |                                      |
                |                                -- ActiveMQ ---> Java
                |                               |  
Python ---> ActiveMQ----------------------------

为了安全起见,我是否应该坚持原来的计划,并在消费者机器上循环消息?

或者是否有我应该使用的 API 来隐藏我的流程中的这些细节?

顺便说一句,生产者是使用 STOMP 的 python 进程,消费者是使用 JMS 的 java。

如果我蹩脚的 ASCII 艺术作品让您的眼睛受伤,我深表歉意,我不确定我是否只用文字表达得足够清楚。

编辑

显然,当我运行“一个生产者和一个消费者”时,我没有注意到其他消费者已经在运行。他们只是没有对他们处理的 xml 做任何有用的事情。这就是我看到部分结果的原因。

在阅读了更多内容并进行了一些实验之后,我发现了以下内容:

默认情况下,ActiveMQ 会自动发现本地网络上的其他 ActiveMQ 实例,并创建一个存储转发network of brokers。这意味着生产者可以将 xmls 发布到任何 ActiveMQ 实例,他们将找到自己的方式让消费者在同一网络上侦听其他 ActiveMQ 实例。

请注意,文档声称不建议将自动发现用于生产设置。

不过,下面接受的答案仍然适用。使用 ActiveMQ 最简单的方法就是使用一两个服务器作为“队列服务器”。尽管如此,我还是选择了我原来的计划,因为我认为它会减少网络流量(使用中间服务器,xmls 必须进入它并再次退出它)。

【问题讨论】:

  • 关于您为什么看到第一个行为的任何更新?我很感兴趣,我希望我有一个答案,这似乎很奇怪。

标签: messaging activemq


【解决方案1】:

Itsadok,我认为您可能没有考虑正确使用消息传递。

在每个消费者的情况下拥有一个 MOM 实例(无论是 ActiveMQ、RabbitMQ 还是任何其他 MOM 代理)在概念上实际上没有意义。相反,最好将您的 MOM 代理视为消息路由器。

在这种情况下,您将拥有一个所有生产者和所有消费者都连接到的 ActiveMQ 代理实例(如果您遇到扩展问题,可能会被分片或以其他方式扩展,或者如果您考虑 HA 问题,则可能会被复制)。然后所有 XML 都转到同一个代理实例,所有消费者都从同一个代理实例读取。在这种情况下,代理将根据它使用的任何启发式方法来确定消息应该发送给哪个消费者。

这也意味着您可以动态添加和删除生产者和消费者,并且不会发生任何变化:它们都连接到相同的代理,因此您可以在负载变化或系统故障时添加和删除生产者和消费者。

【讨论】:

  • 谢谢!您能否解释一下为什么默认情况下两个 ActiveMQ 服务器会自动检测彼此并拆分消息?这里的场景是什么? (也许我应该提出另一个问题)。
  • 我建议打开另一个问题,因为如果不出意外,我实际上并不了解 ActiveMQ 集群的来龙去脉,无法提供响应。我敢肯定一些 ActiveMQ 专家可能会这样做!
猜你喜欢
  • 2012-04-28
  • 2013-07-08
  • 2015-03-14
  • 2012-09-10
  • 2010-10-16
  • 2015-07-16
  • 2012-09-10
  • 2018-02-03
  • 2019-06-11
相关资源
最近更新 更多