2

我正在开发一个使用 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. 或者这是一个矫枉过正?我只使用同步/顺序代码吗?我仍然可以通过水平扩展应用程序来获得(一些)性能吗?

我很想了解从客户端(如果有的话)调用外部 REST api 的首选方式是什么,以及在人们使用异步的情况下如何处理 UI?

4

1 回答 1

1

因此,在繁忙时期,您每秒大约有 10 个请求。这本身不需要异步 IO。假设每个请求 1 秒,即 10 个线程。10个线程什么都不是。

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

你可以做两件事:

  1. 对所有大容量操作使用异步 IO。
  2. 减少超时并为正在进行的请求数量设置负载断路器。例子:

.

SemaphoreSlim sem = new SS(50); //max 50 in-flight

//...

if (!sem.WaitOne(TimeSpan.Zero))
 throw new Exception("Load limit exceeded");

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

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

于 2015-06-09T14:43:43.820 回答