更新日志

更快的 Carbon:页面加载更快、导航更轻、3D 模型更稳定

performanceplatformself-hosting

随着公司规模增长,Carbon 变得越来越慢,而大部分等待时间都花在应用反复请求同样的数据上。过去几天里,我们追踪了页面加载的时间到底花在哪里,并去掉了这些重复请求。

用 OpenTelemetry 追踪

这项工作从度量开始。Carbon 的各应用、后台作业和 3D 模型服务现在通过 OTLP 输出 OpenTelemetry 追踪,每个请求一条追踪,每个 loader、数据库调用、存储调用和作业步骤各一个 span。我们把自己的追踪发往 Axiom,下文每一项都是这样找到的。

自托管部署也能获得同样的追踪。在设置 OTEL_EXPORTER_OTLP_ENDPOINT 之前追踪不启用,任何 OTLP 后端都可以。Axiom 的配置见 .env.example。

页面之间的切换

过去点击一个标签页,会把它周围的所有内容一起重新加载。在某个物料的 BOM 上点一次,会产生约 68 个数据请求,其中只有约 10 个是真正要打开的那个页面。现在外围布局只在有内容变化时才重新加载,因此一次点击只取该页面,几乎不会带上别的东西。

链接也不再因为鼠标划过就预加载页面。现在从按下链接的那一刻才开始加载;通过记录的裸地址打开时,会直接进入它的详情。

打开 Carbon

登录后的首个页面在你做任何操作之前就会发出 686 个请求、下载 3.3 MB,其中大部分是物料、客户和供应商的整份列表。现在这些列表只需几个请求就能读完,现存量也只会在屏幕上出现物料选择器时才获取。

每个页面外围的框架(包含你所属的公司、权限和设置)过去需要 9 个请求,现在只需 1 个。翻译以缓存文件的形式下发,登录页的数据量从 427 KB 降到 1.2 KB。

记录页面

物料、生产订单、报价单、销售订单、供应商报价和库存页面过去是一个问题接一个问题地请求。现在它们合并请求,最多三步,而有些页面过去需要五步甚至更多。物料的「用于何处」列表和它的变更通知各只需一个请求。

批量操作对整个选择只读取一次所需数据,而不是每一行都重新读取。

保持最新的列表

列表和选择器会保留已经加载的内容,只在背后的记录发生变化时刷新。记录页面只监听该记录本身的变化。别人做出的修改无需刷新就会出现,ERP 和车间都是如此。

过账与创建生产订单

过账收货、发货、发票和付款,依据制造方法创建生产订单、发料以及重算生产订单,过去都要离开应用去调用一个独立函数,每次读取都要付一次网络往返。现在它们直接通过数据库连接在应用内运行。把制造方法复制到生产订单或报价行上,数据库调用减少约三分之一。

自托管部署不再为每个操作部署一个函数。只保留一个,用于搜索。架构页面展示了新的结构。

文档

文档页面过去要等待文件类型筛选器,文档较多的公司会慢到超时。现在页面不再等待它,页面和筛选器都由新的按公司建立的索引提供。

排程与计划

排程中的 Forecast 看板在大看板上也能流畅滚动。一次排程运行对每张生产订单的数据只读取一次,用一条语句写入该订单的工序,并且只写入日期发生变化的那部分工序。计划运行会跳过没有可计划内容的公司。

3D 模型

为装配指导书转换 CAD 模型占用的内存大幅减少,过去会失败的大模型现在也能完成。一块 5 MB、带 1,200 个孔的板件过去转换需要 6.2 GB 内存,现在只需 840 MB。

模型缩略图也由同一个服务绘制,取自查看器的相机角度。查看器工具栏上的相机按钮会按你当前的视角重绘缩略图。

用更少的资源做更多的事

Carbon 比一周前更快了,但距离我们计划达到的目标还很远。

如果给每个慢的部分单独配一个专用服务,我们可以更快到达那里:这里加个缓存、那里加个队列、搜索再单独一个存储。我们选择不这么做。Carbon 是开源的,在自己服务器上运行它的人,和在我们云上使用它的人同样重要。我们每增加一个服务,他们就多一样要部署、加固并持续维护的东西。

所以我们让 Carbon 的依赖清单保持简短,靠更好地使用现有组件来获得速度。上文每一项都来自更少的请求和更好的查询,而且它在到达我们云上的同一天就到达自托管部署。

改进

  • 页面中较慢的部分,例如物料的替代关系标签、报价单或采购订单的文件列表,会在页面之后出现,而不再拖住整页。
  • 在加载完成前离开的页面会停止剩余的工作。
  • PDF 引擎只在你打开 PDF 时加载,而不是每个页面都加载。
  • 审计日志的写入不再阻塞其他请求。
  • 套餐检查结果会记忆五分钟,而不是每个请求都重新读取。
  • 分页列表在显示第一页之前不再统计所有匹配行。
  • 刷新会话不再重新加载页面数据。
  • 通知摘要等后台作业只在有工作要做时才被唤醒。
  • 所有动画都遵循系统的「减少动态效果」设置,页面也可以缩放。
  • 补齐了 12 种语言中缺失的 1,824 条翻译。

修复

  • 加载失败的页面会就地显示错误,而不再替换整个应用。
  • 登录或切换公司后会落在你原本要去的页面。
  • 页面加载期间侧边栏不再闪烁。
  • 确定询价单或供应商报价时,要么全部完成,要么不做任何改动。