【问题标题】:Equalize / Standardize response time of a web api call均衡/标准化 Web api 调用的响应时间
【发布时间】:2012-07-12 16:39:27
【问题描述】:

我想将我的 api 响应平均为每次调用 2 秒。你认为这是正确的做法吗(vb.net 代码)...


Dim timeToSleep = 2000 - Date.Now.Subtract(start).TotalMilliseconds

''代码在这里执行...

如果 timeToSleep > 0 则 Threading.Thread.Sleep(timeToSleep)


Threading.Thread.Sleep 函数是否只阻塞这个 api 请求?如果其他人在 Sleep 函数执行时点击了 api 请求怎么办?

我应该这样做有更好的方法吗?

谢谢。

【问题讨论】:

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


    【解决方案1】:

    虽然我认为这仅在测试场景(负载测试/用户接受测试)中有用,以模拟自然延迟,并且此代码永远不会接触生产,但这将起作用,并且您的调用将被延迟,而其他呼叫可以运行。 问题是你阻塞了哪个线程:

    如果您返回一个普通对象或HttpResponseMessage,您的调用将阻塞 ASP.NET 的线程池,我认为在 IIS 7 中该线程池为 1000。任何更多请求并且您的服务器返回 503 错误。

    如果您返回 Task<T>,那么您将阻塞 .NET 的 ThreadPool 线程 - 除非您指定使用另一个线程池的调度程序。此池中的线程数将在min 和max 之间波动,可以使用ThreadPool 的静态方法设置。

    我的blog 上有几篇关于这个主题的帖子。

    【讨论】:

      【解决方案2】:

      Threading.Thread.Sleep 函数是否只阻塞这个 api 请求? 如果在 Sleep 函数运行时其他人点击了 api 请求怎么办 执行?

      请记住,虽然您可能会尝试通过使用睡眠来调整您的 api 调用的相对输出时间,但当延迟、处理、其他导致缓慢/考虑到快速响应时间等。

      我应该这样做有更好的方法吗?

      如果有的话,我会说微调您的 api 调用,使其尽可能快速和轻量级,然后在调用它时在客户端执行间隔。 (除非我误解了你为什么要这样做。)

      另外,您可能想研究一个长轮询解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-09
        • 1970-01-01
        • 1970-01-01
        • 2015-07-29
        • 2015-07-15
        • 2015-07-11
        • 2022-01-20
        相关资源
        最近更新 更多