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>()
为例。调用管道是:
IElasticClient.LowLevelDispatch.GetDispatchAsync<GetResponse<T>>()
IElasticLowLevelClient.GetAsync<T>()
具有从上一次调用中提取的路由值
IElasticLowLevelClient.DoRequestAsync<T>()
,调用ITransport
的请求异步方法 的通用请求调度方法
ITransport.RequestAsync<T>()
,默认情况下 Transport<TConnectionSettings>
将:
- 使用
IRequestPipelineFactory
创建一个 IRequestPipeline
。默认为 RequestPipeline
RequestPipeline.SniffAsync()
如果 IConnectionPool
支持嗅探,则首次使用池。 WaitAsync()
在 SemaphoreSlim
上执行以在第一次嗅探发生时阻塞。
从集群中选择了一个节点,并应用了以下调用:
RequestPipeline.SniffOnStaleClusterAsync()
如果集群之前被标记为陈旧
RequestPipeline.PingAsync()
确保节点能ping通
使用 RequestPipline.CallElasticsearchAsync<TReturn>()
调用 Elasticsearch,这将使用 IConnection
在创建 ElasticClient 时传递给 ConnectionSettings
以使用 [=29= 发出请求]. .NET 4.5 +(即 full fat CLR)中的默认 IConnection
是 HttpConnection
。在内部,HttpConnection
使用 HttpWebRequest
发出实际请求:
- 通过
HttpWebRequest.GetRequestStreamAsync()
获取请求流
- 必要时使用
PostData<T>.WriteAsync()
将数据写入请求流
- 使用
HttpWebRequest.GetResponseAsync()
发出 HTTP 请求
- 使用响应构建器从响应流构建有意义的响应,
ResponseBuilder<TReturn>.ToResponseAsync()
。在这里,响应将被反序列化为 TReturn
;对于大多数 json 的响应,这将使用 IElasticsearchSerializer.DerserializeAsync<TReturn>()
来反序列化响应。对于使用 Json.NET 的默认 json 序列化程序,没有异步反序列化方法,因此异步版本只是简单地包装了同步反序列化调用。
这是对所发生情况的简要总结,希望对您有所帮助:)
根据 this link,NEST 2.0 内部结构刚刚转移到完全成熟的 async/await 实现。
这是否意味着 NEST 2.0 在内部以完全异步的方式工作?
如果不是,调用 NEST 时是否使用 async API?
异步调用的内部结构已从使用基于任务并行库 (TPL) 的方法重写为使用 async/await。这使得简化异常和错误处理方法变得更加容易,尽管旧的 TPL 和新的 async/await 方法都是异步的(就公开的异步方法而言)。
我们以GetAsync<T>()
为例。调用管道是:
IElasticClient.LowLevelDispatch.GetDispatchAsync<GetResponse<T>>()
IElasticLowLevelClient.GetAsync<T>()
具有从上一次调用中提取的路由值IElasticLowLevelClient.DoRequestAsync<T>()
,调用ITransport
的请求异步方法 的通用请求调度方法
ITransport.RequestAsync<T>()
,默认情况下Transport<TConnectionSettings>
将:- 使用
IRequestPipelineFactory
创建一个IRequestPipeline
。默认为RequestPipeline
RequestPipeline.SniffAsync()
如果IConnectionPool
支持嗅探,则首次使用池。WaitAsync()
在SemaphoreSlim
上执行以在第一次嗅探发生时阻塞。从集群中选择了一个节点,并应用了以下调用:
RequestPipeline.SniffOnStaleClusterAsync()
如果集群之前被标记为陈旧RequestPipeline.PingAsync()
确保节点能ping通使用
RequestPipline.CallElasticsearchAsync<TReturn>()
调用 Elasticsearch,这将使用IConnection
在创建 ElasticClient 时传递给ConnectionSettings
以使用 [=29= 发出请求]. .NET 4.5 +(即 full fat CLR)中的默认IConnection
是HttpConnection
。在内部,HttpConnection
使用HttpWebRequest
发出实际请求:- 通过
HttpWebRequest.GetRequestStreamAsync()
获取请求流
- 必要时使用
PostData<T>.WriteAsync()
将数据写入请求流
- 使用
HttpWebRequest.GetResponseAsync()
发出 HTTP 请求
- 使用响应构建器从响应流构建有意义的响应,
ResponseBuilder<TReturn>.ToResponseAsync()
。在这里,响应将被反序列化为TReturn
;对于大多数 json 的响应,这将使用IElasticsearchSerializer.DerserializeAsync<TReturn>()
来反序列化响应。对于使用 Json.NET 的默认 json 序列化程序,没有异步反序列化方法,因此异步版本只是简单地包装了同步反序列化调用。
- 通过
- 使用
这是对所发生情况的简要总结,希望对您有所帮助:)