{"componentChunkName":"component---src-templates-best-practice-detail-tsx","path":"/best-practice/2021-02-04-scf-asynchronous","result":{"data":{"currentBlog":{"id":"78625ce9-87ce-5ba9-aa95-1fd16d80ffd6","frontmatter":{"thumbnail":"https://main.qcloudimg.com/raw/db9232e1ca6603964ba35e806f87ee80.jpg","authors":["陈涛"],"categories":["best-practice"],"date":"2021-02-04T00:00:00.000Z","title":"腾讯云 Serverless 重试策略配置能力解读","description":"平台的默认重试策略可满足大多数开发者错误重试的诉求，特殊场景下用户可选择自行配置","authorslink":null,"translators":null,"translatorslink":null,"tags":["Serverless","重试策略"],"keywords":null,"outdated":null},"wordCount":{"words":199,"sentences":40,"paragraphs":40},"fileAbsolutePath":"/opt/build/repo/content/best-practice/2021-02-04-scf-asynchronous.md","fields":{"slug":"/best-practice/2021-02-04-scf-asynchronous/","keywords":["serverless","云函数","重试","调用","错误","异步","函数","配置","并发","超限"]},"html":"<p>在函数调用的过程中，可能有多种原因导致函数调用失败。不同的<strong>错误类型</strong>以及<strong>调用方式（同步调用、异步调用）</strong>都会影响重试策略。实际业务生产中，有很多开发者对这里的策略有疑惑，本文将全面解读 Serverless 异步队列重试策略，并对多种使用场景提供相关的配置建议。</p>\n<h2 id=\"错误类型\"><a href=\"#%E9%94%99%E8%AF%AF%E7%B1%BB%E5%9E%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>错误类型</h2>\n<p>在函数调用的过程中，可能有多种原因导致函数调用失败。错误类型分为以下几类：</p>\n<h3 id=\"调用错误\"><a href=\"#%E8%B0%83%E7%94%A8%E9%94%99%E8%AF%AF\" 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>调用错误发生在函数实际执行前。以下情形均会产生调用错误：</p>\n<ul>\n<li><strong>调用请求错误</strong>。例如传入的 Event 数据结构过大、入参不符合要求、函数不存在等。</li>\n<li><strong>调用方错误</strong>。主要出现在调用方权限不足的情形。</li>\n<li><strong>超限错误</strong>。调用的并发数超出 <a href=\"https://cloud.tencent.com/document/product/583/11637\">最大并发数</a> 限制</li>\n</ul>\n<h3 id=\"运行错误\"><a href=\"#%E8%BF%90%E8%A1%8C%E9%94%99%E8%AF%AF\" 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>运行错误发生在函数实际运行中。运行错误有以下情形：</p>\n<ul>\n<li><strong>代码运行错误</strong>。这类错误出现在用户代码执行过程中，例如函数代码抛出异常，或者返回结果格式问题等。</li>\n<li><strong>Runtime 错误</strong>。函数运行过程中，Runtime 负责拉起用户代码并执行。Runtime 错误指的是 Runtime 发现并上报的错误，例如函数运行超时、代码语法报错等。</li>\n</ul>\n<h3 id=\"系统错误\"><a href=\"#%E7%B3%BB%E7%BB%9F%E9%94%99%E8%AF%AF\" 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>函数平台的错误，例如 internal error。</p>\n<h2 id=\"重试策略\"><a href=\"#%E9%87%8D%E8%AF%95%E7%AD%96%E7%95%A5\" 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>不同<strong>错误类型</strong>以及<strong>调用方式（同步调用、异步调用）</strong>都会影响重试策略。</p>\n<h3 id=\"同步调用\"><a href=\"#%E5%90%8C%E6%AD%A5%E8%B0%83%E7%94%A8\" 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>同步调用包含 <a href=\"https://cloud.tencent.com/document/product/583/18198\">云 API 触发器</a> 的同步调用、<a href=\"https://cloud.tencent.com/document/product/583/12513\">API 网关触发器</a> 及 <a href=\"https://cloud.tencent.com/document/product/583/17530\">CKafka 触发器</a>。\n由于同步调用的过程中，错误信息会直接返回给用户，所以在同步调用中发生错误时，平台不会自动重试，重试策略（是否重试、重试几次）均由调用方决定。</p>\n<h3 id=\"异步调用\"><a href=\"#%E5%BC%82%E6%AD%A5%E8%B0%83%E7%94%A8\" 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>异步调用包含 <a href=\"https://cloud.tencent.com/document/product/583/18198\">云 API 触发器</a> 的异步调用、<a href=\"https://cloud.tencent.com/document/product/583/9707\">COS 触发器</a>、<a href=\"https://cloud.tencent.com/document/product/583/9708\">定时触发器</a> 及 <a href=\"https://cloud.tencent.com/document/product/583/11517\">CMQ Topic 触发器</a> 等，具体触发器调用类型请参考相关触发器说明文档。\n在新版重试策略中，开发者可以根据业务诉求在函数配置中修改和自定义默认的【重试次数】，【最长等待时间】配置，该配置只适用于异步调用场景。</p>\n<p><img src=\"https://main.qcloudimg.com/raw/56d5cf707e9f1784b8e3619055a4d82f.png\">\n</p>\n<ul>\n<li><strong>重试次数：</strong>函数返回错误时云函数重试的次数，该参数只适用于<strong>运行错误</strong>的策略配置，默认配置为2次。</li>\n<li><strong>最长保留时间：</strong>云函数在异步事件队列中保留事件的最长时间，该参数适用于所有异步调用的重试配置，默认配置为6小时，最大长度支持10w条。</li>\n</ul>\n<p>异步调用发生各种错误类型的重试策略：</p>\n<ul>\n<li><strong>运行错误</strong>（含<strong>用户代码运行错误</strong>和 <strong>Runtime 错误</strong>）：当发生该类错误时，函数平台将默认重试两次或使用配置的重试次数，固定间隔1分钟。在自动重试的同时，新的触发事件仍可正常处理。如果您配置了死信队列，三次失败后的事件将传入死信队列，否则事件将被函数平台丢弃。</li>\n<li><strong>系统错误</strong>：当发生该类错误时，函数平台会根据您配置的最长等待时间持续重试（默认持续重试6小时），重试间隔按照指数退避增加到5分钟。如果您配置了死信队列，重试超过最长等待时间仍失败的事件会被发送到死信队列，由用户进行进一步处理，否则事件将被函数平台丢弃。</li>\n<li><strong>超限错误</strong>：当发生该类错误时，函数平台会根据您配置的最长等待时间持续重试（默认持续重试6小时），重试间隔为1分钟。如果您配置了死信队列，重试超过最长等待时间仍失败的事件会被发送到死信队列，由用户进行进一步处理，否则事件将被函数平台丢弃。</li>\n<li><strong>调用请求错误</strong>和<strong>调用方错误</strong>：当发生该类错误时，除了<strong>超限错误</strong>，平台将不会对该类其他错误进行重试，因为其他请求错误即便重试也不会成功。</li>\n</ul>\n<h2 id=\"错误重试配置建议\"><a href=\"#%E9%94%99%E8%AF%AF%E9%87%8D%E8%AF%95%E9%85%8D%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<ul>\n<li><strong>一般使用场景</strong>：\n一般使用场景下，推荐默认配置即可满足大多数错误情况下的重试诉求，无需进行任何修改即可放心使用。</li>\n<li><strong>对代码重入较敏感</strong>：\n对代码重入较敏感的场景，建议将重试次数调整为 0 即代码报错不会重试。</li>\n<li><strong>对事件处理实效性较高</strong>：\n在事件处理实效性要求较高的场景下，并在一定时间范围内进行重试的场景下，可配置事件最长保留事件来及时淘汰过期事件。保证错误重试的实效性。</li>\n<li><strong>并发超限场景</strong>：\n并发超限（ResourceLimitReached）指云函数 SCF 在同一时刻执行的并发数超过并发配额导致的函数报错。并发超限分为同步调用、异步调用两种情况。\n异步调用并发超限时其处理逻辑由云函数 SCF 进行自动重试，在保留时间内并发超限不会导致如何数据丢弃。通常情况下异步调用的并发超限用户无需进行任何操作，在设定的最长等待时间内，函数平台会自动对并发超限错误进行重试。异步调用中，如对实效性比较敏感可以通过配置保留并发来减少或降低超限对业务系统的影响，数据较重要可配置死信队列兜底。\n同步调用的过程中，错误信息会直接返回给用户。</li>\n</ul>\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>目前重试可配置已全量开放，通过重试策略配置的能力，可根据业务需求自行配置重试策略。平台的默认重试策略可满足大多数开发者错误重试的诉求，更多异步队列重试配置能力建设请关注微信号或<a href=\"https://cloud.tencent.com/document/product/583/41138\">官网产品动态</a>。</p>\n<hr>\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>\n<p><a href=\"/best-practice/2021-02-04-scf-asynchronous/#%E9%94%99%E8%AF%AF%E7%B1%BB%E5%9E%8B\">错误类型</a></p>\n<ul>\n<li><a href=\"/best-practice/2021-02-04-scf-asynchronous/#%E8%B0%83%E7%94%A8%E9%94%99%E8%AF%AF\">调用错误</a></li>\n<li><a href=\"/best-practice/2021-02-04-scf-asynchronous/#%E8%BF%90%E8%A1%8C%E9%94%99%E8%AF%AF\">运行错误</a></li>\n<li><a href=\"/best-practice/2021-02-04-scf-asynchronous/#%E7%B3%BB%E7%BB%9F%E9%94%99%E8%AF%AF\">系统错误</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/best-practice/2021-02-04-scf-asynchronous/#%E9%87%8D%E8%AF%95%E7%AD%96%E7%95%A5\">重试策略</a></p>\n<ul>\n<li><a href=\"/best-practice/2021-02-04-scf-asynchronous/#%E5%90%8C%E6%AD%A5%E8%B0%83%E7%94%A8\">同步调用</a></li>\n<li><a href=\"/best-practice/2021-02-04-scf-asynchronous/#%E5%BC%82%E6%AD%A5%E8%B0%83%E7%94%A8\">异步调用</a></li>\n</ul>\n</li>\n<li><a href=\"/best-practice/2021-02-04-scf-asynchronous/#%E9%94%99%E8%AF%AF%E9%87%8D%E8%AF%95%E9%85%8D%E7%BD%AE%E5%BB%BA%E8%AE%AE\">错误重试配置建议</a></li>\n<li><a href=\"/best-practice/2021-02-04-scf-asynchronous/#%E6%80%BB%E7%BB%93\">总结</a></li>\n</ul>"},"previousBlog":{"id":"3717c513-52f7-54cd-9f34-e7f2a52dd587","frontmatter":{"thumbnail":"https://main.qcloudimg.com/raw/238c88435e45de91ad4475f6e085c2a6.jpg","authors":["李啸川"],"categories":["best-practice"],"date":"2021-02-08T00:00:00.000Z","title":"解锁长时重计算：云函数首创异步执行模式","description":"可用于 2K4K 音视频处理、ETL 数据批处理、机器学习及 AI 推理等单任务重计算等场景","authorslink":null,"translators":null,"translatorslink":null,"tags":["Serverless","异步执行"],"keywords":null,"outdated":null},"wordCount":{"words":117,"sentences":35,"paragraphs":35},"fileAbsolutePath":"/opt/build/repo/content/best-practice/2021-02-08-asynchronous-execution.md","fields":{"slug":"/best-practice/2021-02-08-asynchronous-execution/","keywords":["serverless","云函数","云原生","函数","执行","异步","同步","serverless","模式","调用"]}},"nextBlog":{"id":"c8f89c32-4c6b-51ea-bdca-cb1e94da9320","frontmatter":{"thumbnail":"https://main.qcloudimg.com/raw/a55d114094dc0d965c1dcaa4f70787fb.jpg","authors":["April"],"categories":["best-practice"],"date":"2021-01-29T00:00:00.000Z","title":"使用 Serverless Wordpress 快速建站，只需三步","description":"首次部署可免费领取 35 元资源代金券！","authorslink":null,"translators":null,"translatorslink":null,"tags":["Serverless","WordPress"],"keywords":null,"outdated":null},"wordCount":{"words":226,"sentences":37,"paragraphs":37},"fileAbsolutePath":"/opt/build/repo/content/best-practice/2021-01-29-sf-wordpress.md","fields":{"slug":"/best-practice/2021-01-29-sf-wordpress/","keywords":["serverless","云函数","Serverless","Wordpress","serverless","部署","tencent","存储"]}}},"pageContext":{"isCreatedByStatefulCreatePages":false,"blogId":"78625ce9-87ce-5ba9-aa95-1fd16d80ffd6","previousBlogId":"3717c513-52f7-54cd-9f34-e7f2a52dd587","nextBlogId":"c8f89c32-4c6b-51ea-bdca-cb1e94da9320"}}}