我有几台服务器从Python生成xml文件,而其他一些服务器使用Java生成这些xmls。我最近才查看JMS和ActiveMQ,并决定尝试使用它来传递xml文件。
所以我在消费者服务器上设置了ActiveMQ守护进程,并认为我会在产品上实现一些循环方法,以便在消费者中均匀分配xmls。
Python -----------------------------> ActiveMQ ---> Java
\ /
\ /
---------------------------> ActiveMQ ---> Java
/ /
Python ----------------------------
为了测试,我运行了一个生产者和一个消费者并查看了结果。
令我惊讶的是,来自生产者的消息分布在网络上的所有ActiveMQ服务器上。由于我只运行了一个消费者,它只接收到该机器上的ActiveMQ守护进程的xmls,其余的xmls耐心等待其他机器上的其他ActiveMQ守护进程。
Python -----------------------------> ActiveMQ ---> Java (work)
|
|
ActiveMQ (xmls piling up)
编辑:这不是实际发生的事,抱歉。有关详细信息,请参阅下文
现在,我没有抱怨,因为这是我想要的,但我有点困惑:实现这个多对多队列的正确方法是什么?
我是否应该在生产者计算机上设置ActiveMQ守护进程,将xmls发送到localhost ActiveMQs并信任自动发现以将xmls发送给消费者?
Python ---> ActiveMQ ------------------------------ ActiveMQ ---> Java
| |
| |
| -- ActiveMQ ---> Java
| |
Python ---> ActiveMQ----------------------------
我应该坚持原来的计划,并在消费者机器上循环消息,只是为了安全吗?
或者我是否应该使用隐藏我的流程中的详细信息的API?
BTW,生产者是使用STOMP的python进程,而消费者是使用JMS的java。如果你的眼睛受到我糟糕的ASCII艺术的伤害,我很抱歉,我不确定我是否只是用语言表达清楚。
显然,当我运行“一个生产者和一个消费者”时,我没有注意到其他消费者已经在运行。他们只是没有对他们处理的xmls做任何有用的事情。这就是我看到部分结果的原因。
在阅读了一点并尝试了一点之后,我想出了以下内容:
默认情况下,ActiveMQ将自动发现本地网络上的其他ActiveMQ实例,并创建存储转发network of brokers。这意味着生产者可以将xmls发布到任何ActiveMQ实例,他们将找到消费者在同一网络上监听其他ActiveMQ实例的方式。
请注意,该文档声称不建议将自动发现用于生产设置。
但是,下面接受的答案仍然适用。使用ActiveMQ的最简单方法是使用一个或两个服务器作为“队列服务器”。尽管如此,我选择使用我原来的计划,因为我认为它将减少网络流量(使用中间服务器,xmls必须进入它并再次进入它)。
答案 0 :(得分:1)
Itsadok,我想你可能没有考虑正确使用消息传递。
在每个消费者的情况下拥有一个MOM实例(无论是ActiveMQ,RabbitMQ还是任何其他MOM代理)在概念上并没有多大意义。相反,最好将您的MOM代理视为消息路由器。
在这种情况下,您将拥有一个ActiveMQ代理实例(如果您有扩展问题,可能会进行分片或以其他方式进行扩展,或者如果您有HA注意事项,则可以复制),所有生产者和所有使用者都可以连接到该实例。然后,所有XML都转到同一代理实例,并且所有使用者都从同一个代理实例读取。在这种情况下,代理将根据其使用的任何启发式方法确定消息应该转到哪个消费者。
这也意味着您可以动态添加和删除生产者和使用者,并且不会发生任何变化:它们都连接到相同的代理,因此您可以在负载变化或系统出现故障时添加和删除生产者和使用者。