美团点评智能支付核心交易系统的可用性实践(下)

简介: 背景每个系统都有它最核心的指标。比如在收单领域:进件系统第一重要的是保证入件准确,第二重要的是保证上单效率。清结算系统第一重要的是保证准确打款,第二重要的是保证及时打款。我们负责的系统是美团点评智能支付的核心链路,承担着智能支付100%的流量,内部习惯称为核心交易。因为涉及美团点评所有线下交易商家、用户之间的资金流转,对于核心交易来说:第一重要的是稳定性,第二重要的还是稳定性。

2. 发生频率要低之自己不作死

 

自己不作死要做到两点:第一自己不作,第二自己不死。


2.1 不作


关于不作,我总结了以下7点:


1>不当小白鼠:只用成熟的技术,不因技术本身的问题影响系统的稳定。


2>职责单一化:不因职责耦合而削弱或抑制它完成最重要职责的能力。


3>流程规范化:降低人为因素带来的影响。


4>过程自动化:让系统更高效、更安全的运营。


5>容量有冗余:为了应对竞对系统不可用用户转而访问我们的系统、大促来临等情况,和出于容灾考虑,至少要保证系统2倍以上的冗余。


6>持续的重构:持续重构是确保代码长期没人动,一动就出问题的有效手段。


7>漏洞及时补:美团点评有安全漏洞运维机制,提醒督促各个部门修复安全漏洞。


1112728-20180419213740276-217082050.png


2.2 不死


关于不死,地球上有五大不死神兽:能在恶劣环境下停止新陈代谢的“水熊虫”;可以返老还童的“灯塔水母”;在硬壳里休养生息的“蛤蜊”;水、陆、寄生样样都成的“涡虫”;有隐生能力的“轮虫”。它们的共通特征用在系统设计领域上就是自身容错能力强。这里“容错”的概念是:使系统具有容忍故障的能力,即在产生故障的情况下,仍有能力将指定的过程继续完成。容错即是Fault Tolerance,确切地说是容故障(Fault),而并非容错误(Error)。


1112728-20180419213800731-1095456318.png


3. 发生频率要低之不被别人搞死


3.1 限流


在开放式的网络环境下,对外系统往往会收到很多有意无意的恶意攻击,如DDoS攻击、用户失败重刷。虽然我们的队友各个是精英,但还是要做好保障,不被上游的疏忽影响,毕竟,谁也无法保证其他同学哪天会写一个如果下游返回不符合预期就无限次重试的代码。这些内部和外部的巨量调用,如果不加以保护,往往会扩散到后台服务,最终可能引起后台基础服务宕机。下图是对无限流影响的问题树分析:


1112728-20180419213819849-752566822.png


解决方法:


  • 通过对服务端的业务性能压测,可以分析出一个相对合理的最大QPS。


  • 流量控制中用的比较多的三个算法是令牌桶、漏桶、计数器。可以使用Guava的RateLimiter来实现。其中SmoothBurstry是基于令牌桶算法的,SmoothWarmingUp是基于漏桶算法的。


  • 核心交易这边采用美团服务治理平台OCTO做thrift截流。可支持接口粒度配额、支持单机/集群配额、支持指定消费者配额、支持测试模式工作、及时的报警通知。其中测试模式是只报警并不真正节流。关闭测试模式则超过限流阈值系统做异常抛出处理。限流策略可以随时关闭。


  • 可以使用Netflix的Hystrix或者美团点评自己研发的Rhino来做特殊的针对性限流。

 

4. 故障范围要小之隔离


隔离是指将系统或资源分割开,在系统发生故障时能限定传播范围和影响范围。


服务器物理隔离原则


① 内外有别:内部系统与对外开放平台区分对待。


② 内部隔离:从上游到下游按通道从物理服务器上进行隔离,低流量服务合并。


③ 外部隔离:按渠道隔离,渠道之间互不影响。


线程池资源隔离


  • Hystrix通过命令模式,将每个类型的业务请求封装成对应的命令请求。每个命令请求对应一个线程池,创建好的线程池是被放入到ConcurrentHashMap中。


注意:尽管线程池提供了线程隔离,客户端底层代码也必须要有超时设置,不能无限制的阻塞以致于线程池一直饱和。


信号量资源隔离


  • 开发者可以使用Hystrix限制系统对某一个依赖的最高并发数,这个基本上就是一个限流策略。每次调用依赖时都会检查一下是否到达信号量的限制值,如达到,则拒绝。

 

5. 故障恢复要快之快速发现


发现分为事前发现、事中发现和事后发现。事前发现的主要手段是压测和故障演练;事中发现的主要手段是监控报警;事后发现的主要手段是数据分析。


5.1 全链路线上压测


你的系统是否适合全链路线上压测呢?一般来说,全链路压测适用于以下场景:


① 针对链路长、环节多、服务依赖错综复杂的系统,全链路线上压测可以更快更准确的定位问题。


② 有完备的监控报警,出现问题可以随时终止操作。


③ 有明显的业务峰值和低谷。低谷期就算出现问题对用户影响也比较小。


全链路线上压测的目的主要有:


① 了解整个系统的处理能力


② 排查性能瓶颈


③ 验证限流、降级、熔断、报警等机制是否符合预期并分析数据反过来调整这些阈值等信息


④ 发布的版本在业务高峰的时候是否符合预期


⑤ 验证系统的依赖是否符合预期


全链路压测的简单实现:


① 采集线上日志数据来做流量回放,为了和实际数据进行流量隔离,需要对部分字段进行偏移处理。


② 数据着色处理。可以用中间件来获取和传递流量标签。


③ 可以用影子数据表来隔离流量,但是需要注意磁盘空间,建议如果磁盘剩余空间不足70%采用其他的方式隔离流量。


④ 外部调用可能需要Mock。实现上可以采用一个Mock服务随机产生和线上外部调用返回时间分布的时延。


压测工具上,核心交易这边使用美团点评开发的pTest。

1112728-20180419213850509-304868242.png


6. 故障恢复要快之快速定位


定位需要靠谱的数据。所谓靠谱就是和要发现的问题紧密相关的,无关的数据会造成视觉盲点,影响定位。所以对于日志,要制定一个简明日志规范。另外系统监控、业务监控、组件监控、实时分析诊断工具也是定位的有效抓手。


1112728-20180419213920825-25574117.png


7. 故障恢复要快之快速解决


要解决,提前是发现和定位。解决的速度还取决于是自动化的、半自动化的还是手工的。核心交易有意向搭建一个高可用系统。我们的口号是:“不重复造轮子,用好轮子。”这是一个集成平台,职责是:“聚焦核心交易高可用,更好、更快、更高效。”


美团点评内部可以使用的用于发现、定位、处理的系统和平台非常多,但是如果一个个打开链接或者登陆系统,势必影响解决速度。所以我们要做集成,让问题一站式解决。希望达到的效果举例如下:


1112728-20180419214112646-1986636209.png


工具介绍


Hystrix


Hystrix实现了断路器模式来对故障进行监控,当断路器发现调用接口发生了长时间等待,就使用快速失败策略,向上返回一个错误响应,这样达到防止阻塞的目的。这里重点介绍一下Hystrix的线程池资源隔离和信号量资源隔离。


线程池资源隔离


1112728-20180419214334563-1888915842.png


优点


  • 使用线程可以完全隔离第三方代码,请求线程可以快速放回。


  • 当一个失败的依赖再次变成可用时,线程池将清理,并立即恢复可用,而不是一个长时间的恢复。


  • 可以完全模拟异步调用,方便异步编程。


缺点


  • 线程池的主要缺点是它增加了CPU,因为每个命令的执行涉及到排队(默认使用SynchronousQueue避免排队),调度和上下文切换。


  • 对使用ThreadLocal等依赖线程状态的代码增加复杂性,需要手动传递和清理线程状态(Netflix公司内部认为线程隔离开销足够小,不会造成重大的成本或性能的影响)。


信号量资源隔离


开发者可以使用Hystrix限制系统对某一个依赖的最高并发数。这个基本上就是一个限流策略,每次调用依赖时都会检查一下是否到达信号量的限制值,如达到,则拒绝。


1112728-20180419214351280-675922867.png


优点


  • 不新起线程执行命令,减少上下文切换。


缺点

  • 无法配置断路,每次都一定会去尝试获取信号量。


比较一下线程池资源隔离和信号量资源隔离


  • 线程隔离是和主线程无关的其他线程来运行的;而信号量隔离是和主线程在同一个线程上做的操作。


  • 信号量隔离也可以用于限制并发访问,防止阻塞扩散,与线程隔离的最大不同在于执行依赖代码的线程依然是请求线程。


  • 线程池隔离适用于第三方应用或者接口、并发量大的隔离;信号量隔离适用于内部应用或者中间件;并发需求不是很大的场景。


1112728-20180419214412057-2057531014.png


Rhino


Rhino是美团点评基础架构团队研发并维护的一个稳定性保障组件,提供故障模拟、降级演练、服务熔断、服务限流等功能。和Hystrix对比:


  • 内部通过CAT(美团点评开源的监控系统,参见之前的博客“深度剖析开源分布式监控CAT”)进行了一系列埋点,方便进行服务异常报警。


  • 接入配置中心,能提供动态参数修改,比如强制熔断、修改失败率等。


总结思考


王国维 在《人间词话》里谈到了治学经验,他说:古今之成大事业、大学问者,必经过三种之境界:


第一种境界

昨夜西风凋碧树。独上高楼,望尽天涯路。

第二种境界

衣带渐宽终不悔,为伊消得人憔悴。

第三种境界

众里寻他千百度,蓦然回首,那人却在,灯火阑珊处。


核心交易的高可用目前正在经历第一种:高瞻远瞩认清前人所走的路,以总结和学习前人的经验做为起点。


下一阶段,既然认定了目标,我们会呕心沥血孜孜以求,持续发展高可用。最终,当我们做了很多的事情,回过头来看,相信会对高可用有更清晰和深入的认识。敬请期待我们下一次的分享~~





相关文章
|
2月前
|
SQL 缓存 安全
别再只会用 synchronized!Java 并发编程全链路核心体系,从底层原理到生产实战全覆盖
本文深入解析Java并发编程核心知识,基于JDK17从底层原理到生产实践全面讲解。首先剖析JMM内存模型与三大特性(原子性、可见性、有序性),详解synchronized、ReentrantLock等锁机制及AQS实现原理。然后介绍JUC工具类(原子类、并发容器、线程池、同步工具)的正确使用方式。重点通过商品库存扣减案例,对比悲观锁、乐观锁、SQL原子操作三种方案解决超卖问题。最后总结常见坑点(死锁、线程池误用等)和线上问题排查方法,强调理解底层原理而非死记API的重要性,帮助开发者真正掌握并发编程精髓。
220 3
|
5月前
|
SQL 自然语言处理 数据挖掘
没有 GPU 不用 LLM 能把 Text2SQL 做到什么程度?
润乾 NLQ 抛弃大模型与昂贵算力,专注构建规则驱动的 Text2SQL 引擎。通过“业务词典+语法手册”实现自然语言到 SQL 的精准编译,支持复杂多表关联、聚合计算与智能语义解析,在 BI 场景下达成高准确率、可解释、低成本的查询能力,展现确定性智能在企业级应用中的强大潜力。
|
5月前
|
消息中间件 NoSQL 测试技术
电商秒杀系统架构实战
本文深入剖析电商秒杀系统架构设计,涵盖高并发应对、库存精准控制、订单高效处理等核心挑战。通过流量削峰、Redis预扣减、MQ异步解耦等技术,结合压测与容灾方案,构建稳定可靠的秒杀体系,并附核心源码,助力实战落地。(239字)
397 0
|
机器学习/深度学习 数据采集 人工智能
基于Qwen 2.5的世界科学智能大赛冠军方案
本方案基于通义千问模型,采用多阶段的Easy-to-Hard数据合成方法,模拟人类学习的由简单到困难的思路,逐阶段构造多样化的训练数据。数据生成阶段,训练数据的标签,引入了“Chain-of-Thought”思维链模式,生成多样化的推理路径,逐步对齐推理Scaling Law。训练阶段,采用了LoRA对通义千问32B模型在合成数据集上进行参数高效微调。推理阶段,使用了4bit低精度量化,并结合vLLM框架进行推理加速,最终达到准确性、效率和显存利用率的统一。
1165 2
基于Qwen 2.5的世界科学智能大赛冠军方案
|
机器学习/深度学习 算法 自动驾驶
计算机视觉入门
计算机视觉入门
|
存储 NoSQL 前端开发
谷粒商城笔记+踩坑(18)——购物车
业务流程:在执行目标方法之前,检测cookie里的userKey,如果没有则新建用户传输对象,userKey设为随机uuid将用户传输对象封装进ThreadLocal。在执行目标方法之后,创建cookie并,设置作用域和过期时间,让浏览器保存购物车模块/*** @Description: 在执行目标方法之前,判断用户的登录状态.并封装传递给controller目标请求**///创建ThreadLocal对象,同一个线程共享数据/**** 目标方法执行之前*/
谷粒商城笔记+踩坑(18)——购物车
|
前端开发 JavaScript 索引
【Web 前端】JS的几种具体异常类型(报错)
【4月更文挑战第22天】【Web 前端】JS的几种具体异常类型(报错)
|
缓存 数据库 API
如何设计高可用系统之故障隔离
简单来说,当功能或性能不符合预期,就是故障。减少故障的方式有多种,包括系统优化、监控、风险扫描、链路分析、变更管控、故障注入演练、故障隔离等。故障隔离是其中一种手段,并且要求在系统设计时就需要考虑清楚。
3132 0
|
NoSQL Redis
Redis Cluster集群主从切换踩坑记
Redis Cluster经过运行一段时间后,会经常发生主从关系的自动切换,应该是redis.conf里的集群节点的超时时限参数cluster-node-timeout有关。
13755 0
|
JSON Dart Android开发
Flutter系列:Flutter常见问答(可用于面试)
Flutter系列:Flutter常见问答(可用于面试)
1318 0

热门文章

最新文章