Sidecar模式:将应用程序的组件部署到单独的进程或容器中,以提供隔离和封装。此模式还允许应用程序由异构组件和技术实现。
为什么称为Sidecar模式,是因为它类似于连接在摩托车旁的边车。在该模式中,sidecar服务被附加到主应用程序中,并为应用程序提供其所支持的特性。sidecar也与主应用程序有相同的生命周期,与主应用程序一起创建和退出。sidecar模式有时被称为sidekick模式,它是一种分解模式。
背景和问题
应用程序和服务通常需要一些相关的基础功能,如监控、日志、配置和网络服务。这些外围功能可以作为独立的组件或服务实现。
如果将它们直接集成到应用程序中,则它们可以与应用程序在相同的进程中运行,从而有效地利用共享资源。然而,这也意味着它们之间没有很好地隔离,其中一个组件的中断可能会影响其他组件或整个应用程序。此外,它们通常需要使用与主应用程序相同的语言来实现。因此,组件和应用程序之间具有强相互依赖关系。
如果将应用程序分解为不同服务,则可以使用不同的语言和技术实现每个服务。虽然这提供了更多的灵活性,但这意味着每个组件都有自己的依赖项,并且需要特定于语言的库来访问底层平台与主应用程序共享的任何资源。此外,将这些特性部署为独立的服务可能会增加应用程序的延迟。管理这些特定于语言的接口的代码和依赖关系也会增加相当大的复杂性,特别是对于服务托管、部署和管理。
解决方案
将这些基础服务和应用程序绑定在一起,但使用独立的进程或容器部署,这能为跨语言的平台服务提供同构接口。
sidecar服务不一定是应用程序的一部分,但它会连接到应用程序。应用程序部署到哪里,它就部署到哪里。Sidecars是支持与主应用程序一起部署的流程或服务。在摩托车上,边车与一辆摩托车相连,每辆摩托车都可以有自己的边车。以同样的方式,sidecar服务和其主应用程序具有相同的生命周期。对于应用程序的每个实例,sidecar的一个实例被部署和托管在它旁边。
sidecar模式的优点:
- 在运行时环境和编程语言方面独立于它的主应用程序,因此您不需要为每种语言开发一个sidecar。
- sidecar可以访问与主应用程序相同的资源。例如,可以监控自己和主应用程序所使用的系统资源。
- 因为它靠近主应用程序,所以在它们之间通信时没有明显的延迟。
- 即使对于不提供可扩展性机制的应用程序,也可以使用sidecar来扩展功能,方法是将sidecar作为自己的进程附加到主应用程序所在的主机或子容器中。
sidecar模式经常与容器一起使用,并被称为sidecar容器或sidekick容器。
问题及思考
- 考虑到你部署和打包应用的方式。容器部署是最适合sidecar模式的。
- 在设计sidecar服务时,请仔细决定进程间通信机制。除非对性能特殊要求,否则尽量使用与语言或框架无关的技术。
- 在将功能放入sidecar之前,请考虑它作为单独的服务是否是更好的工作方式或使用传统的守护进程方式。
- 还要考虑功能是否可以作为库实现还是使用传统的扩展机制实现。特定于语言的库可能具有更深层次的集成和更少的网络开销。
什么时候使用sidecar模式
- 主应用程序使用一组异构的语言和框架开发。位于sidecar服务中的组件可以使用不同框架和不同语言编写。
- 组件由远程团队或不同的组织开发。
- 组件或特性必须与应用程序位于同一主机上。
- 需要一个服务,它共享主应用程序的整个生命周期,但可以独立地进行更新。
- 需要对特定资源或组件的资源限制进行细粒度控制。例如,您可能希望限制特定组件使用的内存量。您可以将组件部署为sidecar,并独立于主应用程序管理内存使用。
不适合使用sidecar情况:
- 当需要优化进程间通信时。主应用程序和sidecar服务之间的通信包括一些开销,特别是调用延迟。对于会话接口来说,这可能不是一个可接受的折衷办法。
- 对于小型应用程序来说,为每个实例部署sidecar服务的资源成本超过使用隔离优势。
- 当服务需要不同于主应用程序或独立于主应用程序进行伸缩时。如果是这样,最好将该特性部署为单独的服务。
案例
sidecar模式适用于许多场景。一些常见的例子:
- 基础设施的API。基础架构开发团队创建一个部署在每个应用程序旁边的服务,而不是基于特定语言的客户端库来访问基础服务。该服务作为sidecar加载,并为基础设施服务提供公共功能,包括日志、环境数据、配置存储、服务发现、健康检查和监控服务。sidecar还监视主应用程序的宿主环境和进程(或容器),并将信息记录到一个集中的服务。
- 管理HAProxy或NGINX。使用sidecar服务部署NGINX,该服务监控环境状态,然后更新NGINX配置文件,并在需要改变状态时回收进程。
- 代理sidecar:以sidecar方式部署代理服务。应用程序通过代理处理请求日志、路由、断路和其他与连接相关的特性。
sidecar模式随着容器的应用越来越广泛,很多流行框架都基于该模式来实现例如dapr,以及其他基于kubernetes构建的应用。