-
Notifications
You must be signed in to change notification settings - Fork 173
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
New feature: load multi wasm instance #176
Comments
有个疑问,对于如下配置文件,其中前两个wasm文件返回相同ID,被划分为一组。 此ID对应的组中共有3个wasm实例,其中1个实例属于第一个wasm文件,2个实例属于第二个wasm文件,在进行wasm路由的时候是平等对待吗? 或者说我的疑问是同一个ID对应多个wasm文件,如果不同wasm文件实现的功能不同,该如何进行路由
|
@zu1k 这个问题非常好,涉及到实际生产使用,首先来明确一下场景:
layotto + wasm在FaaS方向上的探索会是一个长时间的投入,因此我建议我们可以先从简单的功能开始,然后再逐步迭代达到生产可用状态,这一版的功能可以先不考虑你说的这种复杂的场景,我们假设同一组中的wasm文件都是相同的(当然,这种场景我们以后势必要解决)。 |
看起来layotto需要使用mosn提供的 api.RegisterStream(LayottoWasm, createProxyWasmFilterFactory) 而 func createProxyWasmFilterFactory(conf map[string]interface{}) (api.StreamFilterChainFactory, error) {}
// StreamFilterFactoryCreator creates a StreamFilterChainFactory according to config
type StreamFilterFactoryCreator func(config map[string]interface{}) (StreamFilterChainFactory, error) 而对于我们的配置,我们需要类型为 "stream_filters": [
{
"type": "Layotto",
"config": [
{},
{},
]
}
] 就目前而言应该有几个解决方案:
"stream_filters": [
{
"type": "Layotto",
"config": [
"config_id_1": {},
"config_id_2": {},
]
}
] |
@zu1k 我刚才看了下代码,确实不能直接把config改成数组形式,这里可以按照你提出的第三种方案来做。 |
读了一下代码,发现目前对于wasm多instance的调度是交由mosn来管理的,LB策略是轮询。 func (w *wasmPluginImpl) GetInstance() types.WasmInstance {
w.lock.RLock()
defer w.lock.RUnlock()
for i := 0; i < len(w.instances); i++ {
idx := int(atomic.LoadInt32(&w.instancesIndex)) % len(w.instances)
atomic.AddInt32(&w.instancesIndex, 1)
instance := w.instances[idx]
if !instance.Acquire() {
continue
}
atomic.AddInt32(&w.occupy, 1)
return instance
}
log.DefaultLogger.Errorf("[wasm][plugin] GetInstance fail to get available instance, instance num: %v", len(w.instances))
return nil
} 目前layotto能做的应该是多个wasm文件对应相同ID的情况,在同ID对应的Group中对选择的wasm文件进行调度。 至于同一个wasm文件对应的多个instances还是交给mosn来做吧 |
Any ideas about exporting |
关于ID这个问题,我看了你的pr,是导出了一个变量,我本来想的是导出一个函数,其实跟变量类似,就是在函数上面增加 |
现在导出的这个变量用不了,实际编译的时候并没有导出貌似。 我也想直接导出函数,一开始尝试的是导出函数,遇到了困难。 因为wasi接口的数据类型不支持string,看样子只能导出int32类型的指针,并且golang的string是封装过的,一般需要通过 并且如果返回 |
不好意思,这块是我的问题,之前忽略了不支持 源码路径
在layotto侧可以通过如下方式把指针转换成 源码路径:
|
wasm的ID方法返回只能一个参数,没办法同时传递字符串指针和长度两个变量,我不太理解你这里表达的意思 |
现有的代码中有这类方法,因为之前是单一wasm plugin,所以没有筛选条件。 现在一个filter包含多个wasm plugin,看样子是导出给wasm调用的方法,如何判断caller是哪个wasm? 还有一个疑问,RootContextID和ContextID是什么含义,我没找到相关注释说明 |
之前写的代码有段时间没动了,有点生疏,下午又重新看了下,简单讨论下: 一、ID传递问题 这块确实比预期要繁琐一点,大致流程可能要改成如下逻辑:
二、vmConfig跟pluginConfig 我看你说的Filter里面的这两个函数应该是没有用到,真正用到的是在 三、RootContextID vs ContextID ContextID是请求粒度的,每次layotto回调wasm的接口时都需要传入对应的ContextID,这样才能关联到正确的上下文中,在我们自己开发的 RootContextID暂时应该没有用到,是固定值,不过如果是多个不同wasm的话应该是对应不同的RootContextID,我看倒是没有影响。 |
@zhenjunMa |
@zu1k 这里主要对整体逻辑进行说明,更多的评论我会留在你的PR里面 🍺。
列几个当前实现存在问题的地方:
说一个比较绕的地方,也正是你疑惑的
这个任务需要理清楚factory、filter、wasm三者的职责,等你完成这个任务以后就可以完全cover整块wasm逻辑了。ヾ(◍°∇°◍)ノ゙ |
1. What would you like to be added
Now Layotto only supports loading a single *.wasm file. We need to make it support adding multiple different *.wasm files at the same time. This feature should also consider when Layotto receives the request, which wasm instance should be forwarded to.
2. Why is this needed
This is a problem that Layotto must solve as a solution to FaaS. The expected FaaS deployment model in the future is shown in the following figure:
3. Design draft
A. wasm config
Need to support the configuration to load multiple wasm files.
config path:
config/wasm/config.json
The
config
field in the above configuration needs to be adjusted to an array form, as follows:B、wasm code template
In order for Layotto to better track all wasm instances loaded by itself, we need to formulate some specifications for these wasm instances. The first step is to make these wasm instances expose a function named
ID
, as follows:This function will be called after the instance loaded by Layotto and used for subsequent routing.
C、wasm route
In a multi-wasm instance scenario, Layotto may load multiple wasm instances. These instances may or may not be a group. Therefore, Layotto needs to store a map-type data structure internally for routing. The details are as follows:
After Layotto receives the request, taking Http as an example, it needs to take out the target instance ID from the header, and then select a wasm instance for processing through the LB strategy. The LB strategy can first support only random algorithms.
D、demo
After the this feature are implemented, the current example needs to be modified to demonstrate the above functions. In the example, at least three wasm instances need to be started and divided into two groups. We can initiate the call with the following command:
The results returned by multiple calls are expected to be as follows:
E、wasm hot reloading
Thanks to @zu1k for adding the feature of hot-loading wasm instances to Layotto this week. For details, see #165. Therefore, how to hot-load multiple wasm instances should be considered in this feature.
Note: If you think the hot reloading is too complicated, you can split this feature into multiple wasm instances to support and support hot-loading for pr submissions.
中文
一、需要实现什么功能
现在Layotto只支持加载单个
*.wasm
文件,我们需要让它能支持同时加个多个不同的*.wasm
文件,该功能还会涉及到当Layotto收到请求以后,该转发给哪个wasm实例。二、做这个功能的价值
这是Layotto作为FaaS的一种解决方案所必须解决的问题,未来我们预期的FaaS部署模式如下图所示:
Layotto会按需加载多个wasm实例,对于这些wasm实例而言,它们可以属于同一个组,也可以是完全不相关的,类似于当前微服务架构下服务跟IP的关系。
三、方案概述
A、wasm配置
需要支持配置加载多个wasm文件。
配置文件所在路径:
config/wasm/config.json
上述配置中的
config
字段需要调整为数组形式,如下:B、wasm模板
为了让Layotto更好的跟踪自己加载的所有wasm实例,我们需要为这些wasm实例制定一些的规范,第一步可以让这些wasm实例必须对外暴露一个名为
ID
的函数,如下:该函数会在Layotto加载完以后进行调用并用于后续的路由。
C、wasm路由
在多wasm实例场景中,Layotto可能会加载多个wasm实例,这些实例可能是一组,也可能不是,因此Layotto在内部需要保存一个map类型的数据结构用于路由,内如大致如下:
Layotto收到请求以后,以Http为例,需要从header中取出目标实例ID,然后通过LB策略选择一个wasm instance进行处理,LB策略可以先只支持随机算法。
D、示例演示
上述功能实现以后,需要修改现在的示例来演示上述功能,在示例中,至少需要启动三个wasm实例,并分为两组,我们可以用如下命令发起调用:
多次调用返回结果预期如下:
E、wasm热加载
感谢 @zu1k 本周为Layotto增加了热加载wasm实例的feature,具体详情见:#165 因此在该需求中需要考虑如何热加载多个wasm实例。
注:如果觉得这块过于复杂,可以拆分成多wasm实例支持跟支持热加载两个pr提交。
The text was updated successfully, but these errors were encountered: