库存平台面临的稳定性挑战
库存平台为货品流通链路提供全面的库存管理服务,贯穿其整个订单生命周期,是电商领域不可或缺的核心模块。在平台建设过程中,我们面临了诸多稳定性方面的挑战。
为了应对库存平台所面临的稳定性挑战,除了通用的可用率可视化、限流等治理措施外,我们还结合库存业务的特点,采取了以下稳定性建设。
流量拆分
-
存在必须要重点保障的核心流量。销售单库存预占能力属于物流核心流程,其目的是为京东物流仓配业务提供出库单库存校验服务,从而避免订单量超出库存容量而错误地传递到仓库管理系统(WMS)中,在接单链路中若库存操作失败则订单接单失败,造成公司大量的财产损失 -
存在一些计算量大又不需要实时处理的流量。如WMS出库以后,需要回传库存出库情况,这部分流量很高,但对处理实时性要求不高 -
存在一些明细行特别多的库存批量操作。以销售单库存预占为例,绝大部分库存操作批量大小在10个以内,但是也存在部分批量大小超过6000的情况。不同的批量大小,调用方需要有不同的超时配置,如批量大小在10个以内,超时时间配置为500毫秒;批量大小大于6000时,超时时间需要配置为50秒
灰度链路
针对库存操作流程复杂且改动容易出错的情况,我们在过往的上线过程中,通常会使用ducc编写一个流程开关,逐步进行灰度放量。
我们识别到,库存业务通常在一个商家范围内进行。因此,库存操作的核心接口均包含以商家为单位的参数。在进行灰度验证时,可以按商家单位进行灰度切量。基于这一特性,库存系统构建了以商家为基础的灰度链路。
操作数量校验
对于某一货品的库存操作,将变更一条或多条库存记录。例如,在依据渠道优先级进行出库操作时,将优先扣减京东渠道的库存,再扣减共享渠道的库存。当某一货品的操作涉及多条库存记录时,需为每条库存记录分配相应的操作数量。操作完成后,应为每条记录生成变更记录流水。
当商家出售爆款商品时,会频繁扣减特定库存记录。在操作数据库的过程中,数据库会对库存记录进行加锁,并按顺序执行这些扣减操作。这导致容器中积累了大量等待的线程和数据库连接,一方面可能导致服务请求超时,另一方面,大量占用容器资源可能引发容器宕机,进而影响其他商品的库存操作。
倘若采取粗暴的限流措施,将导致大量库存扣减失败,并且连非热门商品也会受到波及,造成不良影响。
我们的初版的解决方案是在缓存中添加库存数据,利用缓存的高效性能来应对热点问题。我们按商家的粒度逐步在灰度链路中进行流量切换,具体如下图所示。
解决数据库与Redis数据不一致问题方案
从操作流程上保障数据库与redis一致
解决关键客户商家难以使用redis缓存问题
异步限流
商家通过入驻京仓来管理其线上与线下销售渠道的库存。京仓是一个综合性的仓储管理系统,它帮助商家有效地整合和管理其库存资源。商家可以在京东POP店、京东自营VMI、唯品会、淘天、抖音、快手等线上平台以及线下门店进行销售。这种多渠道销售模式不仅扩大了商家的市场覆盖面,还提高了销售效率。
为了防止超卖现象,商家需要确保线上与线下库存的共享。这意味着商家必须实时更新库存数据,确保所有销售渠道都能看到最新的库存信息。通过这种方式,商家可以避免因库存信息不同步而导致的超卖问题,从而提升客户满意度和信任度。例如,如果一个商品在线上被售出,系统会立即更新库存信息,确保线下门店不会再次销售同一商品。
目前,已有75,821家商家入驻京仓,店铺数量达到162,306家,实物1,785万件,明细行数为9,309万条。这些数据表明,京仓已经成为众多商家管理库存的重要平台。
随着商家接入量、计算场景的增加,系统计算量也随之增大,常常使得容器CPU和数据库CPU的负载过高,进而影响整个系统的稳定性且都是后知后觉,无法提前控量。当容器CPU的负载过高时,会导致对外提供的JSF服务的可用率降低。这不仅影响了用户体验,还可能导致商家的业务受到影响,为了保持系统的稳定性和性能,需要对系统进行优化和升级,同时加强监控和维护,确保系统能够高效地运行。
优化方案
CPU使用率治理
虚拟组套专为京仓来源的订单设计,通过在ECLP中配置虚拟组套关系,实现JD商城下单时为一个套装SKU,而ECLP接单及WMS出库时则按原料SKU出库的功能,给商家带来了更灵活的销售策略。
例如,组套SKU=1*原料1(20%)+2*原料2(20%)+1*原料3(20%)。通过组套关系可以看出,组套SKU的库存量来源于原料。在进行组套计算时,需先根据店铺维度比例或EMG分配比例计算出原料库存,再依据组套规则分配给组套SKU,需进行二次计算。实际应用中,每个原料可以共享给多个组套,整个绑定关系呈现网状结构,单次计算量会成倍增加(1W+),占用更多计算资源,从而影响其他非组套商家的计算。
补充业务监控告警
当前库存平台的监控告警主要集中在接口层面,然而,接口的成功返回并不完全意味着业务处理已正常完成并落库。因此,我们计划引入更为全面的数据维度监控告警机制,以确保业务处理的完整性和准确性。
监控策略:以小时数据为单位进行对比,例如将2月28日9:00至10:00期间的预占成功与回传成功数量,与2月21日同一时间段的数据进行对比。当差异比例超过预设阈值时,触发告警。
告警触发条件:定时触发,每小时的第五分钟执行一次,例如在10:05触发,对比9:00至10:00的数据。
数据来源:通过查询ES或大数据平台进行对比,以避免对线上核心业务造成影响。
数据库-redis不一致比对工具
当前接收到数据库与Redis不一致的告警后,我们采取人工查询数据库流水及Redis流水并进行比对的方式,以查找不一致的原因。由于一个货品在特定时间段内的流水记录可能极为繁多,这一比对过程耗时且费力。为此,我们计划开发一款不一致比对工具,实现自动化分析不一致的原因,并输出导致不一致的具体单据。
扫一扫,加入技术交流群
本篇文章来源于微信公众号: 京东云开发者
本文来自投稿,不代表TakinTalks稳定性技术交流平台立场,如若转载,请联系原作者。