[DISCUSSION] Control plane extension mechanism|OpenSergo 控制面扩展机制讨论 #46
Labels
area/extension
Category issues or PRs related to extensions
kind/discussion
For further discussion
kind/feature
Category issues or PRs related to feature request.
背景
opensergo-control-plane作为控制面有很多场景有扩展的需求,比如某些自定义CRD的解析、转换或是应用等。而Go语言本身对扩展机制没有很好的支持,因此我对目前的一些方案设计和实践做了简单整理。
Go插件机制实现方案概述
Go plugin 包
基于Go plugin包实现扩展机制的方案,通过编译
.so
文件的方式构建插件,主程序借助plugin加载并使用插件,底层基于cgo 机制调用 unix 的标准接口实现。无额外的性能开销,但对插件存在严格的的约束检查。实践案例:mosn/mosn
基于通讯的多进程方案
插件以独立进程的方式运行,主程序通过通讯的方式调用插件。目前该方案较多的实践是基于 hashicorp/go-plugin 框架包装,以RPC的方式通讯。可能存在一定通讯开销,插件的管理以及进程的管理会引入一定的复杂度。
实践案例:hashicorp/terraform、grafana/grafana中的backendplugin、mosn/mosn等
动态解释执行方案
插件由Go、Lua、JS等语言编写,主程序解释执行。该方案有较多不同语言的支持框架,例如:traefik/yaegi、d5/tengo、yuin/gopher-lua、robertkrimen/otto。其中traefik/yaegi是一个Go解释器,完整支持Go规范。
实践案例:traefik/traefik
WebAssembly方案
插件被编译为WebAssembly,借助WasmEdge/WasmEdge这一WebAssembly运行时,在Go主程序中运行WebAssembly。
关于控制面的插件机制
从控制面的需求出发,对于不同复杂度的插件,可能会适合不同的插件机制
对于复杂度较低的插件,例如计算类插件,这类插件往往只需要主程序单向调用插件即可。并且插件粒度较小、功能上以逻辑计算为主例如某个策略的算法实现。这类的插件的扩展机制我个人倾向于动态解释执行方案或是WebAssembly方案这类复杂度相对较低的方案。Go plugin 包方案由于严格的的约束检查在开源社区中推行存在一定的阻碍,除非某些插件具备较高的性能需求。
对于复杂度较高的插件,例如对于一些用户的内部自研系统,如果想要依靠一个插件将其纳入到OpenSergo的统一管辖中,借由OpenSergo的数据链路实现能力。那么这类插件不仅需要主程序到插件的调用,也需要插件到主程序的调用链路。插件的复杂度较高,粒度也较大。这类的插件我个人倾向于基于通讯的多进程方案,能够满足上述的需求,但是需要做好插件、进程的管理。这部分会需要进一步的详细设计。
欢迎参与讨论
针对以上提到的这些方案,都各有优劣势和使用场景(后续我也会补充更详细的整理文档),opensergo-control-plane可能会需要根据不同的场景采用不同的扩展机制,欢迎大家参与讨论,如果有其他的Go语言扩展机制实现方案也希望大家能补充在本Issues下。
The text was updated successfully, but these errors were encountered: