抛开供应商的宣讲材料,每一套 ERP 与电商的集成都属于两种架构之一。第一种,商城在请求时直接从 ERP 读取:已登录的买家打开商品页面,平台便在那一刻向 ERP 询问该客户的价格以及当前库存。Sana Commerce 正是这样构建的。第二种,连接器按计划或通过 webhook,把目录、价格和库存从 ERP 复制到电商平台自己的数据库中。商城随后提供这份副本。BigCommerce、Adobe Commerce 以及大多数平台都采用这种方式,由中间件在两套系统之间承接。
这两种我们都做。我们交付过从 Business Central 和 S/4HANA 实时读取价格的 Sana 商城,也构建过以中间件同步的 BigCommerce 店铺,由连接器让目录与 ERP 保持一致。抽象地说,没有哪一种是“正确答案”。它们的失败方式不同,成本不同,对某些业务显然合适,对另一些业务则悄然出错。这是一份诚实的对比。
精确定义这两种模型
最清晰的界定方式,是看“此刻这位客户为这件商品支付多少”这个答案,在页面渲染那一刻物理上存放在哪里。
在实时读取(real-time)模型中,答案存放在 ERP 里,商城在询问之前并不持有它。每一个已认证的价格、每一项库存数字、每一次信用核查,都是一次到权威数据源的往返。真相只有唯一一份副本,而商城从不拥有它。这就是我们在 Sana Commerce 语境中别处写过的 ERP 优先模式。
在中间件(同步)模型中,答案存放在电商数据库里,由连接器在更早时从 ERP 读取后写入。商城拥有一份副本。这份副本的新鲜程度,取决于最近一次触及它的同步。ERP 处于上游,并且在请求时已被排除在外。大多数 BigCommerce ERP 集成 就是这样构建的。
其余一切都源自这一处差异。请牢牢记住它,因为下文几乎每一项权衡,都只是数据存放位置带来的结果。
准确性:唯一真相来源对受管副本
实时读取在构造上就是准确的。如果价格在一秒前于 ERP 中变更,下一次页面渲染就会看到新价格,因为页面渲染本身就是那次查询。不存在任何一段时间窗,会让商城笃定地给出错误结果。对于 B2B 来说,价格往往因客户而异(合同价、阶梯折扣、协商后的覆盖价),而把合同价搞错就是一场账务纠纷,因此这是一项真实而被低估的优势。
中间件模型在两次同步之间是准确的,期间则会漂移。漂移窗口的大小是一种设计选择:由 webhook 驱动的连接器可以在数秒内推送价格变更,而每夜运行的目录任务则可能让你滞后长达一天。大多数真实系统是混合的,诚实的提法不是“它准不准”,而是“你最糟的滞后是多少,业务能否在这些特定字段上容忍它”。库存数在两次同步之间从 4 跳到 0,是典型的痛点,因为订购了那件幽灵库存的客户,要到履约时才会发现。
性能:ERP 在请求路径上,还是不在
这正是中间件模型完胜的地方。从你自己的数据库提供价格,或从它前面的缓存提供,既快又可预测。你可以在匿名浏览页面前放一层 CDN,完全不打扰 ERP。页面延迟与 ERP 今天“状态如何”解耦了。
实时读取把 ERP 的响应时间放到了页面的关键路径上。像 Sana 这样的平台用缓存和连接池极力缓解这一点,而对于典型的 B2B 目录(已认证买家在数百到一两千之间,而非数百万匿名会话),这并不是问题。但你的页面速度上限由 ERP 设定,如果 ERP 是一台负载沉重的本地部署机器,你就会感受到。缓解之道是架构上的克制:让匿名浏览页面保持可缓存,把实时往返保留给真正需要的时刻,比如已认证价格或加入购物车时的库存核查。
韧性:ERP 宕机时会发生什么
这是大多数评估会跳过的问题,也是在第二年咬得最狠的那一个。
在实时读取模型中,对于站点中依赖 ERP 读取的部分,ERP 是一个硬性依赖。如果 ERP 因维护停机或崩溃,已认证的价格与实时库存便会随之降级。优秀的实现会用缓存兜底和友好的提示来缓和这一点,但你无法假装商城是完全独立的,因为在架构上它并不是。对于与 ERP 耦合最深的功能,你商城的可用性受限于 ERP 的可用性。
在中间件模型中,ERP 宕机时商城仍继续提供它的副本。浏览、价格和已缓存的库存都照常工作。问题出在另一个方向:停机期间下的订单总得有个去处。构建良好的连接器会把它们排队,并在 ERP 恢复后投递,这意味着你的下单提交路径必须持久且幂等(下文详述)。构建糟糕的连接器会丢失它们,或者重复提交。解耦为你换来读取侧的韧性,同时把写入侧的排队问题交回给你。
客户专属定价:B2B 的关键所在
这单一需求决定的架构,比任何其他因素都多。在 B2B 中,价格往往是“谁在询问”的函数:合同定价、阶梯量价、特定收货地规则,以及销售团队在 ERP 中维护的促销覆盖价。
实时读取原生地处理这一点,因为客户上下文本身就是查询的一部分。你向 ERP 询问“这位客户、这件商品、今天”,便得到 ERP 会给出的答案,无需再重建一套定价引擎。中间件则必须把定价逻辑,或至少是解析后的价目表,复制进电商平台。对于少数几张固定价目表,这很简单。但对于一个深层的客户专属合同规则矩阵,要准确复制它(并在 ERP 规则每次变更时重新校验)就成了一个独立的项目,而它恰恰就是那种会漂移的第二套定价引擎。这是在合同密集的 B2B 中支持实时读取的最有力的单一论据,也是团队最常低估中间件构建工作量的地方。
成本与复杂度
两种模型都不是免费的,它们在不同的地方花掉你的预算。实时读取把成本集中在 ERP 连接器和 ERP 性能上:你需要 ERP 在网络负载下快速可靠地作答,这有时意味着你没有预先规划的 ERP 端调优或扩容。中间件把成本集中在连接器的数据管道上:同步任务、字段映射、冲突与失效逻辑,以及在同步漂移时告诉你的监控。中间件还增加了实时读取根本没有的运维面,也就是同步系统本身会崩溃、滞后或悄然停止,因此需要它自己的告警。反复出现的错误,是为连接器的构建做了预算,却忘了连接器永久性的运维税。
让中间件感觉像实时
大多数平台都是中间件平台,所以现实的问题通常不是“我如何避开中间件”,而是“在要紧之处,我如何让一个同步式商城表现得像实时的一样”。三种技术承担了大部分工作。
用显式失效而非仅靠过期来缓存。 基于时间的过期会保证滞后程度最多达到 TTL。更好的做法是让 ERP 的变更通过 webhook 主动使相关缓存条目失效,这样一次价格或库存变更便推送一次失效,而不是等计时器到点。过期随后成为兜底,而非主要机制。难点在于失效范围:单次合同价变更可能牵动许多计算出的条目,把波及范围把握准确才是真正的工程。
对敏感 SKU 在浏览时发起实时调用。 你不需要让一切都实时。识别出“搞错代价高昂”的字段与商品(合同价商品、低库存或按单生产的 SKU、任何受信用门控的项目),仅针对这些项、仅在它们出现的页面上,向 ERP 发起有针对性的实时调用。目录的其余部分保持缓存且快速。这是有选择地把实时读取模型的准确性,恰好借用到它物有所值的地方,往往就是恰当的混合方案。
幂等、持久的订单提交。 无论你用哪种模型读取,回写到 ERP 的写入路径都必须可安全重试。给每个订单一个稳定的幂等键,把提交持久地排队,并让 ERP 端的处理程序拒绝重复项,而不是再创建一张销售订单。正是这一点让你能在 ERP 停机与连接器重启时存活下来,而不重复提交订单;它在两种模型中都重要,但对中间件来说不可妥协,因为每一次 ERP 故障期间,队列都在实打实地干活。
一套决策框架
这是我们实际使用的精简版,以行文而非表格呈现。当 ERP 持有你不愿重建的深层客户专属或合同定价时,当实时的可承诺量(available-to-promise)与信用状态确实决定能否成交时,当你的受众主要是已认证买家而非匿名浏览者时,以及当你的 ERP 能在负载下快速作答时,倾向于实时读取。当大部分流量是应当达到 CDN 级速度的匿名目录浏览时,当定价简单到可以用区区几张价目表复制时,当你需要商城在 ERP 离线时仍继续售卖时,或当 ERP 无法承接实时网络流量时,倾向于中间件同步。而当你拥有一个快速的匿名目录,却带着一小批必须精确的合同价或低库存商品时,就采用混合方案(大批量同步,少数敏感项实时调用)。要避免的,是选定一种模型却把它当作另一种来运营:把实时读取平台缓存到它暗地里变成一份滞后的副本,或在中间件平台上堆叠如此多的实时调用,以致你重建了对 ERP 的依赖,却没有了唯一来源的保证。
这对采购方意味着什么
你所选的平台,多半已经替你做出了这个选择。Sana 是实时读取。BigCommerce 和 Adobe 是中间件。所以真正的决定在上游:你的业务是否高度依赖 ERP,以至于一份副本会成为负担;还是 ERP 足够轻量,以致解耦纯属增益?诚实地回答这一点,平台候选名单大体就自己写出来了。如果你正在权衡的正是这件事,我们的 Sana Commerce 对比 BigCommerce 会从平台侧走一遍同样的分岔。
如果你正在一个真实项目上估算此事,并想得到一个关于哪种模型合适的直接答案,那正是我们做的工作。在此开启一段对话。