2

我有几台从 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 实例,并创建一个存储转发网络的 brokers。这意味着生产者可以将 xmls 发布到任何 ActiveMQ 实例,他们将找到自己的方式让消费者在同一网络上侦听其他 ActiveMQ 实例。

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

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

4

1 回答 1

1

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

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

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

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

于 2009-03-23T14:13:20.527 回答