Kuiper 允许用户自定义扩展,以支持更多的功能。用户可编写插件进行扩展;也可以通过配置的方式,扩展 SQL 中的函数,用于调用外部已有的 REST 或 RPC 服务。
使用插件扩展较为复杂,需要用户编写代码并自行编译,具有一定的开发成本。其使用的场景包括:
使用外部函数扩展,仅需要进行配置,但其需要通过网络进行调用,有一定性能损耗。使用的场景包括:
Kuiper 允许用户自定义不同类型的扩展。
请阅读以下内容,了解如何实现不同的扩展。
建议插件名使用 camel case 形式。插件命名有一些限制:
Kuiper 扩展通过 context 参数暴露了一个基于键值对的状态存储接口,可用于所有类型的扩展,包括 Source,Sink 和 Function 扩展.
状态为键值对,其中键为 string 类型而值为任意数据。键的作用域仅为当前扩展的实例。
用户可通过 context 对象访问状态存储。状态相关方法包括 putState, getState, incrCounter, getCounter and deleteState。
以下代码为函数扩展访问状态的实例。该函数将计算传入的单词数,并将累积数目保存在状态中。
func (f *accumulateWordCountFunc) Exec(args []interface{}, ctx api.FunctionContext) (interface{}, bool) {
logger := ctx.GetLogger()
err := ctx.IncrCounter("allwordcount", len(strings.Split(args[0], args[1])))
if err != nil {
return err, false
}
if c, err := ctx.GetCounter("allwordcount"); err != nil {
return err, false
} else {
return c, true
}
}
有些插件可能需要访问文件系统中的依赖文件。依赖文件建放置于 {{kuiperPath}}/etc/{{pluginType}}/{{pluginName}} 目录。打包插件时,依赖文件应放置于 etc 目录。安装后,这些文件会自动移动到推荐的位置。
在插件源代码中,开发者可通过 context 获取 Kuiper 根目录,以访问文件系统中的依赖:
ctx.GetRootPath()
提供一种配置的方式,使得 Kuiper 可以使用 SQL 以函数的方式直接调用外部服务,包括各种 rpc 服务, http 服务等。该方式将可大提高 Kuiper 扩展的易用性。外部函数将作为插件系统的补充,仅在性能要求较高的情况下才建议使用插件。
以 getFeature 函数为例,假设有 AI 服务基于 grpc 提供getFeature 服务。则可在Kuiper配置之后,使用 SELECT getFeature(self) from demo
的方式,无需定制插件而调用该 AI 服务。
详细配置方法,请参考外部函数。