这个 Gem 可以说是 SaaS 快速开发套件 系列的番外篇了,我曾在上一篇 WorkflowCore 中提到了一句,这里做一个稍微正式的介绍,但其实这并不创新,因为这是游戏领域玩剩下的做法。
项目地址: https://github.com/rails-engine/script_core
在业务系统中,有很多涉及到计算的场景,比如:
传统的实践中,有两种典型的做法:
一点题外话,必须吹一波,Shopify 在互联网的流量排名上也非常靠前,也就是说访问量很大。这家公司在商业上比较成功,之前 Tim Cook 访加拿大有专程拜访 Shopify,对 Ruby 和 Rails 的生态贡献巨大,Shopify 的员工里有好几位 Rails 或 Ruby core team 的成员,包括 5.2 的 Bootsnap 等 Rails 的组件或 gem 都由 Shopify 贡献(具体可以看他们的 Github),并且 Shopify 本身提供的服务,尤其是后台管理系统和开发者站点的设计和文档,非常值得学习,这个网站和他们的博客应该是 Rails 开发者一定要去了解一下的。
Shopify 是一家提供电商站点搭建的 SaaS 服务,和国内的一些同类服务不同的是,Shopify 允许客户深度定制站点,不仅仅是前端,有很多地方需要定制逻辑:
可以看到 Shopify 运营上的定制需求非常的复杂,可是 Shopify 的解决方案却非常简单:提供一套可编程能力来实现这些规则的定制!然后在合适的位置和时机去触发由用户(店主)编写好的脚本就好了。
这个功能被叫做 Shopify Script。
官方的介绍:https://www.shopify.com/enterprise/ecommerce-checkout-shopify-scripts
官方也提供了一些参考示例:https://github.com/Shopify/shopify-scripts
另外可以 google 关键词 shopify script 有很多官方和非官方的介绍和案例
鲜为人知的是(几乎没有相关资料和文章介绍),它所使用的表达式引擎叫做 ESS,是完全开源的,它实际上是一个 MRuby 虚拟机,并且是一个沙箱环境,也就是说来自用户的非可信(untrusted)代码,可以放心的交给它运行。
甚至 Shopify 为其提供了 BugBounty 计划来悬赏涉及安全和导致崩溃的 Bug!所以它的安全性稳定性是与顶级大厂的利益捆绑的。
就是这样的一个通用方案解决了所有上述场景的需求,而且对于我们 Ruby 开发者来说,没有额外的学习成本。论强大,有什么表达式能比一个图灵完备的流行编程语言强大呢?论表达能力,有什么语言表达能力能胜过 Ruby 呢?
ESS 原理、用法、特性、试玩参阅:https://mruby.science/ 和 https://github.com/Shopify/ess
ESS 的特点是:
stdout
方便调试它的缺点有:
有人会担心使用脚本会不会增加运营人员的难度?答案是相比上文提到的“抽取算法做成一定程度可配置的”的方案而言,并没有增加难度,而且解决了这种方案对特别复杂的逻辑束手无策的情况。
只需要让暴露给运营人员的配置器,生成相应的 Ruby 脚本即可,这并不难,有人为 Shopify Script 做了一个 https://jgodson.github.io/shopify-script-creator/
对于特别复杂的逻辑,开发人员协助运营编写好脚本即可。
性能,在 MBP 2018(Core i9 8gen),计算第一百项 fib,耗时约 3ms。
首先 ScriptCore 是 ESS 的 fork,因为 ESS 只为 Shopify Script 的场景考虑,我希望在 ScriptCore 能做出这些改进:
mrbc
TZ
环境变量即可解决)但由于精力有限,这些工作是需要很大耐心和实践,有兴趣的朋友可以来研究研究。
最后,通过表达式引擎来控制流程的流转,以及表单中数据的求值,WorkflowCore + FormCore + ScriptCore 就是我提出的信息系统的终极解决方案!