清结算系统的一些思考

美团点评智能支付核心交易系统的可用性实践:https://tech.meituan.com/Trade-High-Availability-in-Action.html

今天看了一篇支付相关的博客,回头看了下我们的清结算系统,引发了一些思考。

1、消除依赖、控制依赖、弱化依赖

     消除依赖:交易系统将订单数据推送给MQ,而清结算系统从MQ上拉取订单数据,这样的优点是交易与清结算消除了依赖,实现了交易与清结算的解耦。

     控制依赖:MQ接收消息依赖交易系统,清结算系统拉取消息依赖MQ

     弱化依赖:对于以上依赖关系,当MQ发生故障时,交易系统与清结算系统将无法通信,这样的话我们可以直接采用RPC调用通信,实现弱化依赖的效果,达到容灾处理。

2、事务中不包含外部调用

   这里的外部调用,可直接理解为调用外部服务接口。当调用外部服务接口时,可能出现一些不稳定因素:比如有可能遇到外部服务挂掉引起调用接口失败,或者网络不稳定引起的调用接口超时,当遇到这种情况的时候我们一般采用重试机制,一般默认重试3次,当最后一次调用失败则报警,人工干预。

  而事务中如果包含外部调用,必然会造成大事务,大事务会造成其他对数据库的连接请求获取不到,导致和这个数据库相关的所有服务处于等待状态,造成连接池被打满,多个服务直接宕掉。

解决方案:

排查各个系统的代码,检查是否存在RPC调用,HTTP调用,消息队列操作,缓存,循环查询等耗时操作,将这些操作移到事务外,理想情况事务中只处理数据库操作。

建议不要使用xml文件配置事务,而使用注解的方式。原因是XML配置事务,第一可读性不强,第二切面通常配置的比较泛滥,容易造成事务过大,第三对于嵌套情况的规则不好处理。

对大事务添加监控报警。

3、合理设置超时时间和重试次数

清结算系统的响应时间=内部处理时间+外部依赖超时时间*重试次数

清结算系统存在一些外部服务调用、消息队列操作等,而当这些依赖方发生故障时,如果超时时间过长、重试次数过多,或者系统长时间不返回,可能导致连接池被打满,系统宕掉;如果超时时间设置过短,则错误会增多,系统可用性就比较差。

解决方案:

超时时间=响应时间*1.5;

调用方的超时时间依赖被调用方的响应时间;

可默认重试次数为3;

4、处理慢查询

读写分离。读走分库,写走主库

优化索引。索引过多影响数据库写性能,索引不够查询会慢;调研所有查询sql,优化索引,页面查询,可设置默认值,走组合索引,DBA建议索引个数不要超过5个,组合索引字段不要超过5个

将查询分为实时查询、近实时查询、离线查询。实时查询可直接查询数据库,其他可通过ES实现一个查询中心,处理近实时查询和离线查询

不要出现大表。当一张表的数据量达到千万级别,效率将急剧下降,则可考虑分库分表

5、熔断

当依赖的服务不可用时,服务调用方应采用一些技术手段,向上提供有损服务,保证业务柔性可用。

解决方案:

自动熔断,

手动熔断,

6、限流

系统可能收到一些有意或无意的请求,如DDoS攻击、用户失败重刷。

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

原文地址:https://www.cnblogs.com/tilamisu007/p/9037078.html