异步与水平缩放

时间:2015-06-09 11:40:11

标签: asp.net rest asynchronous parallel-processing horizontal-scaling

我正在使用一个使用REST API(JSON)的.net客户端。客户端是具有高流量和大量用户交互的Web应用程序

当围绕外部REST api编写包装器时,我正在尝试决定

  1. 如果我应该为API进行所有调用异步?这将是从UI到API的所有方式,如http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html所述。这将有助于我实现所需的性能,但我将不得不想办法在任务等待完成时处理UI

  2. 或者它是否过度杀伤?我只是使用同步/顺序代码吗?通过水平扩展应用程序,我仍然可以获得(某些)性能吗?

  3. 我很想了解从客户端调用外部REST API的首选方法(如果有的话)以及如何处理用户使用异步的情况下的UI?

1 个答案:

答案 0 :(得分:1)

因此,您在繁忙时段每秒大约有10个请求。这本身不需要异步IO。假设每个请求1秒,即10个线程。 10个帖子 nothing

但是有一个特例:如果您调用的后端服务有时需要很长时间才能响应(错误,重载,索引重建......),该怎么办?如果响应或超时需要30秒才意味着300个请求正在进行中。这对于默认的线程池设置来说太多了。这将通过池耗尽有效地关闭整个应用程序,直到请求被清除。

你可以做两件事:

  1. 对所有高容量操作使用异步IO。
  2. 减少超时,并为正在进行的请求数量设置负载。例如:
  3. SemaphoreSlim sem = new SS(50); //max 50 in-flight
    
    //...
    
    if (!sem.WaitOne(TimeSpan.Zero))
     throw new Exception("Load limit exceeded");
    

    两者都同样安全且性能良好。不要误以为异步IO会导致IO变得更快。

    信号量解决方案需要较少的体系结构更改,但需要删除请求的权限。这些请求无论如何都不会很有可能完成。