您现在的位置是:网站首页>技术百科技术百科
分布式场景下的资损防控
小大寒2024-01-01[技术百科]博学多闻
分布式场景下的资损防控资损防控包括事中定位和事后应急两部分。事中定位通过管理变更点和高效日志排查快速发现问题;事后应急则依赖回滚和降级机制,确保最小成本解决问题。通过演练真实场景验证三道防线的有效性,提升1分钟发现、5分钟定位、10分钟止损的能力,全面保障业务资金安全。
分布式场景下的资损防控
资损的定义
资损是指在业务活动中,由于业务规则与实际资金流动不一致,导致业务参与方中任何一方或多方遭受资金损失的情况。简单来说,就是系统的某个功能出现问题(如BUG),导致用户或公司出现资金损失。例如:在营销过程中多发给某个用户10元红包,或者用户领取了10元红包却无法使用;用户支付时看到订单金额是100元,实际支付了101元或99元。这些情况都属于资损。用户支付101元时,用户资损了1元;而用户支付99元时,公司资损了1元。
为什么要重视资损防控?
资金损失金额过大会直接摧毁一个业务。例如某业务在一次运营活动中,将9折优惠券误配置成1折,并发放给数百万用户,这可能导致几千万元的资金损失。而如果业务本身并未盈利几千万,这种损失可能直接导致业务崩溃。因此,凡涉及资金流动的业务,其防控工作都尤为重要。
如何进行资损防控
资损防控需要设定明确目标,对于核心业务通常设定“1-5-10”目标,即:
- 1分钟内发现问题
- 5分钟内定位问题
- 10分钟内解决问题
例如,如果误发了错误折扣的优惠券,我们需要在1分钟内发现问题,5分钟内定位是配置错误还是系统BUG,10分钟内停止优惠券的发放。
资损防控的三道防线
为了实现“1-5-10”的目标,需要构建以下三道防线:
- 事前规避问题
- 事中快速定位问题
- 事后以最小成本解决问题
第一道防线:事前规避
通过建立编码规范和发布规范,尽量在问题发生前予以规避。
建立编码规范
根据业务需求制定相应的编码规范,以下为几个示例:
- 禁止使用ThreadLocal:如果系统使用线程池,线程池内的线程是共享的,使用ThreadLocal存储数据可能因异常未清理原数据,导致问题难以排查。例如,用户A的状态可能串到用户B,造成优惠券错发。
- 幂等控制:确保同一请求多次执行结果一致。可以设计一个幂等号,通常由业务阶段和唯一业务号(如支付单号)组成。业务阶段包括支付、退款等,幂等号的唯一性可有效防止重复执行引发的问题。
- 无状态服务:服务器应保持无状态。在分布式环境中,应用可能部署在多台服务器上,状态型数据需存储在统一的分布式存储中,否则请求可能因路由到不同服务器而丢失状态信息。
建立发布规范
系统发布需遵循以下三要素:
- 可灰度:逐步切流,观察系统运行情况。例如,优惠券活动先发给内部用户,再逐步扩展到小规模用户群,最后覆盖全部用户。
- 可监控:通过业务监控和系统监控及时发现异常。业务监控指标包括交易笔数、支付金额等;系统监控指标包括TPS、QPS、磁盘容量等。
- 可回滚:所有变更都需具备回滚能力,确保出现问题时能迅速恢复到初始状态。
第二道防线:事中定位
事中定位包括两大核心能力:
- 查找变更点:快速识别系统最近的配置或代码变更,缩小排查范围。
- 排查日志:通过系统日志分析问题来源,结合监控工具定位问题根因。
找变更点
大多数线上问题与系统变更密切相关,例如上线一个新功能或推送一项新配置。这些都属于线上变更。快速定位问题的关键是首先找到变更点,然后评估业务流量的骤增是否与该变更相关。如果一次发布包含多个变更点,可以通过发布系统管理所有变更点,实时同步变更信息到团队沟通渠道。没有发布系统时,也可要求开发人员在变更前主动在群内同步变更内容。
变更内容的同步可以包括以下信息:
- 变更点:例如“1002XX功能上线”
- 变更类型:系统变更 + SQL调整
- 变更系统:具体涉及的系统名称
- 变更人:例如“张三”
- 变更环境:生产环境
- 变更时间:开始时间和结束时间(如“10月2日12:00 - 14:00”)
排查日志
快速排查日志需要做到以下两点:管理日志级别和确保关键日志的有效打印。
管理日志级别
线上问题发生时,首先应排查系统错误日志和关键指标是否异常,判断其与问题是否相关。为了提高日志排查效率,需日常维护好日志质量。例如线上错误日志应尽可能少。若某些日志确认不是线上问题,可将其级别从ERROR
调整为WARN
。这样,只要出现ERROR
日志,就可能是线上问题,有助于提升运维敏感度,避免"狼来了"的困境。
做好日志打印
关键方法的入参、异常和出参等信息必须在代码中记录到日志中。同时,应对所有方法的入参进行严格校验,直接抛出异常以避免问题扩散。此外,适量日志打印可极大提升排查效率,即便存储成本稍高也能接受。如果遇到大促流量,可以临时关闭细节日志,仅保留关键日志。
第三道防线 - 事后应急能力
事后应急的核心目标是以最小成本解决问题,包括回滚和降级应急能力。
回滚应急
回滚应急包括两方面:回滚管理和回滚效率。
回滚管理
回滚内容通常涉及代码、缓存、配置和数据库的回滚。多系统协作时,回滚内容之间的顺序至关重要,必须逐步回滚,避免新故障的产生。
回滚效率
提高回滚效率可在提交变更SQL时,预先准备好对应的回滚SQL。一旦数据出现问题,能够快速还原原始状态。例如,养成保留多版本文件的习惯,在关键时刻可快速恢复之前的正确状态。
降级应急
降级应急通过配置项关闭特定功能或直接阻断某些场景流量。分为无损降级和有损降级。
无损降级
降级后对业务没有任何影响。例如,在一次架构升级中发现新链路存在BUG,通过降级切换至老链路以保证业务正常运行。
有损降级
降级后对业务可能造成一定影响。例如,关闭某场景流量导致交易量下降。然而,为避免更大的资金损失,这种降级是必要的。
如何进行资损演练
资损问题虽少见,但一旦发生可能是致命的。为了确保三道防线的有效性和实现1-5-10的目标,可以通过定期演练模拟真实资损场景。
演练可以包括:
- 故意配置错误的优惠券发给内部用户,验证是否能在1分钟内发现问题。
- 定位问题的根因并在5分钟内确认。
- 10分钟内止损。
为了提升演练效果,建议资损演练和防控布控由不同团队完成,这样能够更大限度地增加未知错误的发现概率,全面检测三道防线的有效性。
演练的核心目标是模拟未知错误,通过监控和核对手段,将可能发生的错误纳入可控范围。
本文致力于为分布式场景下的资损防控提供实践指导和演练建议,以帮助企业构建更安全的系统。如果您有需要,请联系我。
阅读完毕,很棒哦!
上一篇:设计模式