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