大家下午好时间差不多了我们就直接开始今天的分享感谢大家来这是库普抗来和我有幸给大家来分享这一次关于Wassim的现状和以及将来的一些计划在Depo里面的一些内容好,首先做一个简单的自我介绍我叫戴翔,大家也可以叫我龙然后我是英特尔的工程师目前是Depo Salus和Glossianlint的Mutanda目前主要是活跃在Depo社区然后首先跟大家简单的介绍一下Depo就是Depo的英文的拼写它实际上是分布是应用运行时的缩写,也就是Distribute the application runtime然后它的目的就是说是为了帮助构建微服务然后从这边的图我们从上往下看上面是Application Code的Depo它的愿景就是说理由任何的这样一个编程语言都可以去编写属于自己的运行时也有Go也好,load.js也好,python也好Depo都提供了对应的SDK去帮助编写然后往下一点它主要是提供了两个API也就是我们熟知的HTTP和JRPC这两种方式然后再往下一点是它的具体的一些组织模块这个我们我再接下来会讲然后再往下就是说是所有的云场商比如说Ammo, AWS,然后谷歌云安理云然后还有原生的Kubernetes以及一些托管的托管的蓄理机也好物理机也好都是在Depo的运行中它就是说是希望这个微服务只要编写出来之后你用了Depo这样一个架构之后就是你可以在任何的一个平台去编写你没有了所谓的说是一些云平台的绑定就是你可以非常简单地从安理云切换到谷歌云或者说从谷歌云切换到安理云或者说你不想上云了你又想自建机房到自己的私有云这都是非常简单的事情就是Depo就帮你完成这些事情所以说它的终止是说是帮助你构建自己的微服务然后这个就是刚才中间这个的放大我们可以细看一下就是它的最核心的也就是它的第一个是这样一个服务之间的访问通过服务之间的访问可以达到一些服务发现的效果然后达到一些Banans的效果达到数据这个监测的效果然后还有一些状态的管理发布和订阅然后一些数据的广定然后Actors以及一些关于MEAL方面的管理和有一些配置稳线管理以及分布式锁还有今天大家最近比较热门的Workflow就是工作流还有一些别的方面的价减密方面的事情都是在Depo提供的丰富的API里面然后我们这边就有在Depo里面的数据就叫做Building Blocks然后刚才说了我们今天的主题是Wassim在Depo中的现状以及未来那么关于Wassim实际上Wassim作为一个逐渐热门的名词被大家广为认知我基本上也就简单的再说一下它实际上是WebAssembly的一个缩写它是一个可移植的这样一个可移植可编译的这样一个二进制的对象它主要是描述了一种字节格式一般来说它编译出来的文件我们都会以点Wassim作为结尾然后它是使用了堆栈的蓄力机去作为它的这样一个运行容器这样一个运行容器确保了Wassim在设从理论上来说就是足够安全的它是以一个沙盒的方式运行的同时它可以支持去部署在这样一个服务端也就是说Web流览器当中或者说是server端同时它实际上是现在的就是被Wassim认可的除了Http然后CSSGS之后的第四个Wassim的标准所以说它这个是被基本上所有的主流的流览器都是支持的当然除了在流览器中支持之外也有很多的语言支持比如像Go比如像Rust比如像C它都有自己的RustBundit然后接下来我们看一下就是dapr和Wassim都有哪一些共通点一些为什么我们会想到在dapr中使用Wassim那么我们先看一下左列刚才我列举的一些dapr的一些特点它是帮助购建V服务的那么Wassim实际上它也是希望能够使在网络里面的这样一个流览器当中的部署能够更简单一点那么实际上随着我们这样一个技术的眼镜我们发现越来越多的外部服务也就是所谓的网页服务也好它实际上都是有一个趋势什么样的趋势呢就是说是越来越像V服务架构去靠拢那么所以说在这一点上面dapr和Wassim在初中上面是有一些类似的共同点的然后第二点就是说dapr它是运行在能够运行在任何就是它支持的一些Hos的环境当中比如刚才说了像一些阿里云、亚马逊云、AWS以及原生的K8S还有一些蓄力机当中它都是可以运行的那么Wassim也是说是可以以一种杀河的形式在任何地方运行的它编译出来的文件就是它不需要通过交叉编译的方式它直接编译出来就是说是在多个平台就能够直接运行的所以说它也是一个Raw and anywhere的一个地方那么最后一点就是说Dapr和Wassim一样都是被多个语言支持的那么这三点构建下来了我们发现的就是Dapr和Wassim有很多的这样一个相似点比如说Raw and anywhereMinded and Guided Sports以及都是为了这样一个外部服务所以说我们想了如何在Dapr中使用Wassim接下来我们找到了一个就是比较好的一个切入点在Dapr中叫做Http Midwild然后固形思义就是一个叫基于Http的中间键那么这个中间键是做什么呢我们还是看这张图这张图上面从左往右是一个Request然后到一个Response的过程也就是说你一个Client的请求一直到返回那么在请求完了之后在Dapr的境面你可以走过Midwild1到Midwild2 到Midwild3那么这时候你通过不同的Midwild你可以针对RawRequest某一个信息进行处理比如说你针对Handle进行处理你针对Handle的Http进行验证或者说你把Handle里面的某些请求看一下是不是在你的白名单中或者说是怎么样都可以进行处理然后处理完之后把这个请求再交给你真实的这样一个后端的服务的MyApplication去进行处理处理完之后它会有一个ResponseResponse回来之后依旧是通过Dapr的Midwild然后Midwild对Response再进行处理查看一下Response中是不是有一些敏感的信息或者说敏感的信息是不是需要做一些消息的过滤或者说是增加一些相应的这样一个ResponseHandle它都是在Midwild里面进行处理的那么大家实际上就直接想到了通过这个Midwild我可以再不修改我自己MyApplication的代码逻辑的同时去通过往Dapr里面增加Midwild的方式去修改整样整个一个工作逻辑那么这听上去是非常的好的因为我不用改我的Application了我的Application也就是说我可以在保持Application不动的情况下面我做任何的修改都是不影响我的Application的那么这样子实际上来说的话一些运为的工作或者说一些监测的工作了我也可以放在Dapr的Midwild里面或者说我的一些尝试的试验性的工作我也可以放在Midwild里面因为这是不影响我本身Application的逻辑的但是这样一个HTTVMidwild它实际上有一个比较大的一个痛点首先第一个痛点就是说它是一个类制的代码什么叫类制的代码了就是说它是完全和Dapr的逻辑代码是完全的偶和的偶和是什么意思呢就是说如果说你想新写一个AGA中间键把它放到Dapr里面运行那么的话首先看我们右边这张图最上面就是在Dapr的Component Contrable这个Ripple里面你首先要贡献代码提个PR然后经过Review然后交换一下意见更新一下代码然后再莫尔治莫治完了之后这是第一步然后第二步在我们的DaprDapr Projekter里面Ripple里面也就是说所谓的我们的Dapr CallRipple里面还要再走一遍这样的流程到莫治完了莫治完了我们能用我们写的这样一个Midwild不好意思还是不行需要怎么样呢需要等它的Release等它的正式Release之后才能够我们才能够使用我们在一开始的Dapr Component Contrable这个Ripple下面提交的这样一个Midwild那么参与过这样一个开源工作进行过开源贡献的人应该很清楚这样一个流程是非常长的不停的Review一些更新然后还要等待Release目前Dapr的这样一个Release周期的是三个月也就是说你运气好的话真正好是在这样一个三个月的这样一个Release周期中完成了Dapr的编写Review莫治然后至少你也要至少要三个月你才能够在下一个版本中使用你编写好的Midwild那这个对于任何一家公司来说都是非常长的这样一个时间是不可接受的那么如果说你你不想说是公开到这个里面如果说你想自己那你也要自己维护一套你把这些代码仓库都Folk下来去进行一个管理那么又会带来一些升级上的问题刚才说了这样正是因为这样的一个问题就带来了第二个问题就是说这样一个灵活性变畅了因为它是类制的类制的话它所有的配置文件的配置的读曲实际上也是放在代码里面的你需要去进行一些代码的修改那代码的修改同样也要走刚才那个那套流程才行同时就是你需要更新才能够使用新的中间键如果你不更新的话你就没法用那么还有一个就是对于很多公司来说它的这样一个它想用的这样一个Midwild这样一个业务逻辑它实际上是比较隐私的就是说是和业务公司业务相关的它不想公开但是代码作为一个Open Source作为一个开源的项目你必须要公开它肯定你才能够去提交代码才能够去把它放在里面所以说这对于很多公司来说它是在隐私安全上面是没有保证的那么正因为如此我们想到了用Whatsim去帮助解决这样一个问题同样的就是我们很简单的就是把所有的类制在代码中的Midwild替换成了Whatsim模块或者说替换成了某几个Whatsim文件文件去进行一个操作然后我们看一下通过Whatsim我们可以怎么样子就是首先来说类制的代码块变成了Whatsim的BanerWhatsim的这样一个文件那么我们通过替换文件的方式我们可以直接进行代码升级功能的替换这样子就避免了这样一个绒长的这样一个代码Review代码Mods等待Release的这样一个过程同时因为Whatsim这个Baner是我们可以支持的同时我们可以支持我们增加了一个泛化的这样一个配置文件的读入我们可以通过这个Whatsim去读入到非常多的这样一个用户的自定义的配置同时我们通过这样一个加载WhatsimBaner的方式我们支持我们不需要升级我们可以通过热加载或者说动态加载的方式就可以在它的下一次请求来之前下一次请求的时候我们替换的这样一个更新的这样一个Whatsim Midwild就生效了同时因为是Whatsim它编译成了这样一个二进之的字节文件那么实际上来说基本上来说存在反编译的可能性是非常小的那么保证了它的这样一个隐私性即使说你不在公司内部用了你把它传给别人别人也是没有办法破译你这样一个业务逻辑的所以说保证了它的这样一个隐私接下来我们说我们不仅在Depod的Midwild中使用了这样一个Whatsim的能力我们也在Bunding当中具体来说是Output Bunding中用到了Whatsim大家如果说对于Depod接触的比较少可能对Output Bunding比较难理解确实从中文上翻译来说输出绑定这个听上去是比较抽象的那么我们接下来就是用一个非常简单的例子去告诉大家Bunding在Depod中到底是什么东西那么我们首先来看左边左边的话是一个Input Bunding那么Input的Bunding是什么意思就是说我通过我这样一个组件我Input了就是输入了一些东西我通过什么输入呢我就是通过一些事件去输入了比如说我这个温比如说我这个某个卡福卡就是收到了某个消息之后然后我主动的去触发了某一个Depod应用里面的这样一个Endpoint就主动触发了一个Endpoint这就叫输入Input然后接下来我OutputOutput是什么意思呢就是说我比如说还是拿刚才的卡福卡卡福卡我接受到某个消息之后我主动的触发了Depod的消息Depod的消息呢然后又把这个消息怎么样呢又执行又把这个消息传到了我的mysec里面我的mysec里面去把这条记录保存了下来同时就是返回一个结果返回一个OK那么我接下来实际上就相当于什么把从卡福卡的消息然后通过我这样一个Input bounding和Output bounding的结合我完成了一个消息的转存就是从卡福卡从消息的最开头到卡福卡然后到转存到了mysec里面这就是一个所谓的这样一个数据的bounding那么这个大家可能会想大家一听到卡福卡大家可能会说卡福卡是一个非常常见的这样一个消息中间键那我为什么我不能够直接用这样一个PubSub的Component呢刚才我在一开始的这个图里面这个Building Blocks里面也写了有PubSub这样一个那为什么呢就是说PubSub实际上你可以看作Bunding是对PubSub的更高级的抽象也就是说它隐藏了一些PubSub的某一些细节比如说什么细节呢就是说你的这样一个我还是拿卡福卡这样一个常见的消息中间键来举例它就是说呢卡福卡它可能会有一些pooling然后也可能会有一些复杂的连接问题比如像连接超时什么问题这都不在这个如果说你单纯的用PubSub这样一个模块的话你可能需要考虑这些问题用Bunding的话我们是在这里面的去Bunding去Cover了出了这个问题然后同时呢就是说你用PubSub的话呢你可能会针对一些卡福卡的代码或者Magic的代码去做一些处理那么Bunding的话实际上也是把这个完全就抽象了就是它不在乎你的这个Input或者Output是卡福卡也好是买色卡也好它直接帮你抽下程就是单纯的Input你写代码你只要考虑Input过来拿到什么东西我业务做什么处理然后Output出去之后我业务再做什么处理这样子就达到了一个什么呢就是让业务逻辑完全的在这个业务代码里面就是让你的Application完全做你这个业务的事情然后你所谓的这些跟中间线相关也好跟这个消息对立也好跟这个数据库也好所有的这样一些操作你全都把它给屏蔽掉了就是屏蔽了这些差异位以后你就是不管说你从卡福卡切换到Redis还是从Redis切换到这样一个Dravid MQ你都是非常简单的修改一下Denmark的配置你就可以完成了就是减少了这样一个复杂性同时就是一些错误处理在Bunding里面也帮你完成了所以说我们回头再看一下我们又通过Output Bunding和Wassim的结合了我们可以做什么事情呢就是说还是刚才的就是比如说你想做一些用户用户想自定义一些逻辑但是是不在Http这样一个流程里面的它可能是在一些数据的转圈数据的清理或者说是跟AI相关的一些模型操作上也好那么Http Mid-Wire它是做不到了因为它只是一个在Http过程中的中间键它没有办法做那么多事情那么这时候我的Output Bunding就可以帮你去做你可以把你的一些消息你的一些数据你的一些这样一个信息传递到我的Wassim当中那么我的这个Wassim你可以看作一个是万能的黑盒它可以帮你做数据清理可以帮你做数据解析可以帮你做一些AI训练甚至说是帮你检测这只猫是不是狗帮你做这些事情然后通过这样一个Bunding你可以得到一个它返回的结果得到它返回的结果之后你可以继续做一些事情那么这时候大家可能会想到那这样子的话我通过多个Output Bunding的情况我是不是可以又达成了一个我自己的就是完全自定义的每一个路每一步都可以自定义的这样一个工作流呢实际上是可以的通过Depr和Bunding的这样一个结合是可以达到这一步的所以说通过Depr实际上就是我们引入了Wassim之后极大程度上面增加了它的一个灵活性就对于Depr来说它不仅仅是你的类制的代码编写它的逻辑可以完全通过你的这样一个自己编写一些Wassim模块的方式去达到你的这样一个定值化的需求好,然后我们最后看一下就是我们接下来会在这个Depr中还会增加一些什么样的功能比如说就是增加一个并发提高这样一个并发性的就是大家刚才可能想了是比如Output Bunding它同时这样一个触发一个可能没有问题同时触发多个那么针对于HTTV MiddlewareHTTV Middleware在这样一个大连接的场景下面它这个并发性的这样一个优化我们也会继续地做那么第二个就是说什么呢就是在Wassim的代码中直接去调用Depr的模块就比如刚才我说了就是在Output Bunding之后可以用Wassim进行一些数据处理但是数据清理完了我是不是要等待它的返回结果回来之后然后我再到下一步那么这时候我到的下一步如果说就是直接Depr中的模块比如说Depr中的一些状态状态管理或者说是一些存储模块或者说是分布数那么我是不是还要再调一次那这样子不是多了一步了那么我们再考虑如何在这个Wassim Code中的直接支持去调用这样一个Depr的模块那么使得这个Wassim就不再是一个中间线了它变成了一个Depr的Client去进行一个处理使得它更加和Depr生态就是更加地贴合然后第三点就是提高安全性那么我们想到了一个什么方法提高安全性刚才说了是Wassim已经是用Sandbox去运行了但是Sandbox它是默认来说它并不是说是完全不给你权限的它有一个默认权限而这个默认权限实际上在很多场合它也是非常大的那么我们增加了这样一个选项去强制地去使得它这个时间和这个文件上都没有办法修改那么大家对文件的修改可能比较OK可能一听到文件修改OK它确实确保了安全性那对于时间的修改了那是大家知道很多的DNS攻击它并不是说是通过访问量去攻击而是去修改你的一些时间比如说还有大家常经到的这样一个千连虫的问题实际上都是对时间的修改去达到一些攻击上的目的所以说通过这样的方式去提高了它的安全性那么最后一点的就是说去编写这样一个原生的Wassim的 SDK那么刚才说的就是我们的Depart是支持多语言的它现在已经支持了Go支持了Java支持了PHP支持了Python等等很多语言但是Wassim它是不支持那么就导致了什么呢就是说你刚才如果说要用Wassim去编写模块的话首先你要选择一个Wassim支持的语言那很好的是它的Go语言已经支持了Rus也支持了大家可能就是这几个语言Python应该也支持了所以说大家可以用这些去编写Wassim那么这个编写完之后实际上是对于Wassim来说就是还是不够贴近为什么要绕一圈编写一个Wassim模块然后再去运行呢我们可以通过这样一个Wassim的 SDK的方式直接就是我在Wassim里面就调用Depart 调用这个然后就达到了这个就是这一点的就相当于是对于第二点的这样一个增强那么通过这样的方式就是去优化这样一个Wassim在Depart中的体验好 这是我的联系方式好 我这边的分享就到这里谢谢大家谢谢你我不懂我说的不好英文可以我可以听懂You can speak EnglishOK thank youIf you go back a few slidesso my Mandarinno no no go to thesorry to your like future work slideright rightso I'm sorrylike my Mandarin isn't greatbut I'm curious to understand a little bit moreabout the sandboxing stuffthat you're interested in doing herespecifically there's a lot of other thingslike file IO rateand memory usageand other stuff like thatthat's also potentially concerninghave you thought about thatand how you're going to handle those types of issuesyesIn facta single wasim file cannot be roundthis need to be roundin wasim round timenow we use go little wasim round timewhat's the otherwhat's the other has reallythis latest version has improvedthe memory usageand with thatwe can ensure我们之前也做过一些wasim的一个调研就是他在存计算领域应该说是用的比较好的但他本人可能存在一些在IO或者一些其他资源的隔离上可能存在一些不足我想知道这一块的最新的一些进展怎么样的就是包括这个项目在使用中是不是在场景上相对于这种存计算内的有了一些新的拓展什么的是这样的就是一开始就是在去年的时候就是我已经我在dapper里面这边实际上dapper有很多的这样一个block都是和存储相关的比如说State Manager比如说Secrets这实际上都是和存储相关的就我当时就已经在考虑能不能用 wasim去做一个database的中间键或者说是一个存储相关的中间键那么当时遇到的一些问题就是说是wasim他就是本身他不支持HTTP的他没有办法去做请求当然现在这样一个wasim已经可以做HTTP的访问了那么现在来说他可以做一些简单的这样一个HTTP调用就是你可以用一些就是这样一个RESA4的这样一个API去调用一些database当然就是你说的没有错在存计算领域就wasim更多一点在这些database一些相关的这样一个领域当中它表现出来的性能会差一点这也是一些就是很多wasim的项目或者说是wasim的它这样一个委员会正在去解决的事情我相信未来这一块肯定是有一个比较好的解决方式的因为wasim它还是比较目前来说还是比较初期的阶段我们目前来说就是依然在探索它到底能用在哪些方向那么我可以再跟你分享一个就是在wasim领域目前来说就是有一个比较亮眼的事情就是说wasim可以和AI结合就可以把一个两到三G的这样一个AI的大模型去把它压缩成一个两到三照的这样一个wasim文件然后跑在这样一个A指端这是一个非常巨大的提升这我也相信是一个对于wasim来说是一个非常亮点的功能有考虑过比如说用户台的侵览级虚拟级吗比如说现在EBPF这种东西因为EBPF其实也有一些用户台的这种虚拟级然后它可能会有更多的额外的验证器来保证安全同时可能跟外部交互的时候不需要这种比如说一些下河保证这些你们有没有考虑过呢先请教一下谢谢是这样的EBPF确实它可以做一些安全上的验证因为它在加载EBPF就是加载制断EBPF程序在运行之前它会做一些安全的教验但是这个但是目前来说EBPF它本身的功能限制是非常强的它并不能够做一些它相对于wasim来说它做不到很多wasim能做的事情所以说在这个就是解决方案的考虑上来说当时没有考虑EBPF那么另外没有考虑EBPF的另一个原因是它并不具有夸平台性因为我刚才在一开始这个代码里面说的我们的代码是这个Rawnt Anywhere的然后实际上wasim也是Rawnt Anywhere的但是EBPF它比较限制然后它对克勒版本的也有要求它并没有能够达到这样一个平台无关所以说在这样一个在这样这点上面我们就pass了EBPF了对 你好我主要想咨询一下你有什么推荐的这个dapper和wasim比方说在我的一个商业场景里面它到底比较合适用来做什么我举个例子我们最开始也调研过因为wasim没有HTTP的就没有管犯的支持比方说Redis Kafka这种协议但是我们做了POC就是想借助dapper因为它抽下来HTTP能够调用HTTP然后我们就用就是wasim来利用dapper去访问中央界这是一个商业场景我只是举个例子看看你有什么推荐的到底怎么用它用好它这两个怎么配合是这样的就比如是用dapper的一个场景一个我比较推荐的场景就是一个快速的这样一个圆形验证就比如说你想要验证你的这样一个业务不仅能在能用Messacre能用Redis跑能用其他的东西跑那么实际上如果说没有dapper的话你首先要对Messacre要对Redis这样一个SDK要比较熟悉你才能够去编写这样的程序去进行一个判断你对客户你才能去验证说我能够在这上面跑能够在那边跑但是你通过用dapper之后你只要简单的去修改一下dapper的配置你用dapper的这样一个build API的方式它实际上就屏蔽了这样一个Redis的SDK或者说Messacre SDK的这样一个细节你又可以用相同的代码去跑在不同的这样一个底座上面这是我比较推荐的一个点然后刚才说的是dapper和wasm的结合又是在哪边呢就是说这样是在一个你在做一个解决方案的时候那么肯定每一家公司都会对你的这样一个解决方案有一些私人定制那么这样一个私人定制如果说你直接去修改代码那OK 也是可以的但是会早知什么呢就是你的公司内部会有多一个这样一个修订板或者说是发行板的这样一个产品那么实际上对你的这样一个项目管理来说是不好的就是你的这样一个业务团队可能要维持多份的这样一个副本去达到不同的这样一个release的效果那么你用了wasm之后实际上你只要维护这样一个wasm的仓库同时就是它和你的主干的这样一个业务逻辑是完全分开的你不用担心它的这样一个就是私人定制的这些需求会影响到你的这样一个主干的逻辑同时就是你要维护的比如说对A公司我只需要维护这几个wasm库对B公司我只需要维护这几个wasm库那么同时对于更广泛的当你越做越多的时候实际上来说的话你的这样一个可以供用户选择的这样一个私人定制的模块实际上你也越来越多了你这样通过模块化的需求而不是通过这样一个就是A公司说我要一个功能B公司说我要一个功能你都把它们去扣到这个代码里面我觉得是从项目管理方面以及从这样一个后期的维护上面我觉得都要方便得很多好 谢谢然后我想那个wasm现在有一些局限性对吧 刚才那个同学也提到了就是内存分配限性只能分配那么多然后包括多线程的知识您这边有什么现实的在山用的场景能够分享的吗还有说就是还很早期还是说在探索是这样的就是有很多有很多公司比如像螞蟻螞蟻他在自己的模身里面他就用到了这个wasm模块去进行当然了他不是用了代码他在模身里面用了这样的wasm模块去实现他的一些定值化的需求然后呢也有一个就是今天如果你听到别的这样一个wasm分享的话你会听到一个公司叫做Second StageSecond Stage它的这个wasm edge它也做了很多商业化的尝试它自己的那个楼下有个workshop我中午的时候也去体验了一下它会让你一件去布置一些wasm的这样一个文件去达到一些就是机器人的效果我觉得这样也是一个比较有意思的探索谢谢我最后一个问题了有一个激进的想法那wasm现在有这么多优势内存占用也小是吧那我可不可以把这个dapper编一层wasm这是一个比较激进的想法那么实际实际上来说这个想法是有可能的但是呢你没有就是说你把它编一层编一层wasm之后它会失去的一些点就比如说呢就是我原先的dapper就已经是已经是这样一个平台无关了已经是多元支持的了你把它变成wasm之后它会它会提供一些更好的性能嘛那并不会因为wasm的内存本身它就是限制的那它会它会提供一些就是更好的这样一个拓展性嘛那么对于dapper对于dapper对于dapper它可以往里面塞组件可以加拓展性那么对于wasm它根本就不可能去做到这样一个功能所以说呢就是用把它直接就把它变成wasm那可能是并不是一个很就是对于在我看来并不是一个很好的方向好 谢谢非常感谢好的 谢谢大家