如果接触过实际大型业务系统,就能体会到许多业务的正常运行都依赖于各种昂贵的第三方接口,调用一次都是要花元子的,例如
- 大语言模型
- nlp 服务:信息提取、分类等
- cv 服务:定位、信息提取、分类等
然而经常可能由于各种无意识的操作,导致对这些接口的调用量超出我们的控制范围。当然,这可以通过细致详尽的代码审查环节达到一定程度的缓解,然而凡是依靠人的都是不稳定的。
此外,有时候资源使用消耗增加并不来自于本身的业务上线,有可能是流量正常增加,或者上下游的变更,对于复杂的大型业务系统,这一切都远远超过了人力可以预知和控制的范围。
那么我们能从系统层面做哪些事情,来管理好 “昂贵” 资源的使用呢?
我根据我曾经的经验,总结了如下 7 条策略
- 缓存
- 拼接请求资源来 “薅羊毛”
- 业务划分与优先级
- 限速 / 限额
- 报警
- 资源使用跟踪与回收
- 寻找低成本可替代的方案
公司最好安排单独的团队对第三方接口进行封装,依据这 7 条策略提供统一的控制和管理方案,以此避免各子团队出现重复开发的情况。。
一、缓存:避免重复的请求耗费资源
这条经验来自于惨痛的教训,有时由于历史负担和系统设计的原因,很难避免完全一致的请求对于接口的重复调用。
此时应该在业务和 “昂贵” 资源之间增加统一的缓存策略,来避免重复请求耗费不必要的资源。
二、拼接请求资源来 “薅羊毛”
如果 “昂贵” 资源是按照次数收费,那么不要忘了拼接请求资源来薅羊毛。
这让我想起上学时几个同学买一份论文查重服务,然后把论文拼在一起进行查重。
实际的业务有可能是文本或图片中某些数据的检测,如果接口通过次数而非 “大小” 来计费,并且检测到的可能性很低,那么就是 “薅羊毛” 的好机会。这时可以拼接多个文本或者多张图片,以节约资金。
三、业务划分与优先级
对业务进行清晰的划分并确定优先级,有助于在资源有限的情况下进行精细化管理。
首先,将不同的业务功能或模块按照其对整体业务目标的重要性和影响程度划分成不同的类别。例如,在一个金融交易系统中,核心交易处理业务显然具有最高优先级,因为它直接关系到资金的流转和客户的交易体验;而一些辅助性的报表生成业务则相对优先级较低。当资源紧张时,优先保障高优先级业务的正常运行。
同时,明确的业务划分也方便在出现资源使用问题时快速定位问题来源。如果某个业务模块出现资源占用过高或异常情况,可以迅速聚焦到该业务区域进行排查和解决,而不会因为业务的复杂性而导致问题定位困难,从而提高资源管理和问题解决的效率。
四、限速 / 限额
为了防止昂贵资源出现 “爆炸” 式的使用增长而导致成本失控,设置限速和限额机制至关重要。
可以结合上面介绍的业务区分和优先级策略,进行更加精细化的限速配置。
对于限速的粒度,如果粒度太小可能对噪声敏感,造成不必要的错误超速判定;如果粒度太大可能无法有效在问题发生时立刻做出动作。我们可以通过上线前采样上下文数据的方式,对限速值和限速时间粒度给出合理的预估。
五、报警
报警系统是监控昂贵资源使用情况的重要防线。当资源使用出现异常时,及时准确的报警能够让运维团队迅速采取措施,避免问题恶化导致更大的成本损失。
就我个人经验而言,领导经常拿着月度或者季度报表,要排查某个资源消耗出现的上涨、下降、尖峰等情况,非常的费时费力。因为这需要回溯半个月甚至一个月前的变更,并且常常已经丢失现场,很多时候有一种无从查起的无力感。所以,及时的资源使用异常报警能大大解放问题排查的人力。
然而,减少误报是报警系统设计中的一个关键挑战。误报可能会导致运维人员频繁地响应虚假警报,浪费时间和精力,甚至可能在真正的问题发生时产生麻痹心理。为了减少误报,首先要对资源使用的正常模式和阈值进行精准的设定。这需要基于对业务历史数据的深入分析和对资源特性的充分了解。
同时,可以采用多维度的报警规则,结合多种资源指标进行综合判断。比如,当 CPU 使用率持续高于某个阈值且同时内存使用率也出现异常增长时才触发报警,这样可以提高报警的准确性。
此外,还可以引入机器学习算法对资源使用数据进行实时分析,自动学习正常的资源使用模式,并根据学习结果动态调整报警阈值,进一步降低误报率。
六、资源使用跟踪与回收
资源使用跟踪与回收包含两方面的含义。
第一,如果有可能,跟踪资源的后续使用情况,如果检测到某些请求并没有产生实际的业务价值,那么应及时减少其成本消耗。
例如图片、视频这样的资源,应该定位后续访问,如果发现大量图文或视频并没有被访问到或者很少被访问到,应该及时联系下游使用方排查业务,避免资源浪费。
第二,是对于持续消耗资源的使用场景应该结合业务进行优化。
例如,在一个图片分享网站上,可以记录每张图片的访问频率和最后访问时间。如果一张图片在较长时间内(如半年)没有被访问过,那么可以考虑将其从高速存储设备转移到低速、低成本的存储介质中,以释放高速存储资源供其他更频繁访问的图片使用。当图片再次被访问时,再将其从低速存储恢复到高速存储,虽然这会增加一定的恢复时间,但相比长期占用高价存储资源,这种策略在整体资源利用和成本控制上更为合理。
对于一些临时生成的资源,如计算过程中的临时文件、缓存数据等,在其生命周期结束后要及时进行清理和回收。可以设定自动清理机制,按照一定的时间间隔或资源使用情况触发清理操作,确保资源的及时回收,为新的业务需求腾出空间。
七、寻找低成本可替代的方案
在昂贵资源的使用过程中,积极寻找可替代的开源解决方案是降低成本的有效途径。开源软件和工具在许多领域都提供了功能强大且免费使用的选择。
此外也应该持续关注更便宜的服务厂商。
很多时候我们需要的并不是 100 分的专业解决方案,常常开源解决方案就能达到 80 甚至 90 分,却节省了大量的成本。但一定要记得评估后期维护成本和系统复杂性等因素,避免得不偿失。