何时使用JMS以及何时使用REST?

jmd*_*dev 43 rest integration asynchronous jms synchronous

除了特定问题的异步/同步特性,并考虑到MOM(在这种情况下选择了JMS)提供免费的额外功能,如负载平衡和其他功能,在选择JMS而不是REST时还可以考虑其他什么,反之亦然?

谢谢

Tom*_*ard 50

始终使用REST.它是当今最先进,最先进,可扩展的集成方法.只需使用硬件或软件HTTP负载均衡器即可实现基于REST的服务的负载均衡,并且可以将其视为与JMS中的负载平衡一样免费.

MOM (面向消息的中间件)无法轻松扩展(但可以扩展到足以满足您的需求).REST在Web规模上运行.

妈妈没有规模经济.对于数据检索请求,每次请求特定数据时,必须将另一个消息发送到服务器并由服务器响应.在基于REST的系统中,可以通过HTTP缓存为相同数据的请求提供服务.这意味着随着请求量的增加,基于MOM的系统将看到服务器负载以与请求相同的速率增加.基于REST的系统将看到服务器负载增长的速度低于请求.

妈妈会用保证交付的火灾和遗忘信息诱惑你,只会咬你的监管链问题.

MOM对于同步请求 - 回复很糟糕,因为当服务器关闭时它会慢慢失败(即等待超时).当请求失败时,您希望它快速失败.如果服务器关闭,对基于REST的服务的HTTP请求将立即失败(在TCP连接上).

MOM对于异步请求 - 回复消息传递非常有用,但是您将面临在请求和回复之间存储状态的问题(提示:您的选项是文件或常规数据库,消息NoSQL)数据库).通常额外的实施工作不值得异步性的感知优势.如果您确实需要,基于REST的服务也会支持异步请求.在这种情况下,202接受是你的朋友.

最后,使用缓存允许基于REST的系统实现基于拉的集成,这种集成更容易支持.例如,假设我们想要将数据从系统A移动到系统B.MOM方法是将消息从A发送到B.基于REST的方法是在A中创建数据馈送服务(如RSS提要) B轮询新数据(与RSS阅读器轮询新文章的方式相同).当B失败时,在MOM示例中,支持团队将需要监视消息队列以确保它们不会溢出,而其他人则将B备份.在REST示例中,支持团队只需要担心让B备份.A失败时没有太大区别.在MOM示例中,B不知道也不关心.在REST示例中,B确实知道A已经关闭,但它仍然不关心,因为A显然没有来自A的新数据.最初,基于拉取的集成的轮询要求接缝非常低效,但是HTTP缓存使得这不是问题.

换句话说,不是投资JMS服务器,而是投资一个好的缓存HTTP负载均衡器.

  • "总是使用REST"是一个可怕的答案.当然有许多有效的案例,其中REST是更合适的选择,但也有许多其他的MOM是更好的选择. (21认同)
  • @tonga:当你的消息传递基础设施不可用时会发生什么?对于可缓存的响应,发送方和接收方之间的HTTP缓存可以在接收方不可用时进行响应.否则,[断路器模式](http://springinpractice.com/2010/07/06/annotation-based-circuit-breakers-with-spring)是一种可行的(也是可取的)替代方案,特别是考虑到链条 - 异步消息传递出现的监管问题(从字面上看,上周我不得不帮助管理另一个生产事件,因为接收方无法处理异步消息). (3认同)
  • @TomHoward +1强烈的意见,这真的很有意义. (3认同)
  • 我真的很喜欢这个答案.+1 :) (2认同)
  • 好吧,“始终使用REST”有点过于笼统。一如既往,这取决于。我在股票交易世界中工作,MOM的经典用例是一个价格(例如MSFT)需要尽快到达交易大厅的500个终端和系统。你是怎样做的 ?UDP多播,更好的MOM支持。REST API意味着每10毫秒一次500个终端请求当前价格?我认为,对于所有真正的“推动计算” MOM主题,都是一个好的架构。您永远不需要队列。 (2认同)
  • @TomHoward,是的,只是从2011年开始采用随机低延迟基准测试来显示我们的位置:每秒250万条消息,平均延迟为13微秒(http://ateam.purrdigital.com/dell-touts-性能-tibco-ftl-stack /)-我没有做这个,所以我不能保证它的有效性。 (2认同)

Nix*_*Nix 20

你无法比较这两种技术.

REST是一种服务/模式,为您提供访问无状态资源的有组织方式.

MOM Systems/JMS是一种在系统之间共享消息的模式.它关于数据,数据以可靠的方式输出.


您无法将JMS与REST进行比较,因为它们可以解决不同的问题.


但是,如果你的问题更多,那么我需要一个用于JMS队列的REST接口吗?在所有情况下,我看到人们使用REST来保护瘦客户端免受逻辑错误的影响,以便在JMS中对消息进行排队.例如,如果你有一个想要与JMS交谈的Android客户端,那么将其推送到"休息"界面然后转换并推送到JMS就更加难以做到这一点.

  • "MOM Sysems/JMS是一种在系统之间共享消息的模式." 我说REST真的很擅长.IMO您可以非常轻松地将JMS与REST进行比较,因为它们都希望解决应用程序集成问题.你有一个*任何*的例子,用JMS比用RESTful方法更好地解决了吗? (3认同)
  • @Tom Howard你有一个传感器池,可以将消息推送到JMS,以及一个处理这些消息的消费者池.您希望每条消息只处理一次.您无法拆分消息流,因此每个切片都会收到大约相同数量的消息,无法确定哪条消息需要花费多少时间进行处理.您绝对可以单独使用REST端点来解决这个问题,但使用JMS会更容易. (2认同)