{"componentChunkName":"component---src-templates-best-practice-detail-tsx","path":"/best-practice/2020-12-30-scf-concurrency-control","result":{"data":{"currentBlog":{"id":"57be3d6e-1cba-5083-8dcf-647ede3ab15a","frontmatter":{"thumbnail":"https://main.qcloudimg.com/raw/f1c0252cbf776c2639c323348cced6f1.jpg","authors":["Alfred"],"categories":["best-practice"],"date":"2020-12-30T00:00:00.000Z","title":"腾讯云 Serverless 云函数并发管理能力解读","description":"提供多层次的并发配额管理能力，用户可获得更强的函数并发管理控制的权限，无需等待即可快速调整业务并发","authorslink":null,"translators":null,"translatorslink":null,"tags":["Serverless","并发管理"],"keywords":null,"outdated":null},"wordCount":{"words":270,"sentences":48,"paragraphs":48},"fileAbsolutePath":"/opt/build/repo/content/best-practice/2020-12-30-scf-concurrency-control.md","fields":{"slug":"/best-practice/2020-12-30-scf-concurrency-control/","keywords":["serverless","云函数","并发","函数","额度","业务","账号","配额"]},"html":"<p>近期，腾讯云 Serverless 云函数发布了并发管理能力升级版，提供了 3 个维度的并发额度管理的功能。该功能究竟提供了哪些能力，有哪些使用场景？本文将为您全方位解读并发管理功能，并对多种使用场景提供配置建议。</p>\n<h2 id=\"背景介绍\"><a href=\"#%E8%83%8C%E6%99%AF%E4%BB%8B%E7%BB%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>背景介绍</h2>\n<p>原先，创建一个函数，默认具有300的并发数量上限。针对小的低频业务，300 的并发值足够使用。但是遇到业务量上涨、支撑大型运营活动等大并发的情况，开发者就需要通过提工单联系平台方，申请提升函数并发额度。这样可能导致：</p>\n<ol>\n<li>每遇到一次大并发，就需要联系一次平台方来提升配额，时效性弱。 </li>\n<li>申请等待周期时会导致上涨的业务部分有损。</li>\n<li>在评估量级时，也可能出现评估不足，导致需要再次申请，低效。</li>\n</ol>\n<h2 id=\"并发能力升级\"><a href=\"#%E5%B9%B6%E5%8F%91%E8%83%BD%E5%8A%9B%E5%8D%87%E7%BA%A7\" 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>相对于原有的函数默认固定的并发值，本次上线的并发管理能力，有以下方面的优化：</p>\n<ol>\n<li>将单一函数的并发调整放开给了出来，用户可以自行来控制并发数。</li>\n<li>并发额度由单一的函数维度，移到了账号维度。</li>\n<li>账号下默认具有一定的并发额度，由账号下的函数所共享的，不需要单独为其中一个大并发的函数申请额度。</li>\n</ol>\n<p>因此，在当前的模式下，默认账号具有的 128000 MB的额度，可以供 128 MB配置内存函数启动运行1000个并发；在这种情况下，用户无需去寻找平台申请，就可以获得比调整前更高的一个并发额度，用于支撑上涨的业务。</p>\n<p><img src=\"https://main.qcloudimg.com/raw/4c936731e2c6f1588c683e982156571b.png\"></p>\n<h2 id=\"并发的处理\"><a href=\"#%E5%B9%B6%E5%8F%91%E7%9A%84%E5%A4%84%E7%90%86\" 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>由于账号级别的额度是在账号下的多个函数间共享的，在多个函数同时运行的情况下，因为流量突增、业务上涨导致并发增高的函数在占用完全部空闲额度后，可能会和平稳运行的函数之间产生冲突。</p>\n<p><strong>这种情况下，有两种解决方案：</strong></p>\n<p>一方面可以通过平台申请提升更高的账号额度，来满足上涨业务带来的并发上涨；</p>\n<p>另外一方面，也可以通过将部分额度分配给具体函数，来保障具体函数的运行可靠性。</p>\n<p>下面我将具体说一下第二种方式。举个例子，在同样的账号下，函数 A 提供 H5 页面用于秒杀的运营活动，函数 B 在进行后台的流式数据处理。在 B 函数启动了 300 并发进行业务处理时，运营活动会受限于 A 函数，最大仅能跑到 700 并发；而函数 A 的业务压力下，如果 B 函数也有业务量上涨，将无配额可用导致无法启动更多实例。</p>\n<p><img src=\"https://main.qcloudimg.com/raw/6a04aa0825e8df125f45262962327bba.png\"></p>\n<p>在上面的例子中，如果要保证 B 函数数据处理流程的可靠性，可以为这个函数设置到 350 的保留并发配额；此时，这个额度将从账号维度划给这个函数单独使用，而运营活动所使用的 A 函数将仅仅可以最大使用的 650 并发的额度。函数 B 在设置到 350 的保留并发额度后，在业务持续上升后，最大也仅仅可以使用到配置的这个额度，此时，就算是账号维度的额度仍然有剩余时，B 函数也无法去使用。</p>\n<p><img src=\"https://main.qcloudimg.com/raw/165d3ea454d4b8dca942a5b3e31abbfc.png\"></p>\n<p>通过保留额度的设置，一方面，我们可以对函数的运行进行保障，避免多个函数共享额度时，由于其他业务的函数占用导致本函数无法运行产生损失，另外一方面，保留配额也定义了函数的运行额度上限。</p>\n<p>因此，针对函数的并发管理控制，可以基于业务来进行更精细的控制，有以下三点建议：</p>\n<ol>\n<li>针对开发测试阶段的函数，由于请求量小，无业务压力，并发也极少，可以不配置保留额度而仅仅使用账号维度的共享额度；</li>\n<li>针对稳定运行的函数，并发通常是确定的，浮动范围也不会很大，这个时候可以给这个函数设置稍微有一点余量的保留额度，来保障函数的额度不受共享的影响；</li>\n<li>针对运营活动、有可能性突增并发的函数，可以利用账号维度的高额度，来充分利用和支撑业务爆发。</li>\n</ol>\n<p><img src=\"https://main.qcloudimg.com/raw/78c8be70f964bc7e40fccf774f5c0261.png\"></p>\n<p>当前预置额度的设置，是设置在函数的版本上，也是从账号维度的并发配额或函数上的保留额度中扣减下来的。</p>\n<p>通过设置预置额度可以预想启动所需量的并发实例，完成实例的初始化并等待事件的到来。针对函数的请求将不会有冷启动时间，直接就可以在已经完成准备、初始化完成的实例中得到运行。</p>\n<p>在时延敏感的业务，例如前端的 SSR 页面响应；或者是初始化时间较长的业务，例如 AI 推理的模型加载过程；这些场景下，通过给函数设置上一定的预置可以保障业务更好的运行。</p>\n<p>同时，预置的配额也不是实例并发的上限，在业务量上涨到超过已经预置的实例可以承载的时候，函数平台仍然会根据函数的保留配额或者是账号的配额，拉起更多的实例来支持业务运行。</p>\n<p><img src=\"https://main.qcloudimg.com/raw/38d19dd859b8c1ecfb98e8d0130c2c34.png\"></p>\n<h2 id=\"并发使用场景设置建议\"><a href=\"#%E5%B9%B6%E5%8F%91%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF%E8%AE%BE%E7%BD%AE%E5%BB%BA%E8%AE%AE\" 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>一个账号下有多个业务都在同时使用云函数进行支撑时，函数的并发配额就需要进行按需调度。根据不同的业务特性来进行合理合适的设置。</p>\n<p>例如有波峰波谷的前端业务，有平稳运行波动不大的数据处理业务，有偶尔才运行一次的定时运维任务，也有并发不大但是计算量重、计算时间长的视频处理业务；</p>\n<p>在这些业务中，根据重要性、是否接受一定损失来说，又有不同的区分：前端业务保障用户体验，要求加载速度快，但是可以有一定的错误容忍度；数据处理的要求高，不能接收延迟、波动或失败；定时运维任务偶尔运行，不用投入过多的关注，运行正常即可；而视频处理业务，可以接受按需调度，失败时能自动重试就行。</p>\n<p>根据不同的业务特性、容错额度、业务波动情况、时延要求，我们就可以按照不同的情况来进行不同的设置。上述几项业务中，并发设置有以下几点建议：</p>\n<ul>\n<li>对前端业务来说，要求加载速度快，但是有波峰波谷，这种情况我们就可以为函数配置一定量的预置额度，例如按最大使用量的60%来设置，但是同时不设置函数的保留额度，确保在高峰到来时能充分利用总配额；</li>\n<li>针对数据处理业务，波动不大但是容错低，我们可以为函数配置一定量的保留额度，确保不会有其他业务使用的共享额度导致数据处理业务的问题；</li>\n<li>运维任务定时运行，没有高要求，可以不做任何配置，使用账号维度的配额来处理就行；</li>\n<li>针对视频处理业务，计算量大，而且可以按需排队处理任务，我们设定好一定的保留额度，让业务跑满并发额度，充分利用好且控制好计算资源。</li>\n</ul>\n<p><img src=\"https://main.qcloudimg.com/raw/7c4c8576c0c69949f795df472f163d86.png\"></p>\n<p><img src=\"https://main.qcloudimg.com/raw/165d3ea454d4b8dca942a5b3e31abbfc.png\"></p>\n<p><img src=\"https://main.qcloudimg.com/raw/38d19dd859b8c1ecfb98e8d0130c2c34.png\"></p>\n<h2 id=\"保留配额另一种用法\"><a href=\"#%E4%BF%9D%E7%95%99%E9%85%8D%E9%A2%9D%E5%8F%A6%E4%B8%80%E7%A7%8D%E7%94%A8%E6%B3%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>保留配额还有另外一种用法——对业务的限制或关停。在有紧急事项发生，例如漏洞攻击、循环调用失控等情况出现时，为了避免有重大损失，可以通过设置保留配额，将额度控制在极小的值上来避免运行失控，甚至可以设置为 0 来关闭函数的运行。</p>\n<p><img src=\"https://main.qcloudimg.com/raw/224d3a2459d297800b41beea65bee6a4.png\"></p>\n<h2 id=\"内存和并发额度的关系\"><a href=\"#%E5%86%85%E5%AD%98%E5%92%8C%E5%B9%B6%E5%8F%91%E9%A2%9D%E5%BA%A6%E7%9A%84%E5%85%B3%E7%B3%BB\" 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>当前额度按内存进行计算，配置内存大的函数，并发运行时占用的额度多，而配置内存小的函数在多并发运行时占用的额度小；</p>\n<p>由于函数服务的资源用量计费项和函数的配置内存强相关，通过内存进行额度控制，一方面可以让我们尽量采用合适的内存来实现业务，另外一方面，针对整体的支出也可以进行有效的控制。</p>\n<p><img src=\"https://main.qcloudimg.com/raw/6a9ca742d216db39f8519a4b0c103905.png\"></p>\n<h2 id=\"总结\"><a href=\"#%E6%80%BB%E7%BB%93\" 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>通过提供多层次的并发配额管理能力，目前我们可以获得更强的函数并发管理控制的权限，无需再等待平台方的调整就可以自行根据业务需求快速调整。</p>\n<p>目前并发管理功能已经上线，函数可以配置保留并发，同时预置并发功能也处于内测阶段，欢迎大家申请试用。针对并发管理的更多场景、用法，也欢迎大家留言探讨和反馈。</p>\n<p><strong>试用申请链接：</strong> <a href=\"https://cloud.tencent.com/apply/p/j1fl01i6f2i\">https://cloud.tencent.com/apply/p/j1fl01i6f2i</a></p>\n<hr>\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-12-30-scf-concurrency-control/#%E8%83%8C%E6%99%AF%E4%BB%8B%E7%BB%8D\">背景介绍</a></li>\n<li><a href=\"/best-practice/2020-12-30-scf-concurrency-control/#%E5%B9%B6%E5%8F%91%E8%83%BD%E5%8A%9B%E5%8D%87%E7%BA%A7\">并发能力升级</a></li>\n<li><a href=\"/best-practice/2020-12-30-scf-concurrency-control/#%E5%B9%B6%E5%8F%91%E7%9A%84%E5%A4%84%E7%90%86\">并发的处理</a></li>\n<li><a href=\"/best-practice/2020-12-30-scf-concurrency-control/#%E5%B9%B6%E5%8F%91%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF%E8%AE%BE%E7%BD%AE%E5%BB%BA%E8%AE%AE\">并发使用场景设置建议</a></li>\n<li><a href=\"/best-practice/2020-12-30-scf-concurrency-control/#%E4%BF%9D%E7%95%99%E9%85%8D%E9%A2%9D%E5%8F%A6%E4%B8%80%E7%A7%8D%E7%94%A8%E6%B3%95\">保留配额另一种用法</a></li>\n<li><a href=\"/best-practice/2020-12-30-scf-concurrency-control/#%E5%86%85%E5%AD%98%E5%92%8C%E5%B9%B6%E5%8F%91%E9%A2%9D%E5%BA%A6%E7%9A%84%E5%85%B3%E7%B3%BB\">内存和并发额度的关系</a></li>\n<li><a href=\"/best-practice/2020-12-30-scf-concurrency-control/#%E6%80%BB%E7%BB%93\">总结</a></li>\n</ul>"},"previousBlog":{"id":"776e3baf-a065-5ca0-aafd-e3af9e050975","frontmatter":{"thumbnail":"https://main.qcloudimg.com/raw/007bbdc60ded777b71353a480bb6cb66.jpg","authors":["松鹅"],"categories":["best-practice"],"date":"2021-01-06T00:00:00.000Z","title":"再见，本地环境！腾讯云全球首发：Serverless 在线远程调试","description":"本文将以一段内存泄漏的代码为例，给大家展示如何使用在线调试功能定位和解决问题","authorslink":null,"translators":null,"translatorslink":null,"tags":["Serverless","在线调试"],"keywords":null,"outdated":null},"wordCount":{"words":110,"sentences":22,"paragraphs":22},"fileAbsolutePath":"/opt/build/repo/content/best-practice/2021-01-06-remote-debugging.md","fields":{"slug":"/best-practice/2021-01-06-remote-debugging/","keywords":["serverless","云函数","内存","快照","泄漏","调试"]}},"nextBlog":{"id":"68104300-1155-509a-8937-81f65ae71223","frontmatter":{"thumbnail":"https://main.qcloudimg.com/raw/2059609cef4b84710bda1e917ab015d7.png","authors":["April"],"categories":["best-practice"],"date":"2020-12-25T00:00:00.000Z","title":"不改一行代码！快速迁移 Koa 应用上云","description":"手把手教你部署 Koa 应用，快来一起实践吧！","authorslink":null,"translators":null,"translatorslink":null,"tags":["Serverless","Koa"],"keywords":null,"outdated":null},"wordCount":{"words":249,"sentences":41,"paragraphs":41},"fileAbsolutePath":"/opt/build/repo/content/best-practice/2020-12-25-serverless-koa.md","fields":{"slug":"/best-practice/2020-12-25-serverless-koa/","keywords":["serverless","ssr","Serverless","应用","部署","控制台","创建","tencent"]}}},"pageContext":{"isCreatedByStatefulCreatePages":false,"blogId":"57be3d6e-1cba-5083-8dcf-647ede3ab15a","previousBlogId":"776e3baf-a065-5ca0-aafd-e3af9e050975","nextBlogId":"68104300-1155-509a-8937-81f65ae71223"}}}