{"componentChunkName":"component---src-templates-blog-detail-tsx","path":"/blog/2019-11-15-serverless-ssr","result":{"data":{"currentBlog":{"id":"8fb3dfc3-b43e-5c5d-82d2-b4c0809761e3","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/2020114/1578992366948-16e6e6a4c7f54ffb.png","authors":["腾讯 IVWEB 团队"],"categories":["guides-and-tutorials"],"date":"2019-11-15T00:00:00.000Z","title":"NGW，前端新技术赛场：Serverless SSR 技术内幕","description":"腾讯 IVWeb team（负责腾讯互动视频 NOW 直播、花样直播等产品） 经验分享~","authorslink":["https://juejin.im/user/5a9f77666fb9a028c14a01eb"],"translators":null,"translatorslink":null,"tags":["NGW","Serverless SSR"],"keywords":"Serverless SSR,Serverless 新技术","outdated":null},"wordCount":{"words":582,"sentences":109,"paragraphs":109},"fileAbsolutePath":"/opt/build/repo/content/blog/2019-11-15-serverless-ssr.md","fields":{"slug":"/blog/2019-11-15-serverless-ssr/","keywords":["php","serverless","webpack","服务端渲染","同构渲染","无服务器","云函数","函数","直出","Serverless","serverlesscloud"]},"html":"<h2 id=\"▎目录：\"><a href=\"#%E2%96%8E%E7%9B%AE%E5%BD%95%EF%BC%9A\" aria-label=\"▎目录： permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>▎目录：</h2>\n<ol>\n<li>前言</li>\n<li>Serverless 的演进</li>\n<li>云函数 SCF 的开发</li>\n<li>NGW Serverless 同构直出方案</li>\n</ol>\n<h2 id=\"▎前言\"><a href=\"#%E2%96%8E%E5%89%8D%E8%A8%80\" aria-label=\"▎前言 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>▎<strong>前言</strong></h2>\n<p>最近 Serverless 又火了，有不少业务上云实装了 Serverless 云函数，取得了不错的落地效果，业界也在不断探索 Serverless 更多的落地场景。</p>\n<p>那么对于前端来说，Serverless 意味着什么？对于 Node 服务来说，哪里可以落地 Serverless？</p>\n<p>答：<strong>Serverless 同构直出渲染。</strong></p>\n<h3 id=\"serverless--ssr--\"><a href=\"#serverless--ssr--\" aria-label=\"serverless  ssr   permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><strong>Serverless + SSR = ?</strong></h3>\n<p>Serverless 云函数：云计算发展过程中出现的一种计算资源的抽象，它以云计算平台为基础，为开发者提供业务程序的运行环境，开发者无需关注底层资源分配、扩容部署，代码执行所必要的全部服务由平台提供。</p>\n<p>SSR 服务端渲染: 指在服务端将 HTML 渲染到前端，早期常用 php jsp 技术来在服务端生成 HTML，近年来 JS 同构化趋势演进下，逐步出现了在服务端上运行前端 JS 代码进行渲染的方案，如 React、Vue 等主流框架的同构渲染。</p>\n<p>若能将 Serverless 技术落地到 SSR 场景，将会有如下优点：</p>\n<ol>\n<li>云服务资源理论上无限扩容，前端不必考虑业务量对 SSR 机器性能的影响</li>\n<li>前端同学无需关注 SSR 机器的运维、申请、扩容，减少部署运维成本，提高开发效率</li>\n</ol>\n<p>目前腾讯 NOW 直播 IVWEB 团队正逐步将 SSR 业务迁移到腾讯云云函数平台上，精简部署运维成本。</p>\n<h2 id=\"▎serverless-的演进\"><a href=\"#%E2%96%8Eserverless-%E7%9A%84%E6%BC%94%E8%BF%9B\" aria-label=\"▎serverless 的演进 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>▎<strong>Serverless 的演进</strong></h2>\n<p>阿 J 是一个前端开发仔，某天产品跟他说页面白屏加载接口的时间太长了，体验差，这对于优秀的前端开发仔的他并不是难事，他有 99 种让页面加载变快的办法。</p>\n<p>因此他立马将利用团队直出框架，花了半天时间将页面接入了直出，接下来要将直出服务部署到现网，这时他犯难了：</p>\n<ol>\n<li>部署直出服务需要申请机器，申请多少台，申请几核的？</li>\n<li>这个业务量怎么样，有没有高并发场景，机器有没有扩容机制？</li>\n<li>Nginx 配置怎么改才能接入直出，直出失败的话又要怎么接入兜底的静态页面？</li>\n</ol>\n<p>一头雾水之时，他看见腾讯云的同事 maxlong 关于 Serverless 架构演进的 PPT….</p>\n<h3 id=\"从-iaas-到-faas\"><a href=\"#%E4%BB%8E-iaas-%E5%88%B0-faas\" aria-label=\"从 iaas 到 faas permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><strong>从 IaaS 到 FaaS</strong></h3>\n<p>在介绍云函数 SCF 之前，我们先来 diff 一下传统 IaaS 业务架构和云函数 FaaS 业务架构：</p>\n<p><img src=\"https://img.serverlesscloud.cn/2020114/1578992526077-16e6e6a4c7f54ffb.png\" alt=\"基于虚拟机的业务架构 (IaaS)\"></p>\n<p>而云函数架构是这样的：</p>\n<p><img src=\"https://img.serverlesscloud.cn/2020114/1578992526060-16e6e6a4c7f54ffb.png\" alt=\"基于云函数的业务架构 (FaaS)\"></p>\n<p>阿 J 对比了两者架构之后发现，在基于云函数的业务架构下，开发者无需再关注业务基础层的相关配置，可以集中精力处理业务逻辑的开发，基础层由平台负责维护迭代，只要将我们的直出服务部署上云就可以解决部署直出业务中的运维痛点了。</p>\n<h3 id=\"faas--baas-下的-serverless\"><a href=\"#faas--baas-%E4%B8%8B%E7%9A%84-serverless\" aria-label=\"faas  baas 下的 serverless permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><strong>FaaS + BaaS 下的 Serverless</strong></h3>\n<p>FaaS 的出现使得服务上云变得容易起来，但是** FaaS 并没有解决「公共基础服务」的问题**，而所谓公共基础服务，就是形如<a href=\"https://cloud.tencent.com/product/cos\">对象存储</a>、KV存储、消息推送这样的基础服务，这个问题最终落到了云服务提供商这里。</p>\n<p>因此市面上的云服务无一例外的都提供了上面的「公共基础服务」，这样的服务模式叫做 BaaS（Backend as a Service）。</p>\n<p>Serverless 直译过来叫无服务器，这里并不是说不需要服务器，而是说开发者不需要关注服务器，这部分由平台维护提供，开发者仅需关注业务逻辑的开发即可。</p>\n<p><img src=\"https://img.serverlesscloud.cn/2020114/1578992526238-16e6e6a4c7f54ffb.png\" alt=\"Serverless 架构下的 App\"></p>\n<p>在这样的一种架构下，开发者无须关注支撑应用服务运行的底层资源，以「函数」的形式承载业务逻辑，以「BaaS 服务」的形式支撑公共服务。</p>\n<p><img src=\"https://img.serverlesscloud.cn/2020114/1578992526372-16e6e6a4c7f54ffb.png\" alt=\"公有云基础设施上的 Serverless 演进\"></p>\n<p>考虑到直出服务的特性，阿 J 认为直出业务十分适合上 Serverless，因此他立马开始了直出上云的预研，做 Serveless SSR 服务，免去运维部署烦恼，减少直出接入成本！</p>\n<h2 id=\"▎scf-云函数开发\"><a href=\"#%E2%96%8Escf-%E4%BA%91%E5%87%BD%E6%95%B0%E5%BC%80%E5%8F%91\" aria-label=\"▎scf 云函数开发 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>▎<strong>SCF 云函数开发</strong></h2>\n<p>阿 J 认真研究了腾讯云云函数（Serverless Cloud Function，SCF），发现它可以将我们的业务拆成更细的粒度「函数」，而函数的执行环境开发者不需要关注，由平台负责，以下是阿 J 对云函数执行的理解。</p>\n<h3 id=\"云函数执行过程\"><a href=\"#%E4%BA%91%E5%87%BD%E6%95%B0%E6%89%A7%E8%A1%8C%E8%BF%87%E7%A8%8B\" aria-label=\"云函数执行过程 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><strong>云函数执行过程</strong></h3>\n<p>云平台在执行这些「云函数」的过程其实就是在对外提供服务，通常情况下，Serverless 函数会用于「响应 HTTP 请求」，即通过 HTTP 访问事件来触发云函数的执行，如下图所示：</p>\n<p><img src=\"https://img.serverlesscloud.cn/2020114/1578992525960-16e6e6a4c7f54ffb.png\" alt=\"云函数用户请求链路\"></p>\n<p>而「函数的执行」不外乎：入参、上下文、返回值、副作用四个要素，如图所示：</p>\n<p><img src=\"https://img.serverlesscloud.cn/2020114/1578992525959-16e6e6a4c7f54ffb.png\" alt=\"函数执行的四个要素\"></p>\n<p>四要素：</p>\n<ol>\n<li>「入参」： 云函数的入参即 HTTP 请求中的请求头、请求体</li>\n<li>「上下文」： 包含此次函数请求的 id、函数执行的环境变量等等</li>\n<li>「副作用」： 云函数执行可能调用外部服务，如数据库、对象存储、数据监控</li>\n<li>「返回值」： 即 HTTP 响应如 {retcode:0,msg:\"ok\"}</li>\n</ol>\n<p>阿 J 还了解到根据一定配置部署完云函数之后，云平台会给你一个 URL，通过访问这个 URL 就可以「触发」对应云函数的执行，得到结果。</p>\n<h2 id=\"▎ngw-serverless-同构直出方案\"><a href=\"#%E2%96%8Engw-serverless-%E5%90%8C%E6%9E%84%E7%9B%B4%E5%87%BA%E6%96%B9%E6%A1%88\" aria-label=\"▎ngw serverless 同构直出方案 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>▎<strong>NGW Serverless 同构直出方案</strong></h2>\n<p>正当阿 J 着手进行 Serverless 直出开发的时候，他猛然发现，Serverless 环境下跟原有的直出环境有较大出入，原有的直出环境是这样的：</p>\n<ol>\n<li>原方案直出是使用 TSW 执行 Koa App 的方式进行直出的，这意味着原方案需要监听端口而不是作为函数来运行，这个要怎么处理？</li>\n<li>老业务能不能做到无缝迁移到云函数？ 能不能做到新直出方案兼容老直出方案？</li>\n<li>云函数怎么做到工程化打包发布，接入到团队现有的 CI 流程中？</li>\n<li>原方案可以做本地调试，而云函数直出怎么做本地调试？</li>\n<li>云函数发布后，会得到一个 URL，那么这个 URL 要怎么接入我们的业务域名下？</li>\n</ol>\n<h3 id=\"工程化打包\"><a href=\"#%E5%B7%A5%E7%A8%8B%E5%8C%96%E6%89%93%E5%8C%85\" aria-label=\"工程化打包 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><strong>工程化打包</strong></h3>\n<p>除去前端 webpack 打包之外，对于 Serverless 云函数平台，我们还得在原来的打包产物基础上再做一些操作，其核心在于「打包为 zip 上传到云函数」，如下图所示：</p>\n<p><img src=\"https://img.serverlesscloud.cn/2020114/1578992526007-16e6e6a4c7f54ffb.png\" alt=\"云函数打包图示\"></p>\n<p>从图示中可以看到，打包部署的流程由「CLI 工具」承担，原因是为了提供命令式的部署原语，方便 CI 接入。</p>\n<h3 id=\"serverless-下的同构环境\"><a href=\"#serverless-%E4%B8%8B%E7%9A%84%E5%90%8C%E6%9E%84%E7%8E%AF%E5%A2%83\" aria-label=\"serverless 下的同构环境 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><strong>Serverless 下的同构环境</strong></h3>\n<p>阿 J 考虑到原先业务的直出方案采用 TSW 来做，但是在 Serverless 下，我们不能把 TSW 搬进云函数里执行，而是抽取了其中我们需要的组件出来，如 ajax 发送请求、监控上报、日志 logger 等常用组件，因为：</p>\n<ul>\n<li>方便老业务无缝迁移到云函数直出，解决直出业务的运维痛点</li>\n<li>TSW 很大，压缩后近 20 MB，解压出来大很多，不利于云函数的性能</li>\n</ul>\n<p>除此之外，还要自己去实现 window.REQUEST plug 类似这样的 TSW 全局注入的对象，因为旧有方案也依赖这些全局对象。</p>\n<h3 id=\"「流式」和「块式」\"><a href=\"#%E3%80%8C%E6%B5%81%E5%BC%8F%E3%80%8D%E5%92%8C%E3%80%8C%E5%9D%97%E5%BC%8F%E3%80%8D\" aria-label=\"「流式」和「块式」 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><strong>「流式」和「块式」</strong></h3>\n<p>原来的方案需要 Koa 监听本地端口才能提供服务，而云函数的出入参是块式的，Koa 的出入参是流式的，因此这里需要处理一下云函数的入参。阿 J 的做法是根据云函数入参来动态构造 http 的 IncomingMessage 和 ServerResponse 的实例，然后透传给 app.callback() 进行直出渲染，最后从 ServerResponse 里取得渲染结果构造为云函数返回值返回。</p>\n<h3 id=\"ngw-作网关转发\"><a href=\"#ngw-%E4%BD%9C%E7%BD%91%E5%85%B3%E8%BD%AC%E5%8F%91\" aria-label=\"ngw 作网关转发 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><strong>NGW 作网关转发</strong></h3>\n<p>阿 J 考虑到业务的可用性以及之前链路接入的痛苦，决定接入 NGW（Node Gateway）：</p>\n<p><img src=\"https://img.serverlesscloud.cn/2020114/1578992526186-16e6e6a4c7f54ffb.png\" alt=\"NGW 下的 Serverless 直出链路\"></p>\n<p>通过 NGW 可以做到：</p>\n<ol>\n<li>实现兜底逻辑： 云函数可能会 crash，这时候走静态页面接入机</li>\n<li>灰度逻辑： 直出上现网的过程中可以通过 NGW 的配置进行部分灰度测试</li>\n<li>链路日志收归： 长期以来，前端不好查具体的链路信息，现在有了 NGW 一切皆有可能</li>\n</ol>\n<h3 id=\"云函数本地调试\"><a href=\"#%E4%BA%91%E5%87%BD%E6%95%B0%E6%9C%AC%E5%9C%B0%E8%B0%83%E8%AF%95\" aria-label=\"云函数本地调试 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><strong>云函数本地调试</strong></h3>\n<p>云函数的无状态模型使得其非常易于进行本地调试，我们只需要在本地构造函数的入参、上下文即可直接进行直出调试了，阿 J 在实际实现中是通过本地起一个 Koa 服务监听端口，利用这个端口的请求来构造入参、上下文，最后传入函数执行结果，返回到前端显示。</p>\n<h3 id=\"同构直出过程\"><a href=\"#%E5%90%8C%E6%9E%84%E7%9B%B4%E5%87%BA%E8%BF%87%E7%A8%8B\" aria-label=\"同构直出过程 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><strong>同构直出过程</strong></h3>\n<p>在最后，阿 J 完成了 Serverless 直出方案，其直出过程如下图所示：</p>\n<p><img src=\"https://img.serverlesscloud.cn/2020114/1578992525525-16e6e6a4c7f54ffb.png\" alt=\"新方案下的同构直出三步\"></p>\n<ul>\n<li>「Init」： 初始化云函数环境、接受并处理云函数的入参</li>\n<li>「Koa」： React 同构业务逻辑以 Koa App 的形式体现</li>\n<li>「Clear」： 清理云函数环境、处理 Koa Response 返回直出结果</li>\n</ul>\n<p>特别需要提出的一点是，其中的 Koa 其实就是原方案的打包结果，新方案在此基础上作了一些环境迁移、重写，使其可以在云函数环境下执行渲染。</p>\n<h3 id=\"云函数的性能瓶颈和优化\"><a href=\"#%E4%BA%91%E5%87%BD%E6%95%B0%E7%9A%84%E6%80%A7%E8%83%BD%E7%93%B6%E9%A2%88%E5%92%8C%E4%BC%98%E5%8C%96\" aria-label=\"云函数的性能瓶颈和优化 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><strong>云函数的性能瓶颈和优化</strong></h3>\n<p>阿 J 在完成了新直出方案之后马上进行了压测，发现随着压测压力的增加，收包率会出现断崖式下跌，而且还发现部分函数执行耗费时间非常长，联系了云函数的同事看了下发现是「冷启动问题」，那什么是冷启动？</p>\n<p>从云函数的架构中可以看到，云函数触发后并不是马上执行，它需要一个环境初始化的过程，这种启动叫做冷启动；还有种情况是，这次请求的函数执行之后马上接到下一次请求，这时候就不用重新初始化云函数环境，而是直接启动，这种称谓热启动。</p>\n<p><img src=\"https://img.serverlesscloud.cn/2020114/1578992525929-16e6e6a4c7f54ffb.png\" alt=\"压测云函数 执行时间分布图\"></p>\n<p><img src=\"https://img.serverlesscloud.cn/2020114/1578992525843-16e6e6a4c7f54ffb.png\" alt=\"收包率优化前后（右边为优化后）\"></p>\n<p>冷启动问题在压力低的情况下不明显，但是在高并发的情况下就会额外影响回包了，这里SCF 的同事进行了优化：提高最小实例数，减少冷启动，最小实例越多就越能扛住瞬时并发，优化效果如上图右边所示。</p>\n<p>此外我们还发现了内存的问题，这里联系了 SCF 的同事进行了 Node 内存模型的相关优化，优化后，已基本不存在 4xx 的问题。</p>\n<p>（业务中的内存使用也可以进行优化，要避免 JS 内存泄漏）</p>\n<p><img src=\"https://img.serverlesscloud.cn/2020114/1578992525531-16e6e6a4c7f54ffb.png\" alt=\"内存超限导致 4xx 问题，压测压力越大越多这种错误\"></p>\n<p><img src=\"https://img.serverlesscloud.cn/2020114/1578992525518-16e6e6a4c7f54ffb.png\" alt=\"内存模型优化后的表现\"></p>\n<p>到这一步，阿 J 终于初步完成了 Serverless 直出方案设计开发，并开始逐步在业务中使用推广。</p>\n<h3 id=\"现状和下一步计划\"><a href=\"#%E7%8E%B0%E7%8A%B6%E5%92%8C%E4%B8%8B%E4%B8%80%E6%AD%A5%E8%AE%A1%E5%88%92\" aria-label=\"现状和下一步计划 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><strong>现状和下一步计划</strong></h3>\n<p><img src=\"https://img.serverlesscloud.cn/2020114/1578992525524-16e6e6a4c7f54ffb.png\" alt=\"上线业务\"></p>\n<p>目前 NGW + Serverless SSR 已经应用到 NOW 直播、手 Q 附近、浏览器直播和手 Q 群送礼等多个项目中，实际业务开发中，Node 业务的部署和运维工作量降低了 80% 以上。</p>\n<p>阿 J 下一步的计划：</p>\n<ol>\n<li>完善的云函数版本管理；</li>\n<li>配合 webpack 进一步优化本地直出调试体验；</li>\n<li>配合腾讯云同事进一步优化云函数性能；</li>\n<li>完善 React Chunked 流式渲染方案，进一步提升首屏加载速度；</li>\n<li>完善 Node 服务云函数，计划做前端 BFF 方案；</li>\n<li>完善直出和链路日志收归，增强服务监控能力。</li>\n</ol>\n<blockquote>\n<p><strong>传送门：</strong></p>\n<ul>\n<li>GitHub: <a href=\"https://github.com/serverless/serverless/blob/master/README_CN.md\">github.com/serverless</a> </li>\n<li>官网：<a href=\"https://serverless.com/\">serverless.com</a></li>\n</ul>\n</blockquote>\n<p>欢迎访问：<a href=\"https://serverlesscloud.cn/\">Serverless 中文网</a>，您可以在 <a href=\"https://serverlesscloud.cn/best-practice\">最佳实践</a> 里体验更多关于 Serverless 应用的开发！</p>","tableOfContents":"<ul>\n<li><a href=\"/blog/2019-11-15-serverless-ssr/#%E2%96%8E%E7%9B%AE%E5%BD%95%EF%BC%9A\">▎目录：</a></li>\n<li>\n<p><a href=\"/blog/2019-11-15-serverless-ssr/#%E2%96%8E%E5%89%8D%E8%A8%80\">▎前言</a></p>\n<ul>\n<li><a href=\"/blog/2019-11-15-serverless-ssr/#serverless--ssr--\">Serverless + SSR = ?</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/blog/2019-11-15-serverless-ssr/#%E2%96%8Eserverless-%E7%9A%84%E6%BC%94%E8%BF%9B\">▎Serverless 的演进</a></p>\n<ul>\n<li><a href=\"/blog/2019-11-15-serverless-ssr/#%E4%BB%8E-iaas-%E5%88%B0-faas\">从 IaaS 到 FaaS</a></li>\n<li><a href=\"/blog/2019-11-15-serverless-ssr/#faas--baas-%E4%B8%8B%E7%9A%84-serverless\">FaaS + BaaS 下的 Serverless</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/blog/2019-11-15-serverless-ssr/#%E2%96%8Escf-%E4%BA%91%E5%87%BD%E6%95%B0%E5%BC%80%E5%8F%91\">▎SCF 云函数开发</a></p>\n<ul>\n<li><a href=\"/blog/2019-11-15-serverless-ssr/#%E4%BA%91%E5%87%BD%E6%95%B0%E6%89%A7%E8%A1%8C%E8%BF%87%E7%A8%8B\">云函数执行过程</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/blog/2019-11-15-serverless-ssr/#%E2%96%8Engw-serverless-%E5%90%8C%E6%9E%84%E7%9B%B4%E5%87%BA%E6%96%B9%E6%A1%88\">▎NGW Serverless 同构直出方案</a></p>\n<ul>\n<li><a href=\"/blog/2019-11-15-serverless-ssr/#%E5%B7%A5%E7%A8%8B%E5%8C%96%E6%89%93%E5%8C%85\">工程化打包</a></li>\n<li><a href=\"/blog/2019-11-15-serverless-ssr/#serverless-%E4%B8%8B%E7%9A%84%E5%90%8C%E6%9E%84%E7%8E%AF%E5%A2%83\">Serverless 下的同构环境</a></li>\n<li><a href=\"/blog/2019-11-15-serverless-ssr/#%E3%80%8C%E6%B5%81%E5%BC%8F%E3%80%8D%E5%92%8C%E3%80%8C%E5%9D%97%E5%BC%8F%E3%80%8D\">「流式」和「块式」</a></li>\n<li><a href=\"/blog/2019-11-15-serverless-ssr/#ngw-%E4%BD%9C%E7%BD%91%E5%85%B3%E8%BD%AC%E5%8F%91\">NGW 作网关转发</a></li>\n<li><a href=\"/blog/2019-11-15-serverless-ssr/#%E4%BA%91%E5%87%BD%E6%95%B0%E6%9C%AC%E5%9C%B0%E8%B0%83%E8%AF%95\">云函数本地调试</a></li>\n<li><a href=\"/blog/2019-11-15-serverless-ssr/#%E5%90%8C%E6%9E%84%E7%9B%B4%E5%87%BA%E8%BF%87%E7%A8%8B\">同构直出过程</a></li>\n<li><a href=\"/blog/2019-11-15-serverless-ssr/#%E4%BA%91%E5%87%BD%E6%95%B0%E7%9A%84%E6%80%A7%E8%83%BD%E7%93%B6%E9%A2%88%E5%92%8C%E4%BC%98%E5%8C%96\">云函数的性能瓶颈和优化</a></li>\n<li><a href=\"/blog/2019-11-15-serverless-ssr/#%E7%8E%B0%E7%8A%B6%E5%92%8C%E4%B8%8B%E4%B8%80%E6%AD%A5%E8%AE%A1%E5%88%92\">现状和下一步计划</a></li>\n</ul>\n</li>\n</ul>"},"previousBlog":{"id":"1a202c41-4b54-56ad-a5cf-55c0deabe542","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/20191227/1577413467740-v2-b65fcb6a94208a494005fc0c40a99eb6_1200x500.jpg","authors":["Aceyclee"],"categories":["news","user-stories"],"date":"2019-11-19T00:00:00.000Z","title":"荐书 | Serverless 架构：从原理、设计到项目实战","description":"安利一下 Serverless 中文技术社区成员 Anycodes 的大作","authorslink":["https://www.zhihu.com/people/Aceyclee"],"translators":null,"translatorslink":null,"tags":["Serverless"],"keywords":"Serverless 原理,Serverless 设计,Serverless 项目实战","outdated":null},"wordCount":{"words":119,"sentences":15,"paragraphs":15},"fileAbsolutePath":"/opt/build/repo/content/blog/2019-11-19-anycodes-book.md","fields":{"slug":"/blog/2019-11-19-anycodes-book/","keywords":["serverless","无服务器","Serverless","开发者","架构","云计算","click"]}},"nextBlog":{"id":"82d71850-8dc8-5a6a-8f90-5a66609dae1c","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/qianyi/images/YHl6UWa9s61qzticncvwNpZulMqH7uWLsJ37JictvIBCibiaU5sDYicicxtKP9bu8PEWPCZyIlpfymbzmbw2geGvPaHw.jpg","authors":["Serverless 中文网"],"categories":["news"],"date":"2019-11-13T00:00:00.000Z","title":"Node 部署和运维工作量降低 80%，腾讯 NOW 直播是怎么做到的？","description":"本篇文章，将分享腾讯NOW直播在Serverless技术的探索实践。","authorslink":["https://github.com/jiangliu5267"],"translators":null,"translatorslink":null,"tags":["NGW","云函数"],"keywords":"Serverless, Serverless实践, Serverless SSR","outdated":null},"wordCount":{"words":505,"sentences":90,"paragraphs":90},"fileAbsolutePath":"/opt/build/repo/content/blog/2019-11-13-serverless-ssr-now.md","fields":{"slug":"/blog/2019-11-13-serverless-ssr-now/","keywords":["go","java","serverless","云函数","Serverless","分发","服务","Node","插件","Application","接入","配置"]}},"recommendBlogs":{"edges":[{"node":{"id":"665f9ce2-4451-59fd-bf98-1861789d3b3b","frontmatter":{"thumbnail":"https://s3-us-west-2.amazonaws.com/assets.blog.serverless.com/Serverless_logo.png","authors":["AndreaPasswater"],"categories":["guides-and-tutorials","engineering-culture"],"date":"2018-03-19T00:00:00.000Z","title":"如何为无服务器开放源代码项目做贡献","description":"想要为无服务器开放源代码项目做贡献？您可以遵循下面的指南。","authorslink":null,"translators":null,"translatorslink":null,"tags":null,"keywords":null,"outdated":null},"wordCount":{"words":96,"sentences":36,"paragraphs":36},"fileAbsolutePath":"/opt/build/repo/content/blog/2018-03-19-how-contribute-to-serverless-open-source.md","fields":{"slug":"/blog/2018-03-19-how-contribute-to-serverless-open-source/","keywords":["serverless","无服务器","serverless","github","插件","服务器","贡献","示例","blog","contribute"]}}},{"node":{"id":"a3e92579-65c3-5159-937c-32d18c5df7d7","frontmatter":{"thumbnail":"https://s3-us-west-2.amazonaws.com/assets.blog.serverless.com/why-not/why-not-header.png","authors":["AndreaPasswater"],"categories":["guides-and-tutorials","operations-and-observability","engineering-culture"],"date":"2018-03-21T00:00:00.000Z","title":"不适合选择无服务器的情境及原因","description":"无服务器既有优点也有缺点。那么，哪些情境下不适合选择无服务器？原因又是什么呢？","authorslink":null,"translators":null,"translatorslink":null,"tags":null,"keywords":null,"outdated":null},"wordCount":{"words":163,"sentences":43,"paragraphs":43},"fileAbsolutePath":"/opt/build/repo/content/blog/2018-03-21-when-why-not-use-serverless.md","fields":{"slug":"/blog/2018-03-21-when-why-not-use-serverless/","keywords":["faas","react","serverless","spa","无服务器","无服务器函数","无服务器架构","无服务器开发","服务器","twitter","serverless","blockquote","lang","script","en"]}}},{"node":{"id":"6a16520b-7886-582e-9182-64e50712d486","frontmatter":{"thumbnail":"https://s3-us-west-2.amazonaws.com/assets.blog.serverless.com/vendor+choice/serverless-data-portability.jpg","authors":["NickGottlieb"],"categories":["engineering-culture","guides-and-tutorials"],"date":"2018-06-20T00:00:00.000Z","title":"浅谈无服务器、数据锁定和供应商选择","description":"供应商选择是如今 IT 领导者需要考虑的最重要事项，而这一点可利用数据可移植性来实现。","authorslink":null,"translators":null,"translatorslink":null,"tags":null,"keywords":null,"outdated":null},"wordCount":{"words":205,"sentences":33,"paragraphs":33},"fileAbsolutePath":"/opt/build/repo/content/blog/2018-06-20-data-lockin-vendor-choice-portability.md","fields":{"slug":"/blog/2018-06-20-data-lockin-vendor-choice-portability/","keywords":["go","serverless","无服务器","无服务器架构","供应商","serverless","开发人员","数据","锁定","选择","服务"]}}},{"node":{"id":"94741abb-10ba-5db1-9756-cd1d573473fa","frontmatter":{"thumbnail":"https://s3-us-west-2.amazonaws.com/assets.blog.serverless.com/webstorm-ide/streamline-webstorm-serverless2.jpg","authors":["EslamHefnawy"],"categories":["guides-and-tutorials","engineering-culture"],"date":"2018-08-15T00:00:00.000Z","title":"如何使用 WebStorm 简化无服务器工作流程","description":"在本文中，我将和您分享如何使用 WebStorm 进行无服务器特定的 IDE 设置以及如何利用它来极大地加快无服务器工作流程。","authorslink":null,"translators":null,"translatorslink":null,"tags":null,"keywords":null,"outdated":null},"wordCount":{"words":234,"sentences":54,"paragraphs":54},"fileAbsolutePath":"/opt/build/repo/content/blog/2018-08-15-streamline-serverless-workflow-webstorm.md","fields":{"slug":"/blog/2018-08-15-streamline-serverless-workflow-webstorm/","keywords":["nodejs","serverless","无服务器","无服务器开发","serverless","WebStorm","webstorm","服务器","blog","assets"]}}},{"node":{"id":"713a0563-4bf9-5721-bacb-3b4ef609fe4a","frontmatter":{"thumbnail":"https://s3-us-west-2.amazonaws.com/assets.blog.serverless.com/camp-fire/camp-fire-housing-thumb.jpg","authors":["EricWyne"],"categories":["guides-and-tutorials","user-stories"],"date":"2018-12-05T00:00:00.000Z","title":"Serverless Twitter 机器人帮助为坎普山火受灾者安置住房","description":"加利福尼亚州的坎普山火致使数千人流离失所，为此，我构建了一个简单的 Serverless Twitter 机器人来帮助将受灾者安置在临时住房！","authorslink":["https://serverless.com/author/ericwyne/"],"translators":["Aceyclee"],"translatorslink":["zhihu.com/people/Aceyclee"],"tags":null,"keywords":null,"outdated":null},"wordCount":{"words":157,"sentences":26,"paragraphs":26},"fileAbsolutePath":"/opt/build/repo/content/blog/2018-12-05-serverless-twitter-camp-fire.md","fields":{"slug":"/blog/2018-12-05-serverless-twitter-camp-fire/","keywords":["serverless","无服务器","云函数","Serverless","org","住房","Twitter","函数","受灾","机器人","山火"]}}},{"node":{"id":"17c972d9-0583-51f6-9d5d-c2ba5f21b6a3","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/20191227/1577409288454-v2-577c2b21d600e3ea07f156f3e9d2d6b8_1200x500.jpg","authors":["Alfred Huang"],"categories":["guides-and-tutorials"],"date":"2019-08-21T00:00:00.000Z","title":"Serverless 的运行原理与组件架构","description":"本文重点探讨下开发者使用 Serverless 时经常遇到的一些问题，以及如何解决","authorslink":["https://zhuanlan.zhihu.com/ServerlessGo"],"translators":null,"translatorslink":null,"tags":["运行原理","serverless"],"keywords":"Serverless 运行原理,Serverless 组件架构","outdated":null},"wordCount":{"words":236,"sentences":33,"paragraphs":33},"fileAbsolutePath":"/opt/build/repo/content/blog/2019-08-21-serverless-operation-architecture.md","fields":{"slug":"/blog/2019-08-21-serverless-operation-architecture/","keywords":["koa","serverless","云函数","Serverless","用户","函数","请求","实例","形态","业务","serverlesscloud"]}}},{"node":{"id":"ae4fd2f8-515c-5aec-b584-38427ef33f7e","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/2020114/1578989800047-part-00492-780.jpg","authors":["Anycodes"],"categories":["guides-and-tutorials","user-stories"],"date":"2019-09-16T00:00:00.000Z","title":"突破传统 OJ 瓶颈，「判题姬」接入云函数","description":"通过 Serverless 实现在线编程","authorslink":["https://www.zhihu.com/people/liuyu-43-97"],"translators":null,"translatorslink":null,"tags":["在线编程","云函数"],"keywords":"Serverless 在线编程,Serverless OJ","outdated":null},"wordCount":{"words":169,"sentences":30,"paragraphs":30},"fileAbsolutePath":"/opt/build/repo/content/blog/2019-09-16-online-Judge.md","fields":{"slug":"/blog/2019-09-16-online-Judge/","keywords":["python","serverless","云函数","代码","函数","serverless"]}}},{"node":{"id":"545ab3d2-e14e-5cc2-8548-0e863eac942b","frontmatter":{"thumbnail":"https://s3-us-west-2.amazonaws.com/assets.blog.serverless.com/2019-10-deployment-best-practices/safeguard-header.png","authors":["FernandoMedinaCorey"],"categories":["guides-and-tutorials"],"date":"2019-10-14T00:00:00.000Z","title":"无服务器部署最佳实践","description":"了解部署无服务器应用时的一些最佳实践。","authorslink":null,"translators":null,"translatorslink":null,"tags":null,"keywords":null,"outdated":null},"wordCount":{"words":221,"sentences":46,"paragraphs":46},"fileAbsolutePath":"/opt/build/repo/content/blog/2019-10-14-serverless-deployment-best-practices.md","fields":{"slug":"/blog/2019-10-14-serverless-deployment-best-practices/","keywords":["serverless","无服务器","serverless","部署","服务器","开发人员","应用","安全措施","使用","函数"]}}}],"totalCount":31}},"pageContext":{"isCreatedByStatefulCreatePages":false,"blogId":"8fb3dfc3-b43e-5c5d-82d2-b4c0809761e3","previousBlogId":"1a202c41-4b54-56ad-a5cf-55c0deabe542","nextBlogId":"82d71850-8dc8-5a6a-8f90-5a66609dae1c","categories":["guides-and-tutorials"]}}}