1.6.3 服务模块和事件模块

在Knative的设计中,服务模块和事件模块是独立的,也就是说,不需要服务模块即可使用事件模块,同理不需要事件模块即可使用服务模块。但两者结合起来的效果更好。例如,如果事件流的处理流程很长,那么实例处理完成后就及时缩容到零可以很好地降低成本;如果实例存在性能瓶颈,则可以通过扩容实例来解决。借助服务模块,事件模块可以更好地发挥优势。

另一方面,服务模块重点关注的是请求/回复模型,这是一种简单、健壮、有时会同步阻塞的架构。对于服务模块而言,当一个应用对应的实例阻塞时,会将流量引导到另外一个已经存在的实例中,而不是重新创建新的实例。虽然也有等待时间的阻塞,但是比在HTTP上的阻塞时间要短。基于此,我们可以很容易地拆分微服务。

事件模块在设计上缓解了一些同步请求的压力。可以利用事件模块分担很多不需要阻塞的工作,这些工作一般都是对某件事做出的反应,而不是顺序执行的指令。Knative推荐每个应用都尽量轻量化,这样可以使服务模块更好地发挥自动扩/缩容的优势。比如,一个系统中有300个占用100GB内存的应用,但只有2个应用可能有一些流量突发情况,这种情况下资源有很大的浪费。基于事件模块的一个应用示例如图1.11所示。

img

图1.11 在应用架构中,服务模块提供服务,事件模块负责将各个服务联系起来