基于Wasm的轻量实时计算
随着各行各业对实时计算的需求越来越强烈,实时计算领域的竞争也越来越激烈,呈现百花齐放的状态。
虽说Flink在实时计算领域已坐稳老大哥,但是却也阻挡不了其它实时计算框架在某些细分领域发光。
本篇主要介绍几款基于wasm的轻量实时计算框架,比如Redpanda、InfinyOn。
wasm是什么
wasm是WebAssembly的简称,就是一个可移植、体积小、加载快并且兼容Web的全新格式。网上也有很多相关的介绍,可以参考下。
Redpanda
来自官方的描述:Redpanda is a Kafka®-compatible streaming data platform that is up to 10x faster and 6x more hardware-efficient. It is also JVM-free, ZooKeeper®-free, Jepsen-tested and source available.
Redpanda是一个实时数据平台,完全兼容kafka,并且没有外部依赖,比如zookeeper。它是用C++
编写,所以也没有JVM
。
由官方的描述可知它主要是对标kafka,其核心功能也就是消息队列。不过它还可以对数据进行实时处理,个人感觉其整体功能有点类似Plusar。
由于它完全兼容kafka,所以它也有topic、partition、replication这些概念,而且使用方式也与kafka一样,就不再赘述了。这里主要介绍下实时处理也就是Data Transforms
功能
Data Transforms
Data Transforms
是Redpanda用于实时数据处理的模块,其基于wasm
实现。基于wasm
实现的好处是用户可以使用自己熟悉的语言(可编译为wasm)开发数据处理逻辑,然后将其编译为wasm
文件并注册部署到Redpanda中,就可以对数据进行实时处理,对用户及其友好。
上面是我个人的理解,下面是官方给出的亮点:
- 易用: 用户只需使用wasm支持的语言编写TransForm逻辑,然后将其注册到Redpand中就可以了,无需关kafka的依赖库。
- 高效: Transform代码会推送到集群中的所有节点中,Redpanda节点会像调用RPC那样调用这些本地代码。
- 简单: Transform管理较简单,只需将其注册到Redpanda即可,其会存储在一个单独的topic中,由Redpanda自己管理。
Data Transforms架构
Data Transforms由4部分组成,分别是客户端工具
、存储和Transform code
、Routing streams
和执行引擎
。
客户端工具(Client-side tooling)
客户端工具rpk
可以生成一个标准工程模版,开发者只需填充数据转换逻辑即可。还可通过rpk
进行部署、更新wasm
文件。
存储和Transform code(Storage and distribution of scripts)
Redpanda核心是一个可线性扩展、支持事务的存储引擎,底层使用raft协议保证数据副本之间的一致性。Redpanda完全支持kafka协议,所以也是按照topic、partition和replication进行存储的,同样也支持压缩存储。
开发者注册的.wasm
文件存在一个单独的内置topic中,其topic也是支持压缩的。wasm
文件通过名字来区分,相同名字的wasm根据时间顺序进行更新,压缩时会将历史版本移除。
Routing streams(pacemaker)
Routing streams主要用来将数据根据规则路由给不同的transform进行处理,这个组件被称为pacemaker
。它是整个系统的核心,它需要在保证高效的前提下还需要保证数据的顺序性。其整个工作流包含3步:
- 并行从
input
中读取数据 - 每个协处理器通过RPC调用
wasm
执行引擎执行传过来的数据和相关的元数据 - 将执行结果和offset写入结果topic中
需要注意的是在单个协处理器中只有在第3步执行结束之后,第1步才能再次被执行,否则结果中的数据就会乱序。
peacemaker中还会记录每个transform处理的offset状态,以便当处理失败时已记录的offset处进行重放,以保证幂等性。
执行引擎(execution engine)
执行引擎有两种,一种是同步函数调用,另一种是基于异步的状态转换。
- 同步执行引擎
同步执行引擎主要应用在一些简单的数据过滤、数据加密等较为纯粹的数据处理场景下,wasm
文件就像调用同步函数那样被执行。其架构如图:
- 异步执行引擎
异步执行引擎主要用于在transform时需要外部依赖或者一些状态的场景中。因为在这些情况下wasm
的执行时长是不受控制的,容易造成阻塞,所以在异步执行引擎中会新建一个与原topic分区一摸一样的子分区,这样将producer、transform和consumer解偶,提升数据处理能力。其架构如图:
Demo
这里是官方的一个demo,从pg中通过cdc将数据传入Redpanda中,流程较为简单,而且都是基于docker环境的,就不再重复了。
fluvio
fluvio出自InfinyOn,它也是开源的,可对数据进行实时聚合、关联和可编程。
分为4部分,分别为SmartModules
、Data Streams
、Immutable Store
和Clients & Connectors
。
SmartModules
是可编程模块,可以实时对数据进行清洗、过滤和计算,是用Rust
编写然后编译为wasm
进行执行。Data Streams
是分布式模块,支持冗余和自动恢复。Immutable Store
是一个持久不变的存储层,用于持久化数据Clients & Connectors
包含一些封装好的API,可以进行生产数据和消费数据,还包括一些已封装好的connector用于连接一些常见数据源,比如pgsql
fluvio架构
fluvio由2个组件组成,分别为Streaming Controller(SC)
和Streaming Processing Units(SPU)
,采用master/worker形式,其架构如图:
SC负责SPU的生命周期,包括整个集群各个节点的拓扑图和分布式数据流相关的优化。SPU负责实时数据。SC和SPU是相互独立的,每个服务都可单独重启、升级。
SmartModules
SmartModules是开发者可编程的模块,开发者使用Rust语言进行开发,然后将其编译为wasm提交给fluvio,就允许开发者直接控制数据流。
目前官方提供的类型有Filter
、Map
,FilterMap
,ArrayMap
和Aggregate
,不过官方还提供了一个Hub,方便开发者贡献自己的SmartModules和下载所需的非官方SmartModules
官方也提供了一些Demo,都比较简单,感兴趣的可以自行查看。
结论
这两个实时框架都是基于消息队列之上的,都是通过wasm
将数据处理功能开发给开发者,其功能有点像Plusar,只不过Plusar是用java语言开发的,其数据处理能力并没有使用wasm
,而是使用的是原生java语言,个人感觉可能是因为java语言受众比较广吧。