我有这段代码(不重要的细节是它在AWS的EC2实例上运行,在SQS队列上处理消息)。
方法中的第一条语句通过http获取一些数据,第二条语句将状态保存到本地dynamo数据存储中。
public bool HandleMessage(OrderAcceptedMessage message)
{
var order = _orderHttpClient.GetById(message.OrderId);
_localDynamoRepo.SaveAcceptedOrder(message, order);
return true;
}
性能特征是http往返耗时100-200毫秒,并且发电机写入耗时约10毫秒。
这两个操作都有async
版本。我们可以这样写:
public async Task<bool> HandleMessage(OrderAcceptedMessage message)
{
var order = await _orderHttpClient.GetByIdAsync(message.OrderId);
await _localDynamoRepo.SaveAcceptedOrderAsync(message, order);
return true;
}
因此指导意见是,由于第一个操作“可能需要50毫秒以上的时间才能执行”,因此应使用异步并等待。(1)
但是第二,快速操作呢?这两个参数中哪一个是正确的:
不要使其异步:它不符合50ms标准,因此不值得这样做。
使其异步:上一步操作已经支付了开销。已经有基于任务的异步发生,值得使用它。
1)http://blog.stephencleary.com/2013/04/ui-guidelines-for-async.html
不重要的细节是它在AWS的EC2实例上运行,在SQS队列上处理消息
实际上,我认为这是一个重要的细节。因为这不是UI应用程序,这是一个服务器应用程序。
指导意见是,由于第一个操作“可能需要50毫秒以上的时间才能执行”
本指南仅适用于UI应用程序。因此,50ms准则在这里毫无意义。
这两个参数中哪一个是正确的
异步与速度无关。这是关于释放线程。UI应用程序的50ms指导原则就是释放UI线程。在服务器端,这async
是关于释放线程池线程的。
问题是您想要/需要多少可扩展性?如果您的后端是可伸缩的,则通常建议您使用async
,因为这样可以释放线程池线程。这使您的Web应用程序更具可扩展性,并且能够更快地响应负载变化。但这只有在后端可以与Web应用程序一起扩展时才给您带来好处。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句