微服务:REST 与消息传递

Posted

技术标签:

【中文标题】微服务:REST 与消息传递【英文标题】:Microservices: REST vs Messaging 【发布时间】:2017-04-21 23:21:27 【问题描述】:

我听说亚马逊将 HTTP 用于其基于微服务的架构。另一种方法是使用像 RabbitMQ 或 Solace 系统这样的消息传递系统。我个人有使用基于 Solace 的微服务架构的经验,但从来没有使用过 REST。 知道亚马逊、Netflix、UK Gov 等各种大联盟实施使用什么吗? 另一个方面是,在微服务中,需要以下内容(除其他外): * 模式匹配 * 异步消息传递.. 接收系统可能已关闭 * 发布订阅 * 缓存加载事件.. 即在启动时,服务可能需要从其他几个服务加载所有数据,并且应该在数据完全加载时得到通知,以便它可以“知道”它现在已准备好服务要求 这些方面自然是通过消息传递而不是 REST 完成的。为什么任何人都应该使用 REST(公共 API 除外)。谢谢。

【问题讨论】:

HTTP,REST 是规范。 RabbitMQ/Solace 是消息代理。您的问题是“基于 HTTP/REST 的服务的应用有哪些”? hmm 可能是应该使用 REST 和应该使用消息传递的用例,或者两者兼而有之。为什么是这样而不是那样 【参考方案1】:

我过去遵循的标准是在关键要求是速度(并且数据丢失不是关键)时使用 Web 服务,在关键要求是可靠性时使用消息传递。就像你说的,如果接收系统宕机,一条消息将放在队列中,直到系统恢复处理它。如果它是一个 REST 端点并且它已关闭,那么请求就会失败。

【讨论】:

+1,您可能需要考虑同步通信 (REST) 的耦合影响,如果一个失败,它的所有依赖项都会失败,因此除了丢失数据之外,它还可能导致连锁反应可能会导致整个系统崩溃。 @SeanFarmar 这就是我所说的多米诺骨牌效应。一个相关的问题是涟漪效应,其中一项服务的更改可能需要下游服务的更改。 有时您可能想要这种行为。例如,如果您期望快速同步响应并且您遇到超时或其他一些服务器错误,您可以相应地处理它。有些进程不能容忍等待。我敢肯定还有其他类似的用例。 REST 并不比流行的消息传递协议 MQTT 快。 “根据分析和测试报告,MQTT 数据传输可以以比 REST 调用快 20 到 25 倍的速度传输数据。...... MQTT Broker 可以在商品服务器上每秒处理多达 40,000 条消息。” -- bevywise.com/blog/mqtt-vs-rest-iot-implementation 通常,消息传递应用程序更容易集成,因为您可以将应用程序逻辑与消息传递端点解耦,这使得应用程序更易于维护和更可重用。但是,开发消息传递端点可能是血和泪。如果您只想构建一个单一用途的应用程序,那么最好使用 REST。【参考方案2】:

REST API 假定仅使用 HTTP。这是相当石器时代的技术,不接受异步。消息传递。要在那里插入消息传递,我会考虑 WebSockets Gateways - 对不起,最终的虚假陈述

【讨论】:

那么为什么会有很多缺点呢?实际上,REST 基于 HTTP 方法!是的,REST 是同步的! 这显然是错误的: HTTP 是一种合同,一种通信协议。 REST 是一个概念,一种架构风格,可以使用 HTTP、FTP 或其他通信协议。 HTTP 是 REST 最常用的通信协议之一,我猜这就是你误解的根源。

以上是关于微服务:REST 与消息传递的主要内容,如果未能解决你的问题,请参考以下文章

Kafka 消息 VS REST 调用

用于微服务通信的 HTTP 与消息传递

使用消息传递的微服务和 SOA

Firebase 云消息传递 REST API Spring

微服务架构 - 在订单无关紧要时通过服务传递消息

如何将 Azure 通知 REST API 与 Google 云消息传递一起使用