具有长期运行的可收费Web服务 - 交易设计

时间:2012-04-28 11:15:51

标签: c# sql-server wcf web-services transactions

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

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

我也想让这项服务收费。客户可以在他们的帐户上存款,如果成功,将会收取每个服务电话。

显然,我需要确保在每次请求进入时,都会有足够的资金来拨打电话。

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

  • 调用存储过程以检查客户的余额,如果足够,则扣除此请求所需的金额。此SProc包含一个事务,并使用ROWLOCK和HOLDLOCK确保仅一次读取/更新客户端的余额。
  • 如果设法收费,请执行所需的操作/远程API调用。
  • 如果操作/远程API失败,请将金额退还给客户的余额(再次为交易,锁定更新SProc)
  • 如果一切正常,请在数据库
  • 中将呼叫标记为已完成

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

我的思维过程是将整个呼叫包含在c#Transaction中意味着客户端一次只能拨打一个电话。

任何人都可以预见到这种机制存在任何问题,或者提出更好的设计方法吗?

我可以看到的一个问题是,如果第一部分完成并且客户收费,但在操作/远程API调用期间发生了某些灾难性并且没有进行退款将发生不完整的电话。我可以检测到这些,因为没有完成或退款的标记,并且必须“离线”处理它们。

0 个答案:

没有答案