【发布时间】: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 必须进入它并再次退出它)。
【问题讨论】:
-
关于您为什么看到第一个行为的任何更新?我很感兴趣,我希望我有一个答案,这似乎很奇怪。