【问题标题】:JMS: publisher publishes to queue, subscriber would like to read like it was a topicJMS:发布者发布到队列,订阅者希望像阅读主题一样阅读
【发布时间】:2013-12-06 02:17:57
【问题描述】:

我有一个无法更改的 JMS 发布者(外部系统)。这个发布者将消息发布到一些预定义的 JMS 队列中。我想设计一个多节点订阅系统,其中所有订阅节点都将收到每条消息的副本(在我的设计中,订阅节点能够通过检查消息中的某些属性来实现消息是否针对该节点,因此只有一个订阅者节点最终会处理该消息,而其他订阅者节点将丢弃它们的副本)。

将发布者系统更改为使用主题可以完美运行,但我无法更改发布者。

目前,我看到了两种解决方案:

  1. 一个可能可行的选项是使用 QueueBrowser,实施定期轮询,它将读取所有消息,如果消息是“我的”,则从队列中删除消息并处理。对于这样一个简单的问题,这是一个巨大的开销。

  2. 另一种选择是编写一个调度程序,它订阅队列并将每条消息分发给多个“内部”订阅者(例如,此处解释为:JMS - Going from one to multiple consumers)。但这会在调度程序中造成瓶颈,扼杀整个可伸缩性的想法。

  3. 第三种选择是拥有多个“中间”队列订阅者,每个订阅者在收到消息时,将其重新发布到目标订阅者将订阅的主题。这可以工作,但它是流程中的额外一跳,因此不确定收益(可扩展性)是否值得损失(延迟和复杂性)。

我想知道关于如何解决这个问题是否还有其他想法。

  • 我可以让订阅者收听所有主题吗?
  • 我可以配置 JMS(在我的例子中是 WebLogic)将消息从队列自动转发到某个主题吗?
  • 其他选项?

谢谢。

【问题讨论】:

  • 使用 Oracle Service Bus,您可以将队列路由到上面 #2 中提到的主题。它是一个可选的中间件,可以与 Weblogic 一起安装。它具有用于 JMS 和 Web 服务的各种路由选项。 orafmwschool.com/oracle-service-bus-routing-and-transformation
  • 有意思,看来可以解决问题了。谢谢。如果您愿意,请将其作为答案,以便我标记您的答案。

标签: jms weblogic


【解决方案1】:
    Take a look at JMS routing using Apache CAMEL 


<camelContext id="camel" xmlns="http://activemq.apache.org/camel/schema/spring">
 <!-- simple bridge from a topic to queue --> 
<route> 
<from uri="activemq:topic:topic.HelloWorld.incoming"> <to uri="activemq:queue:queue.HelloWorld"> 

</route>
 </camelContext>

【讨论】:

  • 谢谢。所以,这就像我的选项 #3,只是通过设置 Apache Camel 并配置它来实现,而不是使用 5 行代码编写我自己的路由,对吗?换句话说,如果我理解正确的话,它仍然是产生额外延迟的额外跃点。
【解决方案2】:

使用 Oracle Service Bus,您可以将队列路由到上面 #2 中提到的主题。它是一个可选的中间件,可以与 Weblogic 一起安装。它具有用于 JMS 和 Web 服务的各种路由选项。

快速浏览一下: http://www.orafmwschool.com/oracle-service-bus-routing-and-transformation/

http://www.slideshare.net/gschmutz/where-andwhentousetheoracleservicebusv2

我们使用它的目的与您正在寻找的目的非常相似。

【讨论】:

  • 谢谢。我想知道在像我这样的情况下,这种调度/路由增加了多少开销/延迟。我的意思是,它是消息路由(延迟)中的一个额外跃点,它现在是对所有目标主题侦听器的对等消息广播(额外的 CPU/时间/流量/等)。你测量过这些东西吗?非常感谢。
  • 我们已经做了一些负载测试和测量,有/没有路由,以确保我们能够满足我们的要求,尝试以 1k 的速度推送超过 500 msgs/sec。使用 OSB 进行路由会增加大约 8% 的额外开销。
猜你喜欢
  • 2016-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-14
  • 1970-01-01
  • 2013-08-04
  • 1970-01-01
  • 2021-07-28
相关资源
最近更新 更多