我有几台从 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 必须进入它并再次退出它)。