我们有一个 c# .net Web API 服务调用代码,该代码无法一次处理多个数据库请求。该系统适用于需求相对较小的账单在线支付。
我们无法控制代码来进行可以解决问题的更改。另一个使用相同代码的小组使用 WCF API 和服务配置将并发请求限制为 1,有效解决了该问题。我们现在必须在 WCF 中重新编写或弄清楚如何使 Web API 工作。
有没有一种方法可以让 Web API 对请求进行排队并一次处理一个请求,同时仍然为最终用户保持“实时”运行?
抱歉,如果这很模糊,我代表实际的程序员询问,希望能有所帮助。
我知道的唯一方法就是“自己动手”。 IE。 :
- 将您提供请求的部分移动到某个共享组件(如果您还没有这样的组件)
- 在持久存储(db、cloud ...)中创建一个表用于排队操作,将传入的请求存储在那里(应该很容易实现,因为请求必须以某种方式可序列化 - 我会选择 xml 进行持久存储)
- 更改您的服务,这样它不会处理请求,而是验证请求并将请求存储到持久存储(db)中并返回
- 创建用于异步处理请求的新程序集(如果您使用的是 Windows 基础架构,则通常是窗口服务),该程序集将一次从持久存储 (db) 中获取一个请求,处理它们并记录失败
或者,您可以更改服务以使用“即发即忘”模式和“锁定”语句来限制对支付部分的访问 - 例如:
private static object s_SyncRoot = new object();
...
new Task(() =>
{
lock (s_SyncRoot)
{
// process payment - single thread
}
}).Start();
return "ok";
...
这是快速且容易实现的 - 但是你会牺牲一点可靠性 - 例如参见使用 ASP.NET MVC 即发即忘 https://stackoverflow.com/questions/6374860/fire-and-forget-with-asp-net-mvc。而且它的扩展性也不好(如果有请求,并且您将打开太多并行线程,它可以有效地降低您的 API 服务)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)