【问题标题】:Make .net web api queue requests operate 'single threaded'使 .net web api 队列请求运行“单线程”
【发布时间】:2015-07-20 15:21:16
【问题描述】:

我们有一个 c# .net Web API 服务调用代码,它一次不能处理多个数据库请求。该系统适用于需求相对较小的账单在线支付。

我们无法控制代码来进行可以解决问题的更改。使用相同代码的另一组使用 WCF API 和服务配置将并发请求限制为 1,有效地解决了该问题。我们现在必须在 WCF 中重新编写或弄清楚如何使 Web API 工作。

有没有办法让 Web API 将请求排队并一次处理一个,同时仍然为最终用户保持“实时”运行?

对不起,如果这含糊不清,我代表实际的程序员询问,希望能提供帮助。

【问题讨论】:

  • “仍然保持‘实时’运行”是什么意思?你在处理同步应用程序吗?有一个maxConcurrentRequestsPerCPU 设置<applicationPool> 可以解决问题。

标签: .net asp.net-web-api


【解决方案1】:

我知道的唯一方法是“自己动手”。 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";
...

这实现起来既快速又容易——但是你会牺牲一些可靠性——例如参见Fire and Forget with ASP.NET MVC。它也不能很好地扩展(如果会看到请求并且你会打开太多并行线程,它会有效地关闭你的 API 服务

【讨论】:

    猜你喜欢
    • 2021-10-30
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    • 2010-11-04
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多