亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

AWS / Lambda / Java 上的 Elasticsearch 客戶端

AWS / Lambda / Java 上的 Elasticsearch 客戶端

函數式編程 2022-07-20 10:01:19
我們使用 AWS Lambda (Java) 和 elasticsearch 客戶端連接到 AWS 上托管的 elasticsearch 實例。我在第一個請求上遇到了大約 2.5 秒的長時間等待(在冷啟動之上)。之后它非???。我真的不知道這個延遲是從哪里來的,我正在嘗試優化它。private void testPerformanceElasticSearch() throws Exception {        log.info("1. Before testing elasticsearch client");        AWS4Signer signer = new AWS4Signer();        signer.setServiceName("es");        signer.setRegionName("eu-west-1");        HttpRequestInterceptor interceptor = new AWSRequestSigningApacheInterceptor("es", signer, new DefaultAWSCredentialsProviderChain());        String endpoint = "https://" + Utils.getEnvironmentVariable("ELASTIC_SEARCH_ENDPOINT");        RestHighLevelClient restHighLevelClient = new RestHighLevelClient(RestClient.builder(HttpHost.create(endpoint)).setHttpClientConfigCallback(hacb -> hacb.addInterceptorLast(interceptor)));        log.info("2. After getting elasticsearch client");        log.info("3. Before doing a elasticsearch query");        log.info("4");        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();        log.info("5");        TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("userId", "abc");        log.info("6");        boolQueryBuilder.must(termsQueryBuilder);        log.info("7");        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();        log.info("8");        searchSourceBuilder.query(boolQueryBuilder);        log.info("9");        SearchRequest searchRequest = new SearchRequest("users");        log.info("10");        searchRequest.source(searchSourceBuilder);        log.info("11");        restHighLevelClient.search(searchRequest);        log.info("12");        log.info("13. After testing elasticsearch");}關于如何改進這一點的任何建議?
查看完整描述

2 回答

?
qq_遁去的一_1

TA貢獻1725條經驗 獲得超8個贊

問題是在第一個請求(真正的請求,而不是預熱請求,因為預熱請求不會通過您的應用程序代碼,它不會觸發加載實際請求路徑中使用的類)JVM 加載(讀取、解析、驗證等...)相關類,初始化安全組件(密碼等...)并完成 TLS 握手(需要多個 RTT,使用 Java 9 和 TLS 1.3,這應該減少)。

首次 AWS 服務調用(DynamoDB、SQS 等)也出現了類似的長時間行為

由于我是 Thundra 預熱插件的作者,我正在考慮為預熱消息引入掛鉤點,因為自定義操作將能夠執行,如初始化安全組件、加載類等......


查看完整回答
反對 回復 2022-07-20
?
慕尼黑的夜晚無繁華

TA貢獻1864條經驗 獲得超6個贊

VPC 內的 Lambda 函數對啟動時間有很大影響。您說您的 ES 是托管實例,所以我假設它由 VPC 支持。

即使不在 VPC 中,Java 冷啟動通常也比 Node 或 Python 等運行時長,因為需要先啟動 JVM。這主要是您的 2.5 秒的來源。

好的。如何解決問題?

這取決于 ElasticSearch 需要多少并發連接。如果一個函數能夠處理所有傳入請求,那么您可以將 Lambda 函數的并發執行限制為 1,因此您可以確保始終訪問同一個容器(只要這些請求是在 ±5 分鐘內發出的)大體時間)。

現在,如果您事先不知道將執行多少并發 Lambda 函數,那么您就沒有出路了。您可以嘗試預先預熱您的 Lambda 函數,但是您需要同時觸發 100 個請求來預熱 100 個不同的容器。

當我瀏覽 Lambda 函數的并發模型以及冷/熱啟動如何工作時,請檢查此答案。

如果您有更多信息要分享或者我不夠清楚,我很樂意編輯我的答案。


查看完整回答
反對 回復 2022-07-20
  • 2 回答
  • 0 關注
  • 126 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號