定位
服务端插件是一个逻辑扩展平台,提供了一个快速托管逻辑的能力。
核心特点
-
高性能:相对于RPC调用,没有网络的损耗,性能足够强劲。
-
高可靠:基于线程隔离,保证互不影响,插件的资源占用或崩溃等问题不直接影响业务。
-
部署快:不需要发布审核流程, 插件本身逻辑简短,编译速度快,基于版本管理可以快速回退。
-
易用:可以根据业务需求支持不同语言的插件
相比传统的将服务和逻辑写在一起:减少了服务发布和变更;支持更多的语言实现不同的逻辑;支持热插拔;
相比faas函数计算服务:减少了网络传输的损耗,性能更高。
相比于传统SDK插件模式优点在于:
-
语言无关,核心业务逻辑只需要实现一遍;
-
业务接入成本低,通常不需要关心升级,某些场景下甚至可以不需要 IPC 用的轻量级 SDK;
-
可以按自己的节奏推进版本升级,不必慢慢等待业务自己将其升级到最新版本;
-
发现线上有版本存在问题,可以直接切换至确认没问题的新/旧版本,而不必拉群通知业务升/降级。
适用场景
-
存在一种需要经常变更的公共逻辑
-
此逻辑对网络延迟敏感
-
此逻辑变更时希望业务方无感
比如在电商行业中,商品的优惠计算逻辑。不同的商品需要配置不同的优惠计算逻辑,此优惠逻辑经常随着时间发生变更;优惠计算请求频繁对延迟敏感;在变更优惠计算逻辑的同时不希望影响其它服务(商品、支付、购物车)。
综上可以看到插件模式由于实现成本不低,适用业务范围较窄,在使用的时候应谨慎评估ROI。
实现
插件类型
Go 原生插件
基于 Go 原生的 plugin 机制(https://golang.org/pkg/plugin/),拥有与本地函数调用同样的性能,但是本身限制较多,比如插件与宿主服务必须使用完全相同的依赖库版本,编译镜像需要一致等等,对于其中的大