关于web:函数计算助力语雀构建稳定且安全的业务架构
简介: 语雀是一个业余的云端知识库,用于团队的文档合作。当初已是阿里员工进行文档编写和常识积淀的标配,并于 2018 年开始对外提供服务。 客户介绍语雀是一个业余的云端知识库,用于团队的文档合作。当初已是阿里员工进行文档编写和常识积淀的标配,并于 2018 年开始对外提供服务。 客户痛点语雀是一个简单的 Web 利用,也是一个典型的数据密集型利用(Data-Intensive Application),背地依赖了大量的数据库等云服务。语雀服务端是 Node.js 技术栈。当提到 Node 的时候,可能立即就会有几个词浮现在咱们脑海之中:单线程(single-threaded)、非阻塞(non-blocking)、异步(asynchronously programming),这些个性一方面十分的适宜于构建可扩大的网络应用,用来实现 Web 服务这类 I/O 密集型的利用,另一方面它也是大家始终对 Node 诟病的中央,对 CPU 密集型的场景不够敌对,一旦有任何阻塞过程的办法被执行,整个过程就被阻塞。 像语雀这样用 Node 实现整个服务端逻辑的利用,很难保障不会呈现一些场景可能会耗费大量 CPU 甚至是死循环阻塞过程的,以 markdown 转换举例,因为用户的输出无奈穷举,总有各种可能让转换代码进入到一个低效甚至是死循环的场景之中。在 Node 刚入世的年代,很难给这些问题找到完满的解决办法,而即使是 Java 等基于线程并发模型的语言,在遇到这样的场景也很头痛,毕竟 CPU 对于 Web 利用来说都是十分重要的资源。而随着根底设置越来越欠缺,当函数计算呈现时,Node 最大的短板看起来有了一个比拟完满的解决方案。 解决方案“把函数计算引入之后,咱们能够将那些 CPU 密集型、存在不稳固因素的操作通通放到函数计算服务中去执行,而咱们的主服务再次回归到了 I/O 密集型利用模型,又能够欢快的享受 Node 给咱们带来的高效研发福利了!”语雀产品技术负责人不四示意。 “以语雀中遇到的一个理论场景来举例,用户传入了一些 HTML 或者 Markdown 格局的文档内容,咱们须要将其转换成为语雀本人的文档格局。在绝大部分状况下,解析用户输出的内容都很快,然而仍然存在某些无奈预料到的场景会触发解析器的 bug 而导致死循环的呈现,甚至咱们不太敢降级 Markdown 解析库和相干插件免得引入更多的问题。然而随着函数计算的引入,咱们将这个耗费 CPU 的转换逻辑放到函数计算上,语雀的主服务稳定性不会再被影响。” 除了帮忙 Web 零碎分担一些 CPU 密集型操作以外,函数计算还能做什么呢? 语雀反对应用各种代码模式来绘图,包含 Plantuml、公式、Mermaid,还有一些将文档导出成 PDF、图片等性能。这些场景有两个特点:1、他们依赖于一些简单的应用软件,例如 Puppeteer、Graphviz 等;2、可能须要执行用户输出的内容; 反对这类场景看似简略,通过 process.exec 子过程调用一下就搞定了。然而当咱们想把它做成一个稳固的对外服务时,问题就呈现了。这些简单的应用软件可能从设计上并没有思考要长期运行,长期运行时的内存占用、稳定性可能会有一些问题,同时在被大并发调用时,对 CPU 的压力十分大。再加上有些场景须要运行用户输出的代码,攻击者通过构建歹意输出,能够在服务器上运行攻打代码,十分危险。 ...