随着微服务的流行,越来越多应用采用微服务架构开发。如何简单高效地在微服务中完成数据处理成为大家不得不面对的问题。以往单体应用架构下,我们可以借助数据库实施计算,SQL 是专用的集合计算语言,依托数据库较强的计算能力可以比较方便地完成数据处理。但在微服务架构下,为了方便服务扩展和服务封装,数据库则主要承担数据持久化任务,数据处理都在应用(服务)端完成。
服务端完成数据处理的主要手段是采用 JAVA 硬编码(也有其他高级语言,Java 使用更多)。由于应用使用 Java 开发,原生的 Java 代码可以无缝融合到微服务中,加上 Java 支持过程可以分多步实施计算,而且在 Java8 以后引入了 Stream 特性后计算又方便不少。
不过,使用 Java 进行数据处理距离 SQL 还有很大差距,同样的分组汇总 SQL 实现很简单,但 Java 却要几十行代码,复杂计算二者的差距更明显。根本原因是由于 Java 并非专用的集合运算语言,也缺少相应的结构化数据计算类库,导致代码很长,微服务一点也不“微”。并且,Java 作为编译型语言,很难直接实现热切换,被迫使用 Docker 等沉重的机制,这对于频繁变动的微服务来说十分不友好。鱼与熊掌,要拥抱微服务就得忍受 Java 做数据处理的缺点。
一个理想的微服务数据处理组件应该具备这样一些特点:
易于与微服务融合,可以无缝嵌入使用;计算能力强且实现简单,可以方便地完成所有数据处理任务;支持热切换(热部署),服务不停机运维;体系开放,可以直接使用多种数据源。
开源集算器 SPL 的出现使得这些问题迎刃而解。
集算器 SPL 是一款开源数据处理引擎,不仅能与 Java 应用(微服务框架)无缝集成,还提供了完备的计算能力,基于 SPL 语法实施计算的简便性远超 Java(甚至 SQL),同时提供了热切换与多源支持等特性,为微服务数据处理提供了新思路。
SPL 作为专业结构化数据处理引擎提供了完备的计算能力。使得微服务中的任意结构化数据处理工作都可以通过 SPL 实现。
SPL 不仅可以完成所有结构化数据计算,实现上也很简单。SPL 提供的敏捷语法实施计算的简便性远超 Java。下面的例子可以感受到 SPL 的简洁程度。
根据股票记录表查询股价连续上涨超过 5 天的股票及上涨天数(股价相等记为上涨)
A | ||
1 | =db.query@x("select * from stock_record order by ddate") | |
2 | =A1.group(code) | |
3 | =A2.new(code,~.group@i(price<price[-1]).max(~.len())-1:maxrisedays) | 计算每只股票的连续上涨天数 |
4 | =A3.select(maxrisedays>=5) | 选出符合条件的记录 |
从数据库取数后,通过 SPL 实施计算,这个例子即使使用 SQL 也要嵌套 3 层子查询才能实现,更不用说 Java(Stream,也包括 Kotlin)了。SPL 支持分步计算,这方面要优于 SQL。从语法特点上看,SPL 相当于结合了 Java 和 SQL 的优点。
SPL 提供了丰富的计算类库,更进一步简化运算。
SPL 支持多样数据源混合计算。RDB、NoSQL、CSV、Excel、HDFS、Restful/Webservice、Kafka…都可以连接,并进行异构源混合计算,可以极大满足微服务场景下面临的多样源问题,进一步提升开发效率。
在 SPL 的支持下,服务逻辑的实现代码都能短小很多。这就让微服务不仅在结构上,而且在实现上真地“微”起来了。
SPL 使用 Java 开发,支持 jar 包嵌入。微服务应用可以将 SPL 引擎以 jar 包形式引入与应用无缝集成。SPL 还封装了标准 JDBC 接口,可以在服务中通过 JDBC 调用 SPL 脚本。
具体使用时只需要引入相关 jar 并部署配置文件(raqsoftConfig.xml),通过简短的代码就可以调用 SPL 脚本。
SPL 是解释执行的,天然支持热切换。可以适应微服务架构下多变的服务修改需求,服务修改不需要重启即时生效。
数据处理逻辑位于 SPL 文件(.splx)中,修改后实时生效,相对 Java 等编译型语言需要重启服务有很大优势。
借助 SPL 的热切换特性可以帮助微服务降低资源消耗。以往通过 Java 实现数据处理的微服务为了能够单独运维常常要独立部署(VM/Docker 上),这样做的好处是在物理上隔离了服务与服务,但缺点是 docker 会消耗更多的资源,导致资源利用率很低。SPL 具备单独运维(热切换)特性,这样多个服务共处一处仍然可以单独修改维护,提高资源使用效率。当然,有时为了避免服务间相互影响(如高可用)还需要单独部署,这时 SPL 也无法降低资源消耗了。SPL 为微服务提供了更多选项,让微服务在体系结构和资源消耗上也更“微”。
SPL 除了可以与微服务结合使用,还可以作为独立的计算服务器运行。微服务内 SPL 脚本调用 SPL 计算服务器实现高性能计算。
SPL 服务器支持分布式计算可以部署集群进行横向扩展,支持负载均衡和容错。同时 SPL 还提供诸多高性能算法进一步保证计算性能。
借助 SPL 易集成、热切换、高效开发与高性能等特性可以帮助微服务快速、高效地实现数据处理,同时还能为应用结构提供一些便利,有效助力微服务开发,让微服务全面“微”化。