随着各行各业对实时计算的需求越来越强烈,实时计算领域的竞争也越来越激烈,呈现百花齐放的状态。

虽说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中,就可以对数据进行实时处理,对用户及其友好。

上面是我个人的理解,下面是官方给出的亮点:

  1. 易用: 用户只需使用wasm支持的语言编写TransForm逻辑,然后将其注册到Redpand中就可以了,无需关kafka的依赖库。
  2. 高效: Transform代码会推送到集群中的所有节点中,Redpanda节点会像调用RPC那样调用这些本地代码。
  3. 简单: Transform管理较简单,只需将其注册到Redpanda即可,其会存储在一个单独的topic中,由Redpanda自己管理。

Data Transforms架构

Data Transforms由4部分组成,分别是客户端工具存储和Transform codeRouting 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步:

  1. 并行从input中读取数据
  2. 每个协处理器通过RPC调用wasm执行引擎执行传过来的数据和相关的元数据
  3. 将执行结果和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部分,分别为SmartModulesData StreamsImmutable StoreClients & 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,就允许开发者直接控制数据流。
目前官方提供的类型有FilterMapFilterMapArrayMapAggregate,不过官方还提供了一个Hub,方便开发者贡献自己的SmartModules和下载所需的非官方SmartModules

官方也提供了一些Demo,都比较简单,感兴趣的可以自行查看。

结论

这两个实时框架都是基于消息队列之上的,都是通过wasm将数据处理功能开发给开发者,其功能有点像Plusar,只不过Plusar是用java语言开发的,其数据处理能力并没有使用wasm,而是使用的是原生java语言,个人感觉可能是因为java语言受众比较广吧。