我正在创建一个 WCF Web 服务,它包装对另一个远程 API 的调用,并且是收费的。
我想让它成为一个同步服务以方便客户端,并且因为 99% 的时间,远程 API 会快速响应,因此客户端不会有明显的延迟。
我也想让服务收费。客户将能够在他们的账户上存入资金,如果成功,每次服务电话都将被收取费用。
显然,我需要确保当每个请求进来时,账户上都有足够的钱来进行通话。
我的计划和当前原型执行以下操作:
- 调用 Store Procedure 来检查 Client 的余额,如果足够,则扣除此请求所需的金额。这个 SProc 包含一个事务并使用 ROWLOCK 和 HOLDLOCK 来确保客户端的余额一次只能读取/更新一个。
- 如果成功充电,请执行所需的操作/远程 API 调用。
- 如果操作/远程 API 失败,则将金额退还给客户的余额(再次交易,锁定更新 SProc)
- 如果一切正常,在数据库中将调用标记为完成
通过这样做,我可以允许客户端发出并发请求,唯一的瓶颈(我认为!)是在余额检查期间。
我的想法是,将整个调用包装在 ac#Transaction 中意味着客户端一次只能进行一个调用。
谁能预见这种机制的任何问题,或提出更好的设计方法?
我可以看到的一个问题是,如果第一部分完成并且向客户收费,但是在操作/远程 API 调用期间发生了灾难性的事情并且没有发生退款,那么对于不完整的调用将会产生费用。我将能够检测到这些,因为没有针对呼叫的 Complete 或 Refunded 标记,并且必须“离线”处理它们。