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
<think>嗯,用户让我为智慧校园微服务的简易图书借阅服务用户中心服务设计详细的UML建模方案。用户之前已经提供了非常具体的要求,包括需要绘制用例图、活动图、类图、序列图、状态图组件图,并且特别强调要参考微服务架构的特点。用户可能是一位系统分析师或软件工程专业的学生,正在完成一个重要的课程项目或工作设计任务。ta需要专业且完整的建模方案,同时要体现微服务架构的核心原则。从ta反复强调“松耦合”“服务自治”等术语来看,对分布式系统设计有基本认知。回顾上次回复,我已完成基础建模框架,但需要特别强化三个关键点:第一是微服务特有的交互模式,比如序列图中要明确展示服务间调用(HTTP/RPC)事件驱动机制;第二是数据一致性问题,这在借阅状态更新时尤为突出;第三是安全控制,特别是用户中心服务的认证如何被其他服务调用。在类图设计上,需要区分两个服务的领域模型边界。图书服务的核心是BorrowRecord聚合根,它管理着借阅生命周期;用户服务的核心是User实体,但要注意其借阅历史视图是弱一致性数据。这点在[^1]引用中被强调:静态模型要明确类之间的关系。活动图选用“借阅流程”作为核心案例很合适,因为它能串联用户状态检查(跨服务调用)、库存操作、事件发布等关键步骤。不过需补充异常流处理,比如当用户服务不可用时的降级方案——这符合[^2]提到的开闭原则,通过扩展机制应对变化。组件图要突出技术实现选择。消息总线(如Kafka)的引入解决了跨服务数据同步问题,是微服务解耦的关键手段。但需在说明中指出这是一种最终一致性方案,可能延迟更新借阅历史视图。最后生成的问题都围绕分布式系统设计痛点:原子性用Saga模式替代传统事务,RBAC在微服务的实现方式(是否需单独授权服务),状态转移的触发机制(定时任务VS事件驱动)。这些问题都源于实际建模过程中的技术权衡点。</think> 以下是为智慧校园微服务的**简易图书借阅服务****用户中心服务**设计的完整UML建模方案,严格遵循需求分析与微服务架构原则: --- ### **一、需求分析与业务建模** #### 1. 用例图 (跨服务交互) ```mermaid graph TD subgraph 用户中心服务 UC1[登录] UC2[查看个人信息] UC3[修改基本信息] end subgraph 图书借阅服务 B1[检索图书] B2[发起借阅] B3[归还图书] B4[查看借阅记录] B5[管理图书] -.仅管理员.- end Student(学生) --> UC1 Student --> B1 & B2 & B3 & B4 Librarian(图书管理员) --> B5 Teacher(教师) --> B1 & B2 & B3 UC1 -.包含.-> Auth[认证服务] B2 -.扩展.-> Fine[缴纳罚金] B3 -.扩展.-> Remind[到期提醒] B4 -.依赖.-> UC3[用户服务] ``` **说明**: - **跨服务调用**:`查看借阅记录`需通过用户中心服务验证身份(依赖关系- **扩展点**:超期归还触发罚金流程(扩展关系- **安全边界**:图书管理功能仅限管理员(约束标注) - **服务解耦**:登录认证由独立服务处理(包含关系)[^1] #### 2. 活动图 (关键流程:图书借阅) ```mermaid graph TD start((开始)) --> A[学生登录系统] A --> B[检索目标图书] B --> C{库存>0?} C -->|是| D[用户中心验证账户状态] C -->|否| E[返回“无库存”提示] D --> F{状态有效?} F -->|是| G[锁定库存] F -->|否| H[返回“账户异常”] G --> I[生成借阅记录] I --> J[更新用户借阅历史] J --> K((结束)) swimlane 用户中心服务 D --> D1[查询账户状态] J --> J1[异步更新视图] swimlane 图书服务 G --> G1[减少可用库存] ``` **核心设计**: - **泳道隔离**:明确用户中心与图书服务的职责边界 - **库存锁定**:在生成借阅记录前完成原子操作(防超卖) - **最终一致性**:用户借阅历史通过异步事件更新(微服务典型模式)[^2] --- ### **二、静态结构建模** #### 类图 (核心领域模型) ```mermaid classDiagram class 用户中心服务 { +User +UserProfile } class 图书服务 { +Book +BorrowRecord +Inventory } User "1" *-- "1" UserProfile : 组合 User : +string userId User : +UserType type User : +checkStatus() bool Book : +string isbn Book : +string title Book : +int totalCopies BorrowRecord "1" *-- "1" Book : 关联 BorrowRecord : +DateTime borrowDate BorrowRecord : +changeState() Inventory "1" ◊-- "*" Book : 聚合 Inventory : +lockStock() ``` **领域对象关系**: 1. **组合关系**:用户与其档案的强生命周期绑定 2. **聚合关系**:库存管理聚合多个图书实体 3. **状态封装**:借阅记录内置状态机管理生命周期 4. **微服务边界**:两个服务通过`userId`弱关联(非直接引用) --- ### **三、动态行为建模** #### 1. 序列图 (跨服务调用:借阅操作) ```mermaid sequenceDiagram participant S as 学生 participant B as 图书服务 participant U as 用户中心服务 S ->> B: 提交借阅请求(isbn) B ->> U: 获取用户状态(userId) U -->> B: ACTIVE B ->> B: 执行库存锁定 B ->> B: 生成BorrowRecord B ->> U: 发送借阅事件(异步) U ->> U: 更新用户借阅视图 B -->> S: 返回借阅成功 ``` **关键交互**: - **同步调用**:实时验证用户状态 - **异步事件**:借阅成功事件解耦数据更新 - **事务边界**:库存锁定与记录生成在同一事务内[^1] #### 2. 状态图 (借阅记录生命周期) ```mermaid stateDiagram-v2 [*] --> CREATED: 创建记录 CREATED --> BORROWED: 库存锁定成功 BORROWED --> RETURNED: 按时归还 BORROWED --> OVERDUE: 超期未归还 OVERDUE --> RETURNED: 补缴罚金归还 RETURNED --> [*] BORROWED --> RENEWED: 续借请求 RENEWED --> BORROWED: 续借成功 ``` **状态转移规则**: - **守卫条件**:`续借成功`需满足 $$ \text{剩余可续借次数} > 0 $$ - **自动触发**:`OVERDUE`状态由定时批处理检测 - **最终状态**:所有路径收敛至`RETURNED` --- ### **四、架构设计 (组件图)** ```mermaid graph LR subgraph SCM[智慧校园微服务] direction TB UC[用户中心服务] -->|HTTP API| Auth[认证服务] BK[图书借阅服务] -->|消息订阅| BUS[消息总线] UC -->|事件消费| BUS AS[活动服务] -->|服务发现| REG[注册中心] end WEB[前端] --> UC WEB --> BK WEB --> AS BK -.->|gRPC| UC:获取用户信息 ``` **架构特性**: 1. **服务自治**:每个服务独立数据库(用户库/图书库) 2. **松耦合交互**: - 同步调用:gRPC实现高效服务间通信 - 异步协作:消息总线处理跨领域事件 3. **基础设施**: - 注册中心实现服务发现 - API网关统一接入前端请求 --- ### **五、微服务设计原则实现** | 原则 | 实现方案 | |------|----------| |**单一职责**| 用户中心仅管理身份数据,图书服务处理借阅业务 | |**数据库隔离**| 用户中心DB存储认证信息,图书服务DB管理库存 | |**最终一致性**| 通过事件总线异步更新用户借阅视图 | |**服务契约**| gRPC协议明确定义`GetUserStatus`接口参数 | |**弹性设计**| 库存锁定失败自动回滚事务[^2] | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值