隨著微服務的流行,越來越多應用采用微服務架構開發。如何簡單高效地在微服務中完成數據處理成為大家不得不面對的問題。以往單體應用架構下,我們可以借助數據庫實施計算,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 易集成、熱切換、高效開發與高性能等特性可以幫助微服務快速、高效地實現數據處理,同時還能為應用結構提供一些便利,有效助力微服務開發,讓微服務全面“微”化。