2021-10-28 SAP Spartacus SSR 性能方面的一些学习笔记-阿里云开发者社区

开发者社区> -开发者助手-> 正文

2021-10-28 SAP Spartacus SSR 性能方面的一些学习笔记

简介: 2021-10-28 SAP Spartacus SSR 性能方面的一些学习笔记
+关注继续查看

如果客户已经拥有 CDN 缓存,可以不启用 cache:true, cacheSize:xxx 。 这种内存缓存功能仅适用于没有生产就绪 CDN 的简单店面。也就是说,如果客户没有任何外部缓存服务(akamai / cloudflare / 其他),他们可以尝试,至少暂时,使用 SSR 服务内存缓存和 cache: true (最好也使用 cacheSize)。


concurrency 值设置得过大也不合适,这样会导致额外的性能下降。当太多请求同时命中一个 Pod 时,请求可能会超时。


我们引入了一个数组,用来记住 callbacks.


我们仅在渲染完成或 maxRenderTime 到达时清除数组。


如果单个 URL 的渲染任务花费大量时间(例如一分钟),则对该 URL 的所有请求显然都会超时。 但是我们将存储它们的回调直到 maxRenderTime 过去。 这意味着对于 1.5 分钟,数组可能会随着单个 URL 的增长而增长。 只有在 1.5 分钟后,我们才放弃并清除数组。 您可以同时渲染 50 个 URL。

我们可以在补丁中潜在地改进/优化:立即从数组中删除任何超时回调。 [由于所需额外重构的复杂性,我们决定不这样做]。

除此之外,根据流量,增加 Pod 中的内存限制可能会有所帮助。

此外,如果渲染任务真的(由于任何原因)“永远”挂起,无论如何都可能导致内存泄漏。


请注意 concurrency: 50(在 SsrOptimizationOptions 中)意味着 OptimizedSsrEngine 最多将执行 50 个并行渲染任务。

启用 reuseCurrentRendering,这意味着:一次最多可以渲染 50 个不同的 URL(不管并行请求的数量)。

这意味着:如果您一次发送 51 个或更多不同 URL 的并行请求,则第 51 个 URL(以及更多)的请求将立即回退到 CSR。 这是设计使然。


此外,如果您启用 debug:true,那么您将看到控制台消息 CSR fallback: Concurrency limit exceeded (edited)


一般来说,并发请求越多,无论是否缓存 OCC,平均响应越慢。


当 OCC 响应没有被缓存时,PDP 的 SSR 响应时间可能会有所不同,但当只有 1 个并发请求时,Maximum 甚至可以达到 7 秒。


与未缓存 OCC 时相比,缓存 OCC 时 SSR 响应时间平均快约 3 秒。


如果 OCC 未缓存,但使用静态基站配置而不是动态配置 - 平均响应时间更快,例如 从 1 到 15 个并发请求,我们使用静态 basesite 配置节省了 0.1-0.5 秒


理想情况下,如果可能,尽量避免 SSR 服务器过载。 相反,您应该在 SSR 之前设置一个带有缓存的 CDN。 并且您应该巧妙地对缓存进行部分预热,这样 SSR 服务器就不会因为所有预热请求而立即受到攻击。 缓存失效和重新预热也应该在某些部分巧妙地发生。


给 SSR 添加 OCC API 本地缓存用于测试的代码:

// global static reference - so it's shared among all rendered apps in SSR:
const CACHE = new Map<string, any>();

@Injectable()
export class CustomCacheInterceptor implements HttpInterceptor {

  intercept(
    request: HttpRequest<unknown>,
    next: HttpHandler
  ): Observable<HttpEvent<unknown>> {
    const { method, urlWithParams } = request;

    if (!['GET', 'HEAD'].includes(method)) {
      console.log('🙁 CANNOT cache:', method, urlWithParams);
      return next.handle(request);
    }

    const cached = CACHE.get(`${method}_${urlWithParams}`);
    if (cached) {
      return of(cached);
    }
    console.log('ADD to cache:', method, urlWithParams);

    return next.handle(request).pipe(
      switchMap((response) => {
        if (
          response.type === HttpEventType.Response &&
          response instanceof HttpResponse &&
          response.status >= 200 &&
          response.status < 400
        ) {
          CACHE.set(`${method}_${urlWithParams}`, response);
        }

        return of(response);
      })
    );
  }
}

image.png

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【译】深入分析Spark UDF的性能
这篇博客会阐述一份关于Apache Spark的在Scala UDF、 PySpark UDF 和PySpark Pandas UDF之间的性能评测报告。
1351 0
解密阿里云大规模深度学习性能优化实践
近日,斯坦福大学公布了最新的 DAWNBench 深度学习榜单,这是人工智能领域最权威的竞赛之一,是衡量深度学习优化策略、模型架构、软件框架、云和硬件等综合解决方案实力的标准之一。
1893 0
工欲善其事必先利其器SecureCRT+VMware® Workstation_学习笔记
时间:2017.12.31作者:李强参考:man,info,magedu讲义,万能的internet实验环境:VMware® Workstation 12 Pro ,Centos 6.9,Centos 7.4,SecureCRT Version 8.1.4声明:以下英文纯属个人翻译,英文B级,欢迎纠正,以下内容纯属个人理解,并没有对错,只是参考,盗版不纠,才能有限,希望不误人子弟为好。
735 0
2010年SQLite3学习笔记之四(性能优化篇)
SQLite3性能优化 2010年SQLite3学习笔记之四(性能优化篇) 引言: 小老虎多多的SQLite3性能优化的学习笔记。 SQLite3性能调整主要通过pragma指令来实现。 比如调整:空间释放、磁盘同步、Cache大小等。
967 0
基于英特尔® 优化分析包(OAP)的 Spark 性能优化方案
Spark SQL 作为 Spark 用来处理结构化数据的一个基本模块,已经成为多数企业构建大数据应用的重要选择。但是,在大规模连接(Join)、聚合(Aggregate)等工作负载下,Spark 性能会面临稳定性和性能方面的挑战。
487 0
2450
文章
0
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载