我正在构建一个微服务应用程序,客户端通过REST向后端服务器发送请求,后端将使用gRPC与其他服务通信。我知道,这是同步的,是一个反模式的微服务应用程序,因为紧密耦合的属性。
我的问题是,如果我要为服务之间的通信方法替换一个消息队列(这意味着它是异步的),我如何通过REST将响应发送回正在同步等待一个消息队列的客户端?即使后端与内部服务异步通信,也必须在请求尚未被其他服务处理之前将响应返回给客户端。所以问题是:
发布于 2022-01-05 10:00:38
将gRPC通信称为“反模式”是一件很难的事情。同步通信具有简单性的巨大优点,而异步通信则更灵活。你真的需要那种灵活性吗?
基于
异步通信意味着根据事件进行思考,而不是根据请求或通道进行思考。将请求响应通信模型转换为基于事件的模型如下所示:
不同的事件可以共享一个相关ID来表示它们之间的关联。
我是泛指请求和响应事件。在实践中,事件在软件域中应该有意义,例如ChatMessageSent、ChatMessageDelivered和ChatMessageRead事件。
用于异步操作的
如果您有一个HTTP/REST,它是异步微服务的网关,那么处理底层异步操作的方法是不同的。
HTTP响应可以提供一种监视结果的方法。例如,它可以链接到表示操作状态的URL。HTTP服务器可以维护所有请求及其状态的数据库。当HTTP服务器在消息总线上观察到响应事件时,可以在数据库中更新状态。
在聊天应用程序中,HTTP通信可以如下所示:
当然,对资源的状态进行客户端投票并不一定是一个好的设计。但是轮询是内置到HTTP的唯一方法(不,HTTP/2服务器推送不能解决这个问题)。如果想要实时更新,就必须有一些可以推送更新的通信渠道。在web上下文中,Websockets扮演此角色。服务器可以通过websockets发送通知,说明存在资源更新,以便客户端知道再次请求该资源。
这一切都很复杂。如果您没有处理固有的异步问题,那么坚持同步通信就会简单得多。在这种情况下,同步通信意味着每个请求都将在合理的超时内收到响应。如果您只与托管在同一个数据中心的内部服务交互,这可能是非常实用的。
https://softwareengineering.stackexchange.com/questions/435753
复制相似问题