前言
Coming Chat 开发了基于 aptos 链的红包合约,并实现了 app 内的 aptos 红包功能。本文将介绍后端红包服务的整体架构设计。
架构图
流程图
创建红包:调用合约create方法,参数:operator(创建人), count(红包数量), total_balance(红包金额),得到extrinsic hash,将红包数据存入数据库,缓存红包数量,红包数据,预先分配的红包金额,另起协程调用aptos api 查询交易状态到 redis
红包创建状态:取redis红包创建状态
抢红包:取redis红包数据,判断是否还有红包剩余,有返回可抢状态,没有返回
拆红包:取redis红包数据,判断是否红包还有剩余,有红包数量减一,更新红包剩余数量,剩余金额等到数据中和redis中,该用户抢到红包,将数据放入kafka,没有返回失败状态
job
1.同步aptos浏览器红包数据
创建红包交易成功之后,合约里会生成一条红包数据,浏览器调用https://fullnode.devnet.aptoslabs.com/v1/spec#/operations/get_events_by_event_handle,拿到合约中新创建的红包数据入库。
该job从Aptos浏览器数据库中同步新增的红包数据,根据extrinsic hash查询对应的red_packet_id,更新到服务端数据库中,标记该红包数据为可结算状态
2.kafka consumer 用户抢到的红包数据入库
该job是消费records数据的消费者,将用户抢到的红包数据消费存到数据库中
3.调用aptos 红包合约,结算红包
获取当前所有可结算的红包,查询当前红包的领取数据,
1)红包被领取完或者红包已经超时,调用aptos 红包合约的open方法,进行结算。
open(operator, id, luck_accounts, balances)
operator: comingChat admin
id:红包id,red_packet_id
luck_accounts:当前需要结算的所有账户地址
balances:地址所对应的金额
2)红包结算完成:调用aptos 红包合约的close方法,关闭红包
close(operator, id)
operator:comingChat admin
id:红包id,red_packet_id