仅对相同用户进行同步任务处理
本文关键字:同步 任务处理 用户 | 更新日期: 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的情况下),因为不可预测的线程池回收。
您需要的是在数据库级别使用事务。在交易启动和账户锁定后,应该检查余额,然后可以进行适当的更改。