让我们来聊一聊微服务的主要基本元素,即将有界上下文隔离到每个服务中。
让我们看看某公司的新订单,以及HTTP后端的工作方式。
首先需要下单,然后发送请求以获取订单状态。如果我们收到响应,就进入处理阶段,最后交付订单。
问题
由于HTTP请求是按照序列方法工作的,如果一个阶段没有响应,整个请求将被挂起,直到处理完成。如果收到100个请求而处理阶段离线,整个系统将崩溃或卡住,这就是级联故障。这就是为什么基于HTTP的微服务是个坏主意。
让我们看一个另外的例子,
使用HTTP作为后端时,第一个响应需要10ms才能响应,第二个需要100ms才能响应,第三个需要30ms,但是第二个需要100ms,所以第三个必须等待第二个完成。这就是使用HTTP作为微服务后端的问题。
让我们来看一下解决方案。
解决方案
我们可以使用单独的消息框架,如kafka
以第一个例子为例,当订单请求到达时,它将推送到kafka,然后所有其他部分(获取订单、处理和交付)都会监听kafka。如果kafka发送了请求,它们就开始处理并发送回响应,但是离线阶段是正常的,因为kafka已经通过不等待离线阶段获得了其他响应。
一旦处理阶段在线,它就会从Kafka接收消息并处理它,因此现在所有响应都已完成,订单就可以被处理了。
例如,在HTTP方式下,第一个需要10ms,第二个需要100ms,第三个需要30ms,但如果我们使用消息框架,它将按以下方式工作:第一个需要10ms,第二个需要30ms,第三个需要100ms……
评论(0)