仅对相同用户进行同步任务处理

本文关键字:同步 任务处理 用户 | 更新日期: 2023-09-27 18:14:14

我有一个web api处理支付(和管理用户帐户)从不同的渠道。我面临的问题是,如果同一用户从不同的渠道进行交易-帐户&平衡性很差

考虑这个场景在一秒钟内发生,并且执行时间重叠:

  • R1 - User1撤回100
  • R2 - User2撤回10
  • R3 - User1撤回50
  • R4 - User3撤回20
  • R5 - User2撤回100
  • R6 - User4提取20

那是因为所有的账目都是同时处理的,结果是灾难性的。我介绍了线程锁定(lock &Monitor/TryEnter),但这将意味着所有请求都在一个队列中。即使User4与其他请求没有任何关系,它也必须等待所有其他请求完成。

public class PaymentProcessor
{
    private static object _lockobject = new object();
    public void process() {
        if (Monitor.TryEnter(_lockobject, TimeSpan.FromSeconds(5)))
        {
            ProcessRequest(xmlData); //ignore xmlData
            Monitor.Exit(_lockobject);
        }
    }
}

理想情况下,我希望User1 &User2请求和rest同时处理。

理想的队列

  • R1、R3
  • R2, R5
  • R3
  • R4

我如何做到这一点?

欢呼

仅对相同用户进行同步任务处理

在WebApi代码级别锁定对帐户的访问绝对是错误的方式。这会降低性能,使系统在面对恶意请求时失去防御能力。更糟糕的是,这绝对不可靠(例如,在使用IIS的情况下),因为不可预测的线程池回收。

您需要的是在数据库级别使用事务。在交易启动和账户锁定后,应该检查余额,然后可以进行适当的更改。