0

我正在创建一个 WCF Web 服务,它包装对另一个远程 API 的调用,并且是收费的。

我想让它成为一个同步服务以方便客户端,并且因为 99% 的时间,远程 API 会快速响应,因此客户端不会有明显的延迟。

我也想让服务收费。客户将能够在他们的账户上存入资金,如果成功,每次服务电话都将被收取费用。

显然,我需要确保当每个请求进来时,账户上都有足够的钱来进行通话。

我的计划和当前原型执行以下操作:

  • 调用 Store Procedure 来检查 Client 的余额,如果足够,则扣除此请求所需的金额。这个 SProc 包含一个事务并使用 ROWLOCK 和 HOLDLOCK 来确保客户端的余额一次只能读取/更新一个。
  • 如果成功充电,请执行所需的操作/远程 API 调用。
  • 如果操作/远程 API 失败,则将金额退还给客户的余额(再次交易,锁定更新 SProc)
  • 如果一切正常,在数据库中将调用标记为完成

通过这样做,我可以允许客户端发出并发请求,唯一的瓶颈(我认为!)是在余额检查期间。

我的想法是,将整个调用包装在 ac#Transaction 中意味着客户端一次只能进行一个调用。

谁能预见这种机制的任何问题,或提出更好的设计方法?

我可以看到的一个问题是,如果第一部分完成并且向客户收费,但是在操作/远程 API 调用期间发生了灾难性的事情并且没有发生退款,那么对于不完整的调用将会产生费用。我将能够检测到这些,因为没有针对呼叫的 Complete 或 Refunded 标记,并且必须“离线”处理它们。

4

0 回答 0