使用 JMS/ActiveMQ 的并发同步请求-应答 - 模式/库?

2022-09-01 21:23:30

我有一个Web应用程序,当用户提交请求时,我们会向远程服务发送JMS消息,然后等待回复。(还有异步请求,我们为消息重播等设置了各种细节,所以我们更愿意坚持使用JMS而不是HTTP)

如何使用 JMS 实现请求响应?中,ActiveMQ 似乎不鼓励每个请求的临时队列或 JMSCorrelationID 上具有选择器的临时使用者的想法,因为启动它们会产生开销。

但是,如果我对回复使用池化使用者,如何从回复使用者调度回原始请求线程?

我当然可以编写自己的线程安全回调注册/调度,但我讨厌编写我怀疑已经由比我更了解的人编写的代码。

ActiveMQ页面推荐了自2006年以来一直没有更新的Lingo,以及Camel Spring Remoting,它因其许多gotcha错误而被我的团队禁止。

有没有更好的解决方案,以实现此模式的库的形式,还是以不同的模式的形式通过JMS模拟同步请求 - 应答?


相关 SO 问题:


答案 1

在过去的项目中,我们遇到了类似的情况,其中同步 WS 请求是使用一对 Async req/res JMS Messages 处理的。我们当时使用的是 Jboss JMS impl 和临时的,开销很大。destinations

我们最终编写了一个线程安全的调度程序,让 WS 等待 JMS 响应。我们使用 CorrelationID 将响应映射回请求。

该解决方案都是自行开发的,但是我遇到了一个很好的阻塞映射impl,它解决了将响应与请求匹配的问题。

阻止地图

如果解决方案是群集的,则需要注意将响应消息调度到群集中的正确节点。我不知道ActiveMQ,但我记得JBoss的消息是他们的可集群目的地在引擎盖下有一些故障。


答案 2

我仍然会考虑使用Camel并让它处理线程,也许没有弹簧远程处理,而只是原始的ProducerTemplates。

Camel有一些关于这个主题的很好的文档,并且与ActiveMQ配合得很好。http://camel.apache.org/jms#JMS-RequestreplyoverJMS

对于您关于启动基于选择器的消费者和开销的问题,ActiveMQ文档实际上指出的是,它需要往返ActiveMQ代理,该代理可能位于地球的另一端或高延迟网络上。在这种情况下,开销是到 AMQ 代理的 TCP/IP 往返时间。我会认为这是一种选择。已经成功地使用它多个时代。