NEST异步调用

时间:2016-03-15 17:11:45

标签: c# asp.net-web-api elasticsearch nest nest2

根据this link,NEST 2.0的内部结构刚刚转向完全成熟的异步/等待实现。

这是否意味着NEST 2.0内部以完全异步方式工作?

如果没有,我们在调用NEST API时应该使用异步吗?

1 个答案:

答案 0 :(得分:2)

异步调用的内部结构已经使用基于任务并行库(TPL)的方法重写,以使用async / await。这使得简化异常和错误处理方法变得更加容易,尽管旧的TPL和新的异步/等待方法都是异步的(只要暴露异步方法)。

我们以GetAsync<T>()为例。通话管道是:

  1. IElasticClient.LowLevelDispatch.GetDispatchAsync<GetResponse<T>>()
  2. IElasticLowLevelClient.GetAsync<T>(),其中包含从上一次调用中提取的路线值
  3. IElasticLowLevelClient.DoRequestAsync<T>(),一种调用ITransport的请求异步方法的通用请求调度方法
  4. ITransport.RequestAsync<T>(),默认Transport<TConnectionSettings>将:

    1. 使用IRequestPipeline创建IRequestPipelineFactory。默认值为RequestPipeline
    2. 如果RequestPipeline.SniffAsync()支持嗅探,则在第一个池使用时
    3. IConnectionPoolWaitAsync()执行SemaphoreSlim此处阻止,同时发生第一次嗅探。
    4. 从群集中选择一个节点并应用以下调用:

        如果群集已被标记为陈旧过时
      1. RequestPipeline.SniffOnStaleClusterAsync()
      2. RequestPipeline.PingAsync()以确保节点可以被ping通
      3. 使用RequestPipline.CallElasticsearchAsync<TReturn>()调用Elasticsearch,在创建ElasticClient时使用IConnection传递给ConnectionSettings以使用IConnection.RequestAsync<TReturn>()发出请求。 .NET 4.5 +中的默认IConnection(即全脂 CLR)为HttpConnection。在内部,HttpConnection使用HttpWebRequest来发出实际请求:

        1. 使用HttpWebRequest.GetRequestStreamAsync()
        2. 获取请求流
        3. 如有必要,使用PostData<T>.WriteAsync()
        4. 将数据写入请求流
        5. 使用HttpWebRequest.GetResponseAsync()
        6. 发出HTTP请求
        7. 使用响应构建器ResponseBuilder<TReturn>.ToResponseAsync()从响应流构建有意义的响应。在此处,响应将被反序列化为TReturn;对于大多数json响应,这将使用IElasticsearchSerializer.DerserializeAsync<TReturn>()反序列化响应。对于使用Json.NET的默认json序列化程序,没有异步反序列化方法,因此异步版本只包含同步反序列化调用。
  5. 这是对发生的事情的简要总结,希望它有所帮助:)