2

我工作.NET客户端消耗一个REST API(JSON)上。客户端是高流量和可观的用户交互的web应用程序异步VS水平缩放

当写周围的外部REST API的包装我试图决定

  1. 如果我应该做的API异步进行的所有通话?这将从UI到API的所有方式,如此处所述http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html。这将帮助我实现理想的性能,但是当任务等待完成时,我将不得不找出一种处理UI的方法。

  2. 或者这是否是一种矫枉过正?我只使用同步/顺序代码?我仍然可以通过水平缩放应用程序来获得(某些)性能?

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

+0

同时运行多少个请求?或者,您需要每秒处理多少个请求,以及他们需要多长时间? – usr

+0

在最繁忙的时期(出售),典型的负载将是每5分钟2700个独特请求或每分钟500个左右。在销售期间的任何时候,我们预计有170个在线用户。 至于他们需要多久,其基本上是一个库存页面,用户将看到最新的库存,所以它只是一个数据库读取API的操作,返回的记录将在每次调用150个区域。对不起,如果这不能回答你的问题。谢谢 –

回答

1

所以,你必须在一个繁忙的时期大约每秒10个请求。这本身不需要异步IO。假设每个请求有1个线程为1个线程。 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变得更快。

信号灯解决方案需要更少的体系结构的变化,但它需要许可下降请求。这些请求不会以高可能性完成。

+0

感谢您的回复。说得通。我在这个API调用之上有一个断路器实现,超时和阈值是我们在装载到一个合理的数字时配置的。在等待请求完成时如何处理用户界面的任何想法?我可以使用什么策略?假设用户在库存页面上应用了一些过滤器,并且部分工作流程是将过滤器应用于最新的数据集。在这些情况下,我如何处理异步调用? –

+0

我没有看到您遇到的特定问题。为什么用户界面在超载的情况下需要特殊处理?显示错误。 – usr