我正在使用一个使用REST API(JSON)的.net客户端。客户端是具有高流量和大量用户交互的Web应用程序
当围绕外部REST api编写包装器时,我正在尝试决定
如果我应该为API进行所有调用异步?这将是从UI到API的所有方式,如http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html所述。这将有助于我实现所需的性能,但我将不得不想办法在任务等待完成时处理UI
或者它是否过度杀伤?我只是使用同步/顺序代码吗?通过水平扩展应用程序,我仍然可以获得(某些)性能吗?
我很想了解从客户端调用外部REST API的首选方法(如果有的话)以及如何处理用户使用异步的情况下的UI?
答案 0 :(得分:1)
因此,您在繁忙时段每秒大约有10个请求。这本身不需要异步IO。假设每个请求1秒,即10个线程。 10个帖子 nothing 。
但是有一个特例:如果您调用的后端服务有时需要很长时间才能响应(错误,重载,索引重建......),该怎么办?如果响应或超时需要30秒才意味着300个请求正在进行中。这对于默认的线程池设置来说太多了。这将通过池耗尽有效地关闭整个应用程序,直到请求被清除。
你可以做两件事:
SemaphoreSlim sem = new SS(50); //max 50 in-flight
//...
if (!sem.WaitOne(TimeSpan.Zero))
throw new Exception("Load limit exceeded");
两者都同样安全且性能良好。不要误以为异步IO会导致IO变得更快。
信号量解决方案需要较少的体系结构更改,但需要删除请求的权限。这些请求无论如何都不会很有可能完成。