sequenceDiagram
participant from as 转出方
participant to as 转入方
participant MQ
rect rgb(255, 228, 196)
Note over from,to: 扣款成功,充值成功
end
from->>to: 扣款成功
to->>from: 充值成功
Note over from: 流程结束
rect rgb(255, 228, 196)
Note over from,to: 扣款成功,充值失败,重试成功
end
from->>to: 扣款成功
to->>from: 充值失败
from->>MQ: 推送消息
MQ->>to: 发起重试
to->>from: 重试成功
Note over from: 流程结束
rect rgb(255, 228, 196)
Note over from,to: 扣款成功,充值失败,重试失败,退款
end
from->>to: 扣款成功
to->>from: 充值失败
from->>MQ: 推送消息
MQ->>to: 发起重试
to->>from: 重试失败
from->>from: 退款
Note over from: 流程结束
sequenceDiagram
participant from as 转出方
participant Migrated as 迁移关系
participant to as 转入方
participant MQ
participant MQConsumer
Note over from,to: 查询转入方、转出方迁移关系
rect DodgerBlue
from->> Migrated: 查询迁移关系
Migrated->>from: 返回迁移关系
from ->> from:判断转出方实际抵扣账户
end
rect DodgerBlue
to->>Migrated: 查询迁移关系
Migrated->>to: 返回迁移关系
to ->> to:判断转出方实际抵扣账户
end
Note over from,to: 扣款成功,充值成功
from->>to: 使用迁移后的转出方扣款
to->>from: 使用迁移后的转入方充值
Note over from: .......
实际全流程:
sequenceDiagram
participant user as 用户
participant fromA as 转出账户A
participant fromB as 转出账户A'
participant toA as 充值账户B
participant toB as 充值账户B'
participant Migrated as 迁移关系
participant MQ
rect Bisque
user ->> fromA: 发起转账请求
end
Note over fromA: 查询转出方迁移关系
alt 未迁移
fromA->>fromA: 扣原账户
else 已经迁移
fromB->>fromB: 扣迁移账户
else 迁移中
Note over fromB: 流程结束
end
rect Bisque
fromB->>toA: 充值
end
Note over toA: 查询转入方迁移关系
alt 未迁移
toA->>toA: 充原账户
else 已经迁移
toB->>toB: 充迁移账户
else 迁移中
toB->> MQ: 推送 MQ 重试
Note over toB: 流程结束
end
Note over toA: 查询转入方迁移关系
alt 充值成功
Note over toB: 流程结束
else 充值失败
toB ->> MQ: 推送MQ 重试
Note over fromB: 流程结束
end
Note over MQConsumer: 重试逻辑
MQConsumer ->> MQ: 查询数据
MQ -->> MQConsumer: 存在重试数据
rect Bisque
MQConsumer ->>user : 发起重试
end
user ->> toA: 重试充值
alt 重试成功
Note over toB: 重写充值流水,流程结束
else 重试失败
user ->> fromB: 对转出方进行退款,写退款流水
Note over fromB: 流程结束
end
背景三:扣内存数据库逻辑
为了支持高并发的需求,账户系统使用的是一个自研的缓存数据库,数据库内部有诸多逻辑,其中操作账户时,会先 get 数据,再 set 数据, get 的时候会拿到当前数据的的时间戳 和更新序列号,set 的时候,数据库会校验这个时间戳的合法性。