当前位置: 首页 > 知识库问答 >
问题:

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

竺承望
2023-03-14

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

在如何使用JMS实现请求-响应?,ActiveMQ似乎不鼓励每个请求使用临时队列,也不鼓励在JMSCorrelationID上使用选择器的临时消费者,因为这会增加开销。

但是,如果我使用池消费者进行回复,我如何从回复消费者发送回原始请求线程?

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

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

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

相关SO问题:

  • 使用JMS临时队列进行同步使用是一种好做法吗?,这表明在JMSCorrelationID上使用选择器启动消费者实际上开销很低,这与ActiveMQ文档所说的相矛盾。谁是对的

共有3个答案

慕飞章
2023-03-14

一位同事提出了一个潜在的解决方案——每个webapp线程一个响应队列/消费者,我们可以将返回地址设置为该特定线程拥有的响应队列。由于这些线程通常是长寿命的(并被重新用于后续的web请求),我们只需要在池生成线程时承受开销。

这就是说,整个练习让我重新思考JMS与HTTP之间的关系…:)

高德水
2023-03-14

我仍然会考虑使用Camel,让它处理线程,也许不需要spring远程处理,只需要原始产品模板。

骆驼有一些很好的留档关于这个主题和工程与ActiveMQ非常好。http://camel.apache.org/jms#JMS-RequestreplyoverJMS

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

姚臻
2023-03-14

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

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

这个解决方案完全是自己开发的,但是我遇到了一个很好的阻塞映射iml,它解决了将响应与请求匹配的问题。

方块图

如果您的解决方案是集群式的,则需要注意将响应消息发送到集群中的正确节点。我不知道ActiveMQ,但我记得JBoss消息传递在集群目的地的后台出现了一些小故障。

 类似资料:
  • 我无法将来自topic3的响应与topic1上的请求关联起来,因为correlationid在中间主题中丢失了。如果我不使用中间主题(比如topic2),那么topic1将发送一个带有相关ID的消息,相应的响应将从Topic3接收。 任何意见/建议都大有帮助。 下面是示例代码:从我的API中,我发布了一个事务

  • 可靠的请求-应答模式 第三章中我们使用实例介绍了高级请求-应答模式,本章我们会讲述请求-应答模式的可靠性问题,并使用ZMQ提供的套接字类型组建起可靠的请求-应答消息系统。 本章将介绍的内容有: 客户端请求-应答 最近最少使用队列 心跳机制 面向服务的队列 基于磁盘(脱机)队列 主从备份服务 无中间件的请求-应答 什么是可靠性? 要给可靠性下定义,我们可以先界定它的相反面——故障。如果我们可以处理某

  • 我试图使用请求回复模式,如微软文档(https://docs.microsoft.com/en-us/azure/service-bus-messaging/message-sessions#request-response-pattern)中所述 “多个应用程序可以将其请求发送到单个请求队列,并将特定的头参数设置为唯一标识发送方应用程序。接收方应用程序可以处理队列中的请求,并在启用会话的队列上发

  • 第三章 高级请求-应答模式 在第二章中我们通过开发一系列的小应用来熟悉ØMQ的基本使用方法,每个应用会引入一些新的特性。本章会沿用这种方式,来探索更多建立在ØMQ请求-应答模式之上的高级工作模式。 本章涉及的内容有: 在请求-应答模式中创建和使用消息信封 使用REQ、REP、DEALER和ROUTER套接字 使用标识来手工指定应答目标 使用自定义离散路由模式 使用自定义最近最少使用路由模式 构建高

  • 问题内容: 我正在尝试使用进行同步请求。我查看了Stackoverflow并发现了这个问题:使异步alamofire请求成为sync 我看到接受的答案用于使请求同步,但是我无法使其正常工作。这是我的简化代码: 有了这段代码,我在尝试制作时会出错。我收到的错误如下: 无法调用非功能类型“布尔”的值 我尝试使用许多使用完成的示例来同步获取值(因为我需要先检索数据才能将其显示在表上,并同时获取该表的行数