2019-06-06:支付同步和异步处理关系

本文深入解析支付流程中的同步与异步处理方式,阐述两者在不同场景下的应用及优劣,强调银行转账系统中同步交互的重要性,以及电商环境下采用异步通知提升系统稳定性和效率的策略。

支付流程同步和异步处理关系

处理逻辑

同步:指发出一个请求后,需要等待返回,才能进行下一个请求触发,有个等待的过程

异步:指发出一个请求后,不需要等待返回,随时可以触发下一个请求,不需要等待

区别:一个需要等待,一个不需要等待,在部分情况下、有的项目开发中都会优先选择不需要等待的异步交互方式。

哪些情况建议使用同步交互呢?比如银行的转账系统,对数据库的保存操作等等,都会使用同步交互操作,其余情况都优先使用异步交互。

换种方式也可以这样理解:

1.用户(买家)支付完成后,电商平台需要实时的给用户一个通知,如支付已经处理等待订单确认。

2.电商平台,这块就需要考虑系统技术方面的各个环节,考虑应对复杂多变的并发用户量、业务、流量、网络环境等因素,我们需要把可以异步化的任务进行分离,算是保障系统可造性、可用性的一个重要的点。

3.电商网站每秒钟承接1w、5w、10W交易量甚至更高的时候,实时处理这些请求挑战很大,但如果把这些请求分离业务状态实现异步化,放入消息系统、异步准实时环境,进而整体网站的复杂度降低,这就是同步和异步通知存在的意义。
4.第三方支付公司接入文档上都会有以异步通知为准的约束。
5.其实除了通知这块,还有一块会被忽略,就是支付查询类接口,这一块的作用如果用好了,对系统业务层会省很多人力

我们测试一般当完成一个支付请求被发送到支付渠道方,支付渠道会很快返回一个结果。但是这个结果,只是告诉你调用成功了,不是扣款成功,这叫同步调用。很多人拿这个结果当作支付成功了,那就会被坑死,结果就是支付成功率特别高,伴随着一堆无法解释的坏账率,测试人员尤其要注意测试数据的篡改:金额,同步返回结果,订单号等。

同步请求参数里面会有一个回调地址,这个地址是支付渠道在扣款成功后调用的,这叫异步调用。一般同步接口仅检查参数是否正确,签名是否无误等。异步接口才告诉你扣款结果。一般异步接口有5秒以内的延迟。调用不成功会重试。有时候是这边成功了,但支付渠道侧没收到返回,于是会继续调。当天的支付到第二天还在被异步调用也都是正常的。这也是开发人员需要特别注意的地方,不要当做重复支付。测试人员也要对重复回调进行测试,应只有一次有效。这还不是最坑的,一般支付渠道侧,只有支付成功了才通知你。要是支付失败了,压根儿都不告诉你。 另一方面,如何老收不到异步结果呢?那就得查查了。同步结果不可靠,异步调用不可靠,那怎么确定支付结果?最终的杀招就是查单了,反查,一般支付渠道侧都会提供反查接口,定时获取DB中待支付的订单调用支付渠道侧的反查接口,最终把支付渠道侧扣款成功的订单完成掉。

好的,我们来为智慧校园微服务中的简易图书借阅服务用户中心服务进行详细的 UML 建模。建模将遵循您的需求,覆盖用例图、活动图、类图、序列图、状态图组件图,并专注于微服务环境下的特性交互。 一、 需求分析 (用例图 & 活动图) 整体用例图 (微服务上下文) 参与者 (Actors): 学生 (Student): 主要的图书借阅使用者。 教师 (Teacher): 主要的图书借阅使用者,可能有不同的借阅规则(由图书服务处理)。 图书管理员 (Librarian): 管理系统基础数据处理异常操作。 系统管理员 (SysAdmin): 负责两个微服务的部署、监控配置。 校园身份认证服务 (Auth Service) (外部系统): 提供统一的用户身份认证服务。 用例 (Use Cases - 主要按服务划分): 用户中心服务 (User Center Service): 登录 Login (包含/依赖 Auth Service) 查看个人信息 View Profile 修改个人信息 Update Profile 查看借阅历史 View Borrow History (依赖于图书服务的查询接口) 图书借阅服务 (Book Borrowing Service): 查询图书 Search Books 借阅图书 Borrow Book 归还图书 Return Book 续借图书 Renew Book 查看借阅详情 View Borrow Details 管理图书信息 Manage Book Info (图书管理员权限) 管理借阅规则 Manage Borrow Rules (图书管理员/系统管理员权限) 交互用例: 获取用户信息 Get User Info (图书服务调用用户服务的API,用于借阅等操作) 关系 (Relationships): 关联 (Association): 学生/教师与 登录, 查询图书, 借阅图书, 归还图书, 续借图书, 查看借阅详情, 查看个人信息, 修改个人信息关联;图书管理员与 管理图书信息, 管理借阅规则关联;系统管理员单独关联或作为特殊管理员关联;校园身份认证服务与 登录关联。 包含 (Include): 登录包含(include)与 Auth Service 的认证交互(示意)。 扩展 (Extend): 归还图书可扩展(extend)到缴纳罚金 Pay Fine(如果超期)。 借阅图书可扩展(extend)到支付押金 Pay Deposit(如果图书需要)。 依赖 (Dependency): 查看借阅历史(用户中心) 获取用户信息(图书服务)<<使用>> 箭头表示跨服务调用。借阅图书, 归还图书, 续借图书依赖 获取用户信息。 泛化 (Generalization): 用户中心服务、图书借阅服务泛化自校园微服务(可选,表示服务分类)。 简易图书借阅与用户中心微服务用例图(图示:智慧校园微服务图书借阅与用户中心用例图概览,需替换为实际绘图) 关键活动图 (描述核心业务流程) 借阅图书活动图 (示例): mermaid graph TD A[学生/教师登录] --> B[选择图书查询] B --> C[找到目标图书] C --> D{库存>0?} D -->|是| E[发起借阅申请] E --> F[用户中心:验证用户状态] F --> G{用户状态有效且无超期/超借?} G -->|是| H[图书服务:锁定图书库存] H --> I[图书服务:生成借阅记录] I --> J[更新用户借阅信息] J --> K[通知用户借阅成功] G -->|否| L[通知用户借阅失败原因] D -->|否| M[通知用户图书暂无可借] 说明:此图清晰地展示了: 用户认证由用户中心处理 ( ↩ ↩ Auth Service)。 用户状态检查调用用户中心服务 (获取用户信息)。 库存锁定、借阅记录生成在图书服务内部完成。 最终会调用用户服务更新用户的借阅信息(可选,也可由图书服务通过事件更新用户中心的视图)。 分支逻辑处理失败情况。 归还图书活动图 (需包含超期处理): 流程类似,重点在检查是否超期,是否需要生成罚金记录(图书服务),触发罚金通知(可能调用支付服务接口),更新库存借阅状态。状态图会更详细描述借阅记录状态变化。 二、 静态结构建模 (类图) 需要为两个微服务分别设计核心类图。 图书借阅服务核心类图 mermaid classDiagram class Book { -id: string -isbn: string -title: string -author: string -category: string -totalCopies: int -availableCopies: int -location: string +updateInfo()... +decrementAvailable()... +incrementAvailable()... } class BorrowRecord { -id: string -userId: string // 关联用户ID (由用户中心管理用户详情) -bookId: string -borrowDate: DateTime -dueDate: DateTime -returnDate: DateTime? = null -status: BorrowStatus // (APPLIED, BORROWED, RETURNED, OVERDUE) -fineAmount: float +borrow()... +renew()... +returnBook()... +calculateFine()... } class BorrowRule { -id: string -userType: UserType // (Student, Teacher) -maxBorrow: int -maxRenewal: int -defaultBorrowDays: int -finePerDay: float +validateRules()... } Book "1" *-- "0..*" BorrowRecord BorrowRule --> UserType BorrowRecord ..> UserType // 借阅记录关联用户类型(用于规则应用) BorrowRecord *-- BorrowStatus BorrowRecord --> Book // 聚合/组合 关键点: Book管理库存 (totalCopies, availableCopies)。 BorrowRecord 是核心领域对象,记录每一次借阅,其 status 是状态图的理想建模对象。userId 是关联到用户中心服务的外键,通过服务调用获取用户详情。 BorrowRule 定义不同用户类型(UserType)的借阅规则。BorrowRecord.renew()等操作需要调用BorrowRule.validateRules()进行校验。 UserType 是枚举(Student, Teacher)。 用户中心服务核心类图 mermaid classDiagram class User { -id: string -username: string -passwordHash: string -name: string -email: string -phone: string -type: UserType // (Student, Teacher, Librarian, Admin) -status: UserStatus // (ACTIVE, INACTIVE, SUSPENDED) -lastLogin: DateTime +login()... +updateProfile()... +changePassword()... } class BorrowHistoryView { -userId: string -recordId: string -bookTitle: string -borrowDate: DateTime -dueDate: DateTime -returnDate: DateTime? -status: string } User --> UserType User --> UserStatus User ..> BorrowHistoryView // 用户拥有借阅历史视图 (读取模型,可能异步更新) 关键点: User 是核心领域对象,存储用户基础信息认证凭据。User.type 决定在图书系统中的权限(通常与角色结合)。User.status 影响能否借阅。 BorrowHistoryView 是读取模型(Read Model),用于高效查询用户的借阅历史。它的数据来源是图书服务生成的借阅事件(事件源/CQRS模式),或通过图书服务的API同步/异步获取。它不包含复杂的业务逻辑。 与图书借阅服务的联系体现在 User.id 被图书服务引用,以及 BorrowHistoryView 的数据来源。 三、 动态行为建模 (序列图 & 状态图) 关键序列图 (微服务间交互) 成功借阅图书序列图: mermaid sequenceDiagram actor Student as Student participant FE as 前端/APP participant AuthSvc as 认证服务 participant UserSvc as 用户中心服务 participant BookSvc as 图书借阅服务 Student->>+FE: 1. 选择图书,点击“借阅” FE->>+AuthSvc: 2. 获取访问令牌 (Bearer Token) AuthSvc-->>-FE: 3. Access Token (JWT) FE->>+BookSvc: 4. POST /api/books/borrow {bookId} (携带Token) BookSvc->>+AuthSvc: 5. (内部) 验证Token有效性 & 获取Claims AuthSvc-->>-BookSvc: 6. UserId, UserType BookSvc->>+UserSvc: 7. GET /api/users/{userId}/status (携带Token/服务间凭证) UserSvc-->>-BookSvc: 8. User Status (e.g., ACTIVE) BookSvc->>BookSvc: 9. 检查规则 (BorrowRule), 锁定库存, 生成BorrowRecord BookSvc->>UserSvc: 10. (可选异步) POST /api/users/{userId}/borrowsync {recordId} 或发送事件 BookSvc-->>-FE: 11. 借阅成功响应 FE-->>Student: 12. 显示借阅成功 核心交互: 步骤5-6:图书服务通过Auth服务验证用户Token并获取用户ID类型。这是安全基础。 步骤7-8:图书服务调用用户中心服务获取用户当前状态(是否激活、是否有未缴罚金等)。 步骤9:图书服务执行核心借阅逻辑(检查规则、锁定库存、创建借阅记录)。 步骤10:图书服务通过API调用或事件通知用户中心服务更新借阅历史视图 (BorrowHistoryView)。这是保证数据最终一致性的关键机制。 关键状态图 (生命周期) 借阅记录 (BorrowRecord.Status) 状态图: mermaid stateDiagram-v2 [*] --> Applied: / 创建记录 Applied --> Borrowed: 库存锁定成功 / 记录状态更新为Borrowed, 设置dueDate Borrowed --> Renewed: 续借请求成功 / 更新dueDate, renewCount+1 Borrowed --> Overdue: dueDate 到达且未归还 / 标记为Overdue, 启动计算罚金 Borrowed --> Returned: 正常归还 / 设置returnDate, 释放库存 Overdue --> Returned: 归还(含罚金) / 设置returnDate, 释放库存, 需处理罚金 Returned --> [*] Renewed --> Borrowed 状态解释: Applied: 初始申请状态。 Borrowed: 库存锁定成功,图书正式借出。 Renewed: 续借成功。它是Borrowed的一个特殊瞬时状态,之后立即回到Borrowed(但dueDate已更新)。 Overdue: 超期未归还状态,触发罚金计算逻辑。 Returned: 图书已归还,事务结束。无论之前状态如何(Borrowed, Renewed, Overdue),最终都转到此状态。 四、 架构设计 (组件图) 展示微服务架构下两个服务的组件及其外部依赖。 mermaid graph LR subgraph 智慧校园微服务系统 subgraph UserCenterSvc[用户中心服务] direction LR UCAuth(Auth Controller) UCUser(User Controller) UCProfile(Profile Service) UCQuery(Query Service) UCDB[(用户数据库)] UCAuth -- JWT --> UCDB UCUser -- 增删改 --> UCDB UCProfile -- 读写 --> UCDB UCQuery ----> UCDB end subgraph BookBorrowSvc[图书借阅服务] direction LR BCBook(Book Controller) BCBorrow(Borrow Controller) BCQuery(Query Controller) BCSvc(Book Borrow Service) BCInteg(Integration Service) --> MessageBus BCDB[(借阅数据库)] BCBook -- 管理 --> BCDB BCSvc -- 核心逻辑 --> BCDB BCQuery -- 查询 --> BCDB end MessageBus[消息总线 e.g., Kafka, RabbitMQ] AuthSvc[身份认证服务] -. 验证 .-> UserCenterSvc PaymentSvc[支付服务] end Student[学生/教师] -. 访问 .-> UserCenterSvc Student[学生/教师] -. 访问 .-> BookBorrowSvc Librarian[图书管理员] -. 管理 .-> BookBorrowSvc SysAdmin[系统管理员] -. 运维 .-> UserCenterSvc SysAdmin[系统管理员] -. 运维 .-> BookBorrowSvc BookBorrowSvc -- HTTP/RPC / gRPC 获取用户信息 --> UserCenterSvc BookBorrowSvc ---> |事件: BookBorrowed, BookReturned| MessageBus UserCenterSvc ---> |订阅事件, 更新视图| MessageBus BookBorrowSvc -- 调用罚金支付接口 --> PaymentSvc 核心要素: 服务边界: 用户中心服务 图书借阅服务 作为独立的微服务部署。 内部组件: 用户中心服务: 包含处理认证、用户管理、个人资料管理的控制器服务层组件,以及数据库。 图书借阅服务: 包含处理图书管理、借还操作、查询的控制器服务层组件,以及集成层组件(处理事件发布/订阅)数据库。 数据库分离: 每个微服务拥有自己的私有数据库。 服务间通信: 同步调用 (HTTP/RPC/gRPC): 图书服务调用用户中心服务API查询用户信息 (GET /api/users/{userId}/status)。 异步事件驱动 (消息总线): 当借阅状态改变 (BookBorrowed, BookReturned, BookOverdue)时,图书服务发布事件到消息总线。用户中心服务的 UCQuery 组件订阅这些事件,异步更新 BorrowHistoryView,实现最终一致性。这是处理跨服务视图更新的常用模式。 外部依赖: 身份认证服务 (AuthSvc): 提供统一的认证能力。 支付服务 (PaymentSvc): 处理罚金支付。 用户交互: 学生/教师通过前端访问两个服务的API。管理员通过管理界面访问后台服务。 **画出所有图
最新发布
06-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值