簡體   English   中英

NEST異步調用

[英]NEST async call

根據這個鏈接 ,NEST 2.0內部只是轉向完全成熟的異步/等待實現。

這是否意味着NEST 2.0內部以完全異步的方式工作?

如果沒有,我們在調用NEST API時應該使用異步嗎?

異步調用的內部結構已經使用基於任務並行庫(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. 如果IConnectionPool支持嗅探,則在第一個池使用時使用RequestPipeline.SniffAsync() SemaphoreSlim上執行WaitAsync()以阻止第一次嗅探發生。
    3. 從群集中選擇一個節點,並應用以下調用:

      1. RequestPipeline.SniffOnStaleClusterAsync() ,如果集群已被標記為過時
      2. RequestPipeline.PingAsync()確保可以ping通節點
      3. 使用RequestPipline.CallElasticsearchAsync<TReturn>()調用Elasticsearch,它將在創建ElasticClient時使用傳遞給ConnectionSettingsIConnection以使用IConnection.RequestAsync<TReturn>()發出請求。 .NET 4.5 +中的默認IConnection (即全脂 CLR)是HttpConnection 在內部, HttpConnection使用HttpWebRequest來發出實際請求:

        1. 使用HttpWebRequest.GetRequestStreamAsync()獲取請求流
        2. 必要時使用PostData<T>.WriteAsync()將數據寫入請求流
        3. 使用HttpWebRequest.GetResponseAsync()發出HTTP請求
        4. 使用響應構建器ResponseBuilder<TReturn>.ToResponseAsync()從響應流構建有意義的響應。 在這里,響應將被反序列TReturn ; 對於大多數響應是json,這將使用IElasticsearchSerializer.DerserializeAsync<TReturn>()來反序列化響應。 對於使用Json.NET的默認json序列化程序,沒有異步反序列化方法,因此異步版本只包含同步反序列化調用。

這是對發生的事情的簡要總結,希望它有幫助:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM