NEST 异步调用

NEST async call

根据 this link,NEST 2.0 内部结构刚刚转移到完全成熟的 async/await 实现。

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

如果不是,调用 NEST 时是否使用 async API?

异步调用的内部结构已从使用基于任务并行库 (TPL) 的方法重写为使用 async/await。这使得简化异常和错误处理方法变得更加容易,尽管旧的 TPL 和新的 async/await 方法都是异步的(就公开的异步方法而言)。

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

  1. IElasticClient.LowLevelDispatch.GetDispatchAsync<GetResponse<T>>()
  2. IElasticLowLevelClient.GetAsync<T>() 具有从上一次调用中提取的路由值
  3. IElasticLowLevelClient.DoRequestAsync<T>(),调用ITransport的请求异步方法
  4. 的通用请求调度方法
  5. ITransport.RequestAsync<T>(),默认情况下 Transport<TConnectionSettings> 将:

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

      1. RequestPipeline.SniffOnStaleClusterAsync() 如果集群之前被标记为陈旧
      2. RequestPipeline.PingAsync()确保节点能ping通
      3. 使用 RequestPipline.CallElasticsearchAsync<TReturn>() 调用 Elasticsearch,这将使用 IConnection 在创建 ElasticClient 时传递给 ConnectionSettings 以使用 [=29= 发出请求]. .NET 4.5 +(即 full fat CLR)中的默认 IConnectionHttpConnection。在内部,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 序列化程序,没有异步反序列化方法,因此异步版本只是简单地包装了同步反序列化调用。

这是对所发生情况的简要总结,希望对您有所帮助:)