{"componentChunkName":"component---src-templates-best-practice-detail-tsx","path":"/best-practice/2020-05-22-edu-ssr-interview","result":{"data":{"currentBlog":{"id":"61754f2f-f98a-5a66-867e-55d36c778712","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/2020522/1590145638649-%E8%85%BE%E8%AE%AF%E5%9C%A8%E7%BA%BF%E6%95%99%E8%82%B2%E5%89%AF%E6%9C%AC.jpg","authors":["蒋林源"],"categories":["best-practice"],"date":"2020-05-22T00:00:00.000Z","title":"Serverless SSR 技术在「腾讯在线教育」的实践","description":"腾讯在线教育团队基于腾讯云 Serverless 技术在其项目中应用 SSR","authorslink":["https://zhuanlan.zhihu.com/ServerlessGo"],"translators":null,"translatorslink":null,"tags":["Serverless SSR","腾讯在线教育"],"keywords":"Serverless,Serverless Framework,SSR","outdated":null},"wordCount":{"words":427,"sentences":67,"paragraphs":67},"fileAbsolutePath":"/opt/build/repo/content/best-practice/2020-05-22-edu-ssr-interview.md","fields":{"slug":"/best-practice/2020-05-22-edu-ssr-interview/","keywords":["serverless","ssr","云函数","serverlesscloud","函数"]},"html":"<p><img src=\"https://img.serverlesscloud.cn/2020522/1590142488439-%E8%85%BE%E8%AE%AF%E5%9C%A8%E7%BA%BF%E6%95%99%E8%82%B201.jpg\"></p>\n<h2 id=\"我们的团队\"><a href=\"#%E6%88%91%E4%BB%AC%E7%9A%84%E5%9B%A2%E9%98%9F\" 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<ul>\n<li>IMWeb 团队隶属腾讯公司，是国内最专业的前端团队之一。</li>\n<li>我们专注前端领域多年，负责过 QQ 资料、QQ 注册、QQ 群等亿级业务。</li>\n<li>目前聚焦于在线教育领域，精心打磨腾讯课堂、腾讯企鹅辅导及 ABCmouse 三大产品。</li>\n</ul>\n<h2 id=\"技术方案的摸索尝试\"><a href=\"#%E6%8A%80%E6%9C%AF%E6%96%B9%E6%A1%88%E7%9A%84%E6%91%B8%E7%B4%A2%E5%B0%9D%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>技术方案的摸索尝试</h2>\n<p>腾讯在线教育团队在传统的 Web 应用方向其实有很多技术方面的尝试，包括传统离线包、PWA 离线应用等，但是每个技术栈都有其优点与缺点，目前团队的技术方案对比如下：</p>\n<p><img src=\"https://img.serverlesscloud.cn/2020522/1590144485915-02%E5%89%AF%E6%9C%AC.jpg\"></p>\n<p>从上述表格可以看到，SSR 在首屏渲染以及 SEO 等方面都有不错的表现，这也是团队想在 SSR 技术方面深挖的初衷。SSR 方案选择上主要考虑:</p>\n<h3 id=\"1-ssr-应用的性能\"><a href=\"#1-ssr-%E5%BA%94%E7%94%A8%E7%9A%84%E6%80%A7%E8%83%BD\" aria-label=\"1 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>1. SSR 应用的性能</h3>\n<p>我们知道类 React 的应用的 SSR 的本质为在服务端调用 React 的 renderToString 方法将 React 组件渲染成 HTML 字符串，那么对于复杂的 SSR 应用来说，可能存在大量的 CPU 密集型计算，这并不是 Node 所擅长的领域，那么如何优化这方面的性能问题也是我们所关注的重点。\n同时因为离线包的环境依赖性（依赖 App），那么在传统的 Web 环境内是否可以有一套完整的解决方案来缓存相关的页面，从而提高首屏的性能，也是关注点之一。</p>\n<h3 id=\"2-ssr-的运维成本\"><a href=\"#2-ssr-%E7%9A%84%E8%BF%90%E7%BB%B4%E6%88%90%E6%9C%AC\" aria-label=\"2 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>2. SSR 的运维成本</h3>\n<p>对于大多数前端工程师来说，在服务的运维方面都可能有时并不那么得心应手，所以在服务的可用性方面，也是在做技术选型时所考虑的重点方向之一。</p>\n<p>根据以上两个方面，可以把我们的考虑因素总结为以下两个点：</p>\n<p><img src=\"https://img.serverlesscloud.cn/2020522/1590142914249-03%E5%89%AF%E6%9C%AC.jpg\"></p>\n<h2 id=\"腾讯在线教育团队-ssr-架构方案介绍\"><a href=\"#%E8%85%BE%E8%AE%AF%E5%9C%A8%E7%BA%BF%E6%95%99%E8%82%B2%E5%9B%A2%E9%98%9F-ssr-%E6%9E%B6%E6%9E%84%E6%96%B9%E6%A1%88%E4%BB%8B%E7%BB%8D\" aria-label=\"腾讯在线教育团队 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>腾讯在线教育团队 SSR 架构方案介绍</h2>\n<p>先从整体来了解下团队 SSR 技术的架构图：\n<img src=\"https://img.serverlesscloud.cn/2020522/1590142988895-04%E5%89%AF%E6%9C%AC.jpg\"></p>\n<p>接下来我们从以下几个方面来详细讲解下团队现有方案。</p>\n<h3 id=\"代码组织\"><a href=\"#%E4%BB%A3%E7%A0%81%E7%BB%84%E7%BB%87\" 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>代码组织</h3>\n<p>我们在 PC/H5 项目中均采用了同构的模式来构建 SSR 应用。\n<img src=\"https://img.serverlesscloud.cn/2020522/1590143026846-05%20%E5%89%AF%E6%9C%AC.jpg\"></p>\n<p>在同构的模式下面，业务开发者更关注与业务的功能本身，而不用太过关心运行时的问题，但是也要注意以下几个问题：</p>\n<ul>\n<li>传统浏览器中的常量使用，比如 window 、document 等。</li>\n<li>http 数据请求库必须同时支持服务端和客户端。</li>\n<li>合理使用 React 应用的生命周期。</li>\n<li>通过注入环境变量来区分当前运行时环境。</li>\n</ul>\n<h3 id=\"性能优化\"><a href=\"#%E6%80%A7%E8%83%BD%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>性能优化</h3>\n<ol>\n<li>接口动静分离</li>\n</ol>\n<p>我们知道页面的渲染一般要依赖于后端的相关数据，数据这里可以拆分为两个部分：动态数据与静态数据。\n静态数据指的是页面中不经常变更的数据，比如企鹅辅导产品产品的课程标题、课程描述等；\n动态数据指的是页面种与用户登录态相关的数据，比如课程是否已经购买、当前课程的折扣等。</p>\n<p>对接口做动静分离的意义在于，我们可以利用静态数据的时延性敏感度低的特性做缓存，在服务端利用静态数据渲染页面，之后在服务端利用动态数据做二次渲染，主要逻辑如下：</p>\n<p><img src=\"https://img.serverlesscloud.cn/2020522/1590143216336-06%E5%89%AF%E6%9C%AC.jpg\"></p>\n<p>我们利用 Redis 对静态数据渲染出来的页面做缓存，这样不仅可以加快 SSR 的渲染时间，同时可以提高单机的 QPS（<code class=\"language-text\">renderToString</code> 在一定意义上为 CPU 密集型操作）。</p>\n<ol start=\"2\">\n<li>浏览器中利用 PWA 做离线缓存</li>\n</ol>\n<p><img src=\"https://img.serverlesscloud.cn/2020522/1590143236043-15%E5%89%AF%E6%9C%AC.jpg\"></p>\n<p>同时在客户端中，我们可以利用 PWA 来做离线缓存，缓存静态数据直出的 HTML 页面，从而进一步的提高了直出页面的首屏性能。</p>\n<h3 id=\"运行上下文\"><a href=\"#%E8%BF%90%E8%A1%8C%E4%B8%8A%E4%B8%8B%E6%96%87\" 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>运行上下文</h3>\n<p>因为后端应用的运维复杂性、维护成本较高等问题，这里我们使用了 Serverless（腾讯云 SCF） 来做直出应用的部署。</p>\n<p>得益于 Serverless 架构模式的天然优势，我们不用在关心服务的运维、服务的扩容等问题，这也是我们为什么选择其的重要原因。</p>\n<p><img src=\"https://img.serverlesscloud.cn/2020522/1590143236868-15%E5%89%AF%E6%9C%AC.jpg\"></p>\n<p>如上图所示，我们 SSR 应用本质为一个 Node 应用，但是 SCF 的调用本质为一个 Event 事件，那么如何去兼容这两种模式呢？这里我们对自研 Node 框架（imserver）做了一层 Serverless 的封装，由于腾讯云 Serverless Framework 提供了很多标准化的接口，在封装自研 Node 框架（imserver） 的过程中也比较省心。同时在入口做了 Event 到 Koa Request Context 的兼容。</p>\n<p><img src=\"https://img.serverlesscloud.cn/2020522/1590144011766-09.png\"></p>\n<h2 id=\"ssr-的技术方案落地过程中遇到的问题\"><a href=\"#ssr-%E7%9A%84%E6%8A%80%E6%9C%AF%E6%96%B9%E6%A1%88%E8%90%BD%E5%9C%B0%E8%BF%87%E7%A8%8B%E4%B8%AD%E9%81%87%E5%88%B0%E7%9A%84%E9%97%AE%E9%A2%98\" aria-label=\"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>SSR 的技术方案落地过程中遇到的问题</h2>\n<h3 id=\"1-云函数拆分\"><a href=\"#1-%E4%BA%91%E5%87%BD%E6%95%B0%E6%8B%86%E5%88%86\" aria-label=\"1 云函数拆分 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>1. 云函数拆分</h3>\n<p>我们业务中有多个页面是通过 SSR 来实现的，采用了腾讯云云函数SCF 来做 SSR 之后，就会遇到一个问题：是合并到一个云函数中（业务级），还是拆分为多个云函数（页面级）。\n答案肯定是页面级会比较好，主要的优点如下：</p>\n<ul>\n<li>云函数互相独立，假设页面 A 云函数 挂掉，并不会影响到业务 B 的云函数。</li>\n<li>云函数包的大小会降低，因为 SCF 的冷启动过程，代码的包的大小对函数的冷启动时间也有一定的影响。</li>\n</ul>\n<p><img src=\"https://img.serverlesscloud.cn/2020522/1590143237084-15%E5%89%AF%E6%9C%AC.jpg\"></p>\n<p>这里我们基于当前的项目做了云函数的自动化构建，通过 .scfssr.json 的配置文件自动生成相应的云函数，对现有的开发是没有任何影响的，只是在构建的时候生成多个云函数，这样既降低了应用的维护成本，又降级了应用的开发成本。\n同时得益于云函数的构建过程，我们可以对单个云函数的代码做瘦身，通过对 package.json 中的依赖分析，剔除一些云函数容器中已经内置的工具包，以及对云函数所依赖的第三方包做相应的引入分析，去重冗余。</p>\n<h3 id=\"2-云函数发布优化\"><a href=\"#2-%E4%BA%91%E5%87%BD%E6%95%B0%E5%8F%91%E5%B8%83%E4%BC%98%E5%8C%96\" aria-label=\"2 云函数发布优化 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>2. 云函数发布优化</h3>\n<p><img src=\"https://img.serverlesscloud.cn/2020522/1590144095100-11%E5%89%AF%E6%9C%AC.jpg\"></p>\n<p>上图为我们设计的基于 SCF 的多云函数直出方案逻辑，可以看到当我们有版本更新的时候，其实发布流程还是比较复杂的，步骤也是相当繁琐：</p>\n<p><strong>配置过程：初始化进行一次</strong></p>\n<ul>\n<li>函数中创建 release、prohub 别名，可预先指向 $LATEST 版本。</li>\n<li>API 网关中创建服务 A，配置 API，指向函数 B release 别名，并发布到 API 服务的 release stage 中</li>\n<li>修改 API，指向函数 B prehub 别名，并发布到 API 服务的 prehub stage 中</li>\n<li>修改 API，指向函数 B 的默认流量，并发布到 API 服务的 dev stage 中；至此 API 网关的配置完成，后续无需在 API 网关上再次修改及发布配置</li>\n</ul>\n<p><strong>开发测试发布过程：持续开发测试发布上线</strong></p>\n<ul>\n<li>在函数上持续开发，一次发布版本 1，2，3</li>\n<li>需开发测试最近版本时候，配置$DEFAULT 别名指向 $LATEST 版本，可基于此版本持续开发修改，修改完成后发布版本。</li>\n<li>版本 3 可进入预发布环境时，配置 prehub 别名指向版本 3，在预发布环境可进行测试和体验</li>\n<li>版本 2 已经在预发布体验完成，可上线，将 release 别名灰度从版本 1 切换至版本 2 完成</li>\n<li>通过监控及日志查看灰度过程，版本 2 的流量是否正常上涨，版本 1 的流量是否正常下降；发布过程中的各版本错误情况以及总体错误情况</li>\n</ul>\n<p>那么如何去优化云函数的发布流程呢？这里我们基于腾讯云 Serverless 所提供的 Node SDK 做了一键发布 SCF 的工具：</p>\n<p><img src=\"https://img.serverlesscloud.cn/2020522/1590143237030-15%E5%89%AF%E6%9C%AC.jpg\"></p>\n<p>一个完整的 SCF SSR 应用生命周期如下：</p>\n<p><img src=\"https://img.serverlesscloud.cn/2020522/1590143236288-15%E5%89%AF%E6%9C%AC.jpg\"></p>\n<h2 id=\"腾讯云-serverless-ssr-方案的优点和基于自身业务的改进\"><a href=\"#%E8%85%BE%E8%AE%AF%E4%BA%91-serverless-ssr-%E6%96%B9%E6%A1%88%E7%9A%84%E4%BC%98%E7%82%B9%E5%92%8C%E5%9F%BA%E4%BA%8E%E8%87%AA%E8%BA%AB%E4%B8%9A%E5%8A%A1%E7%9A%84%E6%94%B9%E8%BF%9B\" 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>腾讯云 Serverless SSR 方案的优点和基于自身业务的改进</h2>\n<p>利用基于腾讯云云函数（SCF） 的 SSR 方案，节省了不少的服务运维成本，得益于腾讯云 Serverless  的日志系统，所有的单个 SSR 应用请求在日志平台都有完整的链路，定位问题与处理问题的速度都有了质的提升。</p>\n<p>因为 Serverless 的架构模式会存在冷启动时间较长的问题，虽然腾讯云云函数（SCF） 在这方面已经做了很多的技术优化，比如预启动容器等，但是我们在业务方面也可以尝试优化，我们在接入层做了服务的降级优化：</p>\n<p><img src=\"https://img.serverlesscloud.cn/2020522/1590143237225-15%E5%89%AF%E6%9C%AC.jpg\"></p>\n<p>后续的优化方案可以从灰度、多维降级等方面来做改进。</p>\n<h2 id=\"给想使用-ssr-技术的团队建议\"><a href=\"#%E7%BB%99%E6%83%B3%E4%BD%BF%E7%94%A8-ssr-%E6%8A%80%E6%9C%AF%E7%9A%84%E5%9B%A2%E9%98%9F%E5%BB%BA%E8%AE%AE\" aria-label=\"给想使用 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>给想使用 SSR 技术的团队建议</h2>\n<p>如果想追求更好的用户体验，建议针对核心业务做 SSR 优化，搭配 Serverless 来做服务的部署于运维，有了 Serverless 的丰富配套，我们可以不用像以前一样关心机器的运维和扩容，可以大大的提高团队生产力。</p>\n<p>同时，有了 SSR 之后，也建议大家可以完善自己业务的 devops 流程，将整个研发链路打通，从开发到测试再到部署都可以高效进行。</p>\n<p>最后也推荐大家使用业务接入层来做服务降级，提高 SSR 应用的可用性。</p>\n<hr>\n<div id='scf-deploy-iframe-or-md'></div>\n<hr>\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=\"/best-practice/2020-05-22-edu-ssr-interview/#%E6%88%91%E4%BB%AC%E7%9A%84%E5%9B%A2%E9%98%9F\">我们的团队</a></li>\n<li>\n<p><a href=\"/best-practice/2020-05-22-edu-ssr-interview/#%E6%8A%80%E6%9C%AF%E6%96%B9%E6%A1%88%E7%9A%84%E6%91%B8%E7%B4%A2%E5%B0%9D%E8%AF%95\">技术方案的摸索尝试</a></p>\n<ul>\n<li><a href=\"/best-practice/2020-05-22-edu-ssr-interview/#1-ssr-%E5%BA%94%E7%94%A8%E7%9A%84%E6%80%A7%E8%83%BD\">1. SSR 应用的性能</a></li>\n<li><a href=\"/best-practice/2020-05-22-edu-ssr-interview/#2-ssr-%E7%9A%84%E8%BF%90%E7%BB%B4%E6%88%90%E6%9C%AC\">2. SSR 的运维成本</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/best-practice/2020-05-22-edu-ssr-interview/#%E8%85%BE%E8%AE%AF%E5%9C%A8%E7%BA%BF%E6%95%99%E8%82%B2%E5%9B%A2%E9%98%9F-ssr-%E6%9E%B6%E6%9E%84%E6%96%B9%E6%A1%88%E4%BB%8B%E7%BB%8D\">腾讯在线教育团队 SSR 架构方案介绍</a></p>\n<ul>\n<li><a href=\"/best-practice/2020-05-22-edu-ssr-interview/#%E4%BB%A3%E7%A0%81%E7%BB%84%E7%BB%87\">代码组织</a></li>\n<li><a href=\"/best-practice/2020-05-22-edu-ssr-interview/#%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96\">性能优化</a></li>\n<li><a href=\"/best-practice/2020-05-22-edu-ssr-interview/#%E8%BF%90%E8%A1%8C%E4%B8%8A%E4%B8%8B%E6%96%87\">运行上下文</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/best-practice/2020-05-22-edu-ssr-interview/#ssr-%E7%9A%84%E6%8A%80%E6%9C%AF%E6%96%B9%E6%A1%88%E8%90%BD%E5%9C%B0%E8%BF%87%E7%A8%8B%E4%B8%AD%E9%81%87%E5%88%B0%E7%9A%84%E9%97%AE%E9%A2%98\">SSR 的技术方案落地过程中遇到的问题</a></p>\n<ul>\n<li><a href=\"/best-practice/2020-05-22-edu-ssr-interview/#1-%E4%BA%91%E5%87%BD%E6%95%B0%E6%8B%86%E5%88%86\">1. 云函数拆分</a></li>\n<li><a href=\"/best-practice/2020-05-22-edu-ssr-interview/#2-%E4%BA%91%E5%87%BD%E6%95%B0%E5%8F%91%E5%B8%83%E4%BC%98%E5%8C%96\">2. 云函数发布优化</a></li>\n</ul>\n</li>\n<li><a href=\"/best-practice/2020-05-22-edu-ssr-interview/#%E8%85%BE%E8%AE%AF%E4%BA%91-serverless-ssr-%E6%96%B9%E6%A1%88%E7%9A%84%E4%BC%98%E7%82%B9%E5%92%8C%E5%9F%BA%E4%BA%8E%E8%87%AA%E8%BA%AB%E4%B8%9A%E5%8A%A1%E7%9A%84%E6%94%B9%E8%BF%9B\">腾讯云 Serverless SSR 方案的优点和基于自身业务的改进</a></li>\n<li><a href=\"/best-practice/2020-05-22-edu-ssr-interview/#%E7%BB%99%E6%83%B3%E4%BD%BF%E7%94%A8-ssr-%E6%8A%80%E6%9C%AF%E7%9A%84%E5%9B%A2%E9%98%9F%E5%BB%BA%E8%AE%AE\">给想使用 SSR 技术的团队建议</a></li>\n</ul>"},"previousBlog":{"id":"e11d0eba-c207-538d-9f54-5407cd8e8054","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/202061/1591005673237-%E4%BA%A7%E5%93%81%E8%BF%81%E7%A7%BB%E5%AE%9E%E8%B7%B5.jpg","authors":["董文强"],"categories":["best-practice"],"date":"2020-06-01T00:00:00.000Z","title":"江娱互动「世界争霸」产品迁移至腾讯云云函数","description":"腾讯云云函数，以保障性能为前提，同时做到省事和省钱，成为江娱互动的不二选择。","authorslink":null,"translators":null,"translatorslink":null,"tags":["Serverless","云函数"],"keywords":"Serverless,scf,Serverless Framework","outdated":null},"wordCount":{"words":444,"sentences":62,"paragraphs":62},"fileAbsolutePath":"/opt/build/repo/content/best-practice/2020-06-01-scf-case.md","fields":{"slug":"/best-practice/2020-06-01-scf-case/","keywords":["php","serverless","云函数","函数","日志","网关","腾讯","serverlesscloud","需要","代码"]}},"nextBlog":{"id":"1c3ebfaf-a0c0-5d6b-9a27-f4499638e71f","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/2020520/1589974000735-%E6%9C%8D%E5%8A%A1%E6%8C%87%E5%8D%97%E5%89%AF%E6%9C%AC.jpg","authors":["Tianyun"],"categories":["best-practice"],"date":"2020-05-20T00:00:00.000Z","title":"腾讯云 Serverless HTTP 服务指南","description":"Serverless HTTP 服务是基于腾讯云 API 网关和云函数的能力，为互联网业务提供 0 配置、高可用、弹性扩展的 API 能力","authorslink":["https://zhuanlan.zhihu.com/ServerlessGo"],"translators":null,"translatorslink":null,"tags":["Serverless","Serverless HTTP"],"keywords":"Serverless,Serverless Framework,http,API","outdated":null},"wordCount":{"words":151,"sentences":20,"paragraphs":20},"fileAbsolutePath":"/opt/build/repo/content/best-practice/2020-05-20-serverless-http-introduction.md","fields":{"slug":"/best-practice/2020-05-20-serverless-http-introduction/","keywords":["go","node.js","serverless","无服务器","云函数","serverless","Serverless","serverlesscloud","网关"]}}},"pageContext":{"isCreatedByStatefulCreatePages":false,"blogId":"61754f2f-f98a-5a66-867e-55d36c778712","previousBlogId":"e11d0eba-c207-538d-9f54-5407cd8e8054","nextBlogId":"1c3ebfaf-a0c0-5d6b-9a27-f4499638e71f"}}}