用途:用于调查或改进 Spree 6 性能,重点在 Store API 请求(目录读取、购物车写入、结账)与后台作业,而非通用 Rails 调优。
主要能力与做法: 先测量。加入 gem 'spree_opentelemetry',把 OTEL_EXPORTER_OTLP_ENDPOINT 指向 collector(本地 Jaeger:docker run --rm -p 16686:16686 -p 4318:4318 jaegertracing/jaeger:latest),可看到每个 Spree::Workflow、步骤、hook 与事件分发、webhook、网关调用的 span,以及 SQL 和 HTTP span。也可用 ActiveRecord::Base.logger 统计查询数,或接入 Skylight、Scout、New Relic、Datadog 等 APM。
购物车写入。购物车变更会运行 Spree.cart_recalculate_workflow,其中会刷新总额、重建配送方案、激活促销,并再次重建折扣与税。RecalculateTotals 在未下单购物车上每次都会调用 cart.tax_provider.estimate,外部税率服务每次写入至少被调用两次,应在 provider 内缓存估算并保持短超时;外部配送费率同样应缓存;hook 处理器要保持查询轻量,非必要工作交给异步事件订阅者(cart.updated)。不要在数据库事务内做网络 I/O,应使用 external_step。不要给 Spree::LineItem/Spree::Cart 加会触发重算的 after_save 回调。
目录读取。ResourceController#collection 已链式 includes 与 preload_associations_lazily,并用 Pagy 分页(默认 25、上限 100)。自定义端点或序列化器应模仿 ProductsController#scope_includes 的预加载形状;列表读取 product.default_variant 需预加载 :prices;variant.price_in 在已加载 prices 时复用,否则逐个查询;列表应预加载 primary_media。给序列化器加字段时要检查新关联是否预加载,控制器中覆盖 scope_includes/collection_includes,不要内联 includes。客户端只对屏幕需要的数据使用 expand=,用 fields= 精简负载。
HTTP 缓存。Store 目录控制器含 HttpCaching:访客得到 public 缓存(5 分钟,列表有 stale-while-revalidate)与 ETag,并按 Accept、x-spree-currency、x-spree-locale、x-spree-channel 变化;已登录客户为 private, no-store。CDN 需尊重这些头。自定义控制器在 index/show 调用 cache_collection/cache_resource。购物车、结账、账户端点必须不缓存。
搜索、图片与后台作业。默认数据库搜索对约 1 万商品以上会退化,可考虑 Meilisearch。商品每次提交会入队索引作业,批量导入后可执行 bin/rails spree:search:reindex。图片命名变体在 Spree::Config.product_image_variant_sizes 定义并在上传时预处理,应裁减不用的尺寸、把转换队列与结账隔离、并在 representations 前置 CDN。Spree.queues 可为事件、webhook、导入、图片、搜索等指定独立队列;Solid Queue 的 queue.yml 应把结账/支付/库存预留放前面,批量目录与图片放后面,保留末尾 "*"。CSV 导入受 SPREE_IMPORT_JOB_CONCURRENCY 限制。数据库连接池需不小于 RAILS_MAX_THREADS + JOB_THREADS。可在 /jobs 查看积压。
仪表盘与常见错误。React 管理后台使用 TanStack Query(默认 staleTime 60s、retry 1、不聚焦重取),插件中应通过 adminClient 按需 expand、复用查询键,慢页面通常是慢的 Admin API 端点,应在服务端追踪。常见错误包括:遍历变体未预加载 prices、外部税率/费率未缓存、事务或同步 hook 内发 HTTP、把所有队列留在 :default、访客目录流量无 CDN 或 CDN 去掉 x-spree-* 头、自定义端点使用 Spree::Product.all 而非按 current_store 作用域分页。
限制与进一步资料:具体性能收益、价格与平台未提供;更多内容见 node_modules/@spree/docs/dist 下的 observability、background_jobs、caching、cdn、search-filtering 等文档,相关技能包括 spree-workflows、spree-order-totals、spree-taxes、spree-deployment、spree-events-webhooks。