首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >异步地服务基于REST的请求的常见实践是什么?

异步地服务基于REST的请求的常见实践是什么?
EN

Software Engineering用户
提问于 2022-01-05 05:25:01
回答 1查看 330关注 0票数 1

我正在构建一个微服务应用程序,客户端通过REST向后端服务器发送请求,后端将使用gRPC与其他服务通信。我知道,这是同步的,是一个反模式的微服务应用程序,因为紧密耦合的属性。

我的问题是,如果我要为服务之间的通信方法替换一个消息队列(这意味着它是异步的),我如何通过REST将响应发送回正在同步等待一个消息队列的客户端?即使后端与内部服务异步通信,也必须在请求尚未被其他服务处理之前将响应返回给客户端。所以问题是:

  1. 当请求尚未完全处理时,返回给客户端的是什么?由于尚未处理,我们如何知道是返回HTTP状态还是返回HTTP状态内部服务器错误。
  2. 由于从技术上讲,客户端的请求已经被“处理”(在第1点中有一条确认消息),客户机和后端服务器之间的通信已经关闭。那么,当客户机完成处理之后,客户机将如何从服务器接收真正的响应/结果呢?这里的普遍做法是什么?
EN

回答 1

Software Engineering用户

回答已采纳

发布于 2022-01-05 10:00:38

将gRPC通信称为“反模式”是一件很难的事情。同步通信具有简单性的巨大优点,而异步通信则更灵活。你真的需要那种灵活性吗?

基于

事件的异步操作模型

异步通信意味着根据事件进行思考,而不是根据请求或通道进行思考。将请求响应通信模型转换为基于事件的模型如下所示:

  • 进程A发布请求事件
  • 进程B侦听请求事件,并最终发布响应事件。
  • 进程A侦听响应事件。如果创建了匹配的响应事件,它最终将被创建原始请求事件的进程A接收。

不同的事件可以共享一个相关ID来表示它们之间的关联。

我是泛指请求和响应事件。在实践中,事件在软件域中应该有意义,例如ChatMessageSent、ChatMessageDelivered和ChatMessageRead事件。

用于异步操作的

如果您有一个HTTP/REST,它是异步微服务的网关,那么处理底层异步操作的方法是不同的。

  • 服务器可以等待,希望在某个超时时间内收到响应事件。这可能是一个好主意,如果你非常肯定,最后期限将几乎总是满足。但是通常情况下,等待是有问题的:客户机只是看到延迟,并且不知道他们的HTTP请求是否被正确地接收了。
  • 服务器可以立即响应指示收到了请求,但没有直接传递结果。结果可以稍后检索。具体来说,下面的HTTP状态代码可能是有用的:
    • 202接受专门用于异步操作。这意味着请求已经收到,但并不表示请求会成功。响应的主体可以通知客户如何监视状态。
    • 或者,响应可以使用303状态并重定向到表示操作的新创建的资源。如果可以直接创建这样的资源,这将是我首选的方法。

HTTP响应可以提供一种监视结果的方法。例如,它可以链接到表示操作状态的URL。HTTP服务器可以维护所有请求及其状态的数据库。当HTTP服务器在消息总线上观察到响应事件时,可以在数据库中更新状态。

在聊天应用程序中,HTTP通信可以如下所示:

  1. 客户端发送一个新的聊天消息。服务器对表示消息> POST /messages >> {"body":"Lorem“的URL进行重定向响应。}}<303个参见其他< Location: /messages/ff591577-668c-4ffc-88d6-fe160068f93f。
  2. 客户端请求消息状态。>获取/messages/ff591577-668c-4ffc-88d6-fe160068f93f < 200 OK << {"body":"Lorem“<,”发送“:1641405030 <,”接收“:空<,”读“:空}
  3. 时间流逝。客户端再次请求消息状态。>获取/messages/ff591577-668c-4ffc-88d6-fe160068f93f < 200 OK << {"body":"Lorem“<,”发送“:1641405030 <,”接收“:1641405032 <,”读“:1641405079}

当然,对资源的状态进行客户端投票并不一定是一个好的设计。但是轮询是内置到HTTP的唯一方法(不,HTTP/2服务器推送不能解决这个问题)。如果想要实时更新,就必须有一些可以推送更新的通信渠道。在web上下文中,Websockets扮演此角色。服务器可以通过websockets发送通知,说明存在资源更新,以便客户端知道再次请求该资源。

同步通信可能足够好

这一切都很复杂。如果您没有处理固有的异步问题,那么坚持同步通信就会简单得多。在这种情况下,同步通信意味着每个请求都将在合理的超时内收到响应。如果您只与托管在同一个数据中心的内部服务交互,这可能是非常实用的。

票数 4
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/435753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文