实现高并发,高可用,分布式支付系统

简介: 实现高并发,高可用,分布式支付系统

在今年,我开发了一个支付中心系统,用于集合公司所有项目的支付功能配置,功能大致如下:

image.png

具体流程

image.png

高并发

为了实现高并发,我们采用了easyswoole框架,同时针对各个接口做了如下优化:

下单接口

对固定的商户数据做了缓存,避免每次查询数据库,

下单接口只有订单插入这一条io操作

支付成功异步回调接口


先即时判断成功数据,并进行更新,

同时会新开协程通知商户, 如果通知不成功,将通过异步队列通知给商户

高可用

为了实现高可用,我们实现了以下功能:

针对支付成功

1:为了避免系统异步通知出现问题,或者网络出现问题,在下单之后,将定时获取待支付订单,主动向支付平台(支付宝,微信) 查询订单状态,如果订单状态为支付成功,立即更新为支付成功,并异步通知商户  (根据订单的创建时间来进行修改频率)

2:为了避免系统异常终止出现的订单支付问题,在系统启动成功后,将立即执行步骤1

3:为了避免步骤1获取到用户不准备支付的订单,我们新增了过渡状态:订单准备支付状态  当用户创建订单,并请求支付方式接口时,将更新为此状态,只有此状态才会进行步骤1更新

4:订单状态如果为已创建,则在30分钟后自动过期订单,并同时请求支付平台(支付宝,微信) 关闭此订单 (也可在下单时预先设置订单过期时间)

5:在更新为已支付状态时,开启事务并加锁,确保其他进程无法访问此订单数据.

6:所有操作都有做异常日志记录

针对退款订单

1:为了使得退款合理化,我们新增了过渡状态:订单准备退款  只有在请求退款订单并未响应退款成功时才会更新为此状态

2:退款时,将新增一条退款订单记录,通过此记录向支付平台(支付宝,微信) 发起退款,此订单状态为 待退款 ,每条支付订单可多次重复退款,但是金额不能操作

3:因为微信退款为异步操作,同时避免在扩展其他支付方式出现问题,在申请退款之后,将定时获取待退款订单,主动向支付平台(支付宝,微信)请求退款订单信息,如果为退款成功,立即更新为退款成功,并异步通知商户 (根据订单的创建时间来进行修改频率)

4:由于退款订单到账银行卡最长需要7个工作日,所以系统将定时清理7日之前的待退款订单,更新为退款异常,并将原有支付订单改回支付成功状态

5:订单退款所有操作都带上了事务,并对相关数据加锁

6:所有操作都有做异常日志记录

以上2条保证了就算是系统死机,在开机后,也能保证之前的支付订单,退款订单等正常运行,就算是在更新为待退款状态时突然断电,下次也可以重新根据退款订单进行请求退款,也可以通过退款记录恢复退款状态

分布式部署

为了增加系统并发,系统实现了分布式部署,同时对redis,mysql做了集群兼容,只有订单这些重要数据才会直接走主库,其他查询都走从库

同时为了避免系统的定时任务,消费进程等出现冲突,额外实现了redis分布式锁

目录
相关文章
|
16天前
|
存储 运维 负载均衡
构建高可用性GraphRAG系统:分布式部署与容错机制
【10月更文挑战第28天】作为一名数据科学家和系统架构师,我在构建和维护大规模分布式系统方面有着丰富的经验。最近,我负责了一个基于GraphRAG(Graph Retrieval-Augmented Generation)模型的项目,该模型用于构建一个高可用性的问答系统。在这个过程中,我深刻体会到分布式部署和容错机制的重要性。本文将详细介绍如何在生产环境中构建一个高可用性的GraphRAG系统,包括分布式部署方案、负载均衡、故障检测与恢复机制等方面的内容。
69 4
构建高可用性GraphRAG系统:分布式部署与容错机制
|
28天前
|
NoSQL Java Redis
京东双十一高并发场景下的分布式锁性能优化
【10月更文挑战第20天】在电商领域,尤其是像京东双十一这样的大促活动,系统需要处理极高的并发请求。这些请求往往涉及库存的查询和更新,如果处理不当,很容易出现库存超卖、数据不一致等问题。
44 1
|
1月前
|
消息中间件 中间件 数据库
NServiceBus:打造企业级服务总线的利器——深度解析这一面向消息中间件如何革新分布式应用开发与提升系统可靠性
【10月更文挑战第9天】NServiceBus 是一个面向消息的中间件,专为构建分布式应用程序设计,特别适用于企业级服务总线(ESB)。它通过消息队列实现服务间的解耦,提高系统的可扩展性和容错性。在 .NET 生态中,NServiceBus 提供了强大的功能,支持多种传输方式如 RabbitMQ 和 Azure Service Bus。通过异步消息传递模式,各组件可以独立运作,即使某部分出现故障也不会影响整体系统。 示例代码展示了如何使用 NServiceBus 发送和接收消息,简化了系统的设计和维护。
48 3
|
1月前
|
NoSQL Java Redis
Redlock分布式锁高并发下有什么问题
Redlock分布式锁在高并发场景下可能面临的问题主要包括:网络延迟、时钟偏移、单点故障、宕机重启问题、脑裂问题以及效率低等。接下来,我将使用Java代码示例来说明其中一些问题。
84 12
|
1月前
|
消息中间件 存储 监控
消息队列系统中的确认机制在分布式系统中如何实现
消息队列系统中的确认机制在分布式系统中如何实现
|
1月前
|
存储 缓存 NoSQL
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
62 4
|
1月前
|
缓存 NoSQL Ubuntu
大数据-39 Redis 高并发分布式缓存 Ubuntu源码编译安装 云服务器 启动并测试 redis-server redis-cli
大数据-39 Redis 高并发分布式缓存 Ubuntu源码编译安装 云服务器 启动并测试 redis-server redis-cli
55 3
|
1月前
|
消息中间件 存储 监控
【10月更文挑战第2天】消息队列系统中的确认机制在分布式系统中如何实现
【10月更文挑战第2天】消息队列系统中的确认机制在分布式系统中如何实现
|
1月前
|
存储 开发框架 .NET
C#语言如何搭建分布式文件存储系统
C#语言如何搭建分布式文件存储系统
70 2
|
1月前
|
消息中间件 存储 监控
消息队列系统中的确认机制在分布式系统中如何实现?
消息队列系统中的确认机制在分布式系统中如何实现?