」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Amazon Aurora Serverless 的資料 API 與 AWS SDK for Java - 部分 Aurora Serverless vata API 是否滿足 DevOps Guru?

Amazon Aurora Serverless 的資料 API 與 AWS SDK for Java - 部分 Aurora Serverless vata API 是否滿足 DevOps Guru?

發佈於2024-11-11
瀏覽:902

介绍

在我的文章《适用于无服务器应用程序的 Amazon DevOps Guru - 第 10 部分 Aurora Serverless v2 上的异常检测》中,我们了解到,在使用 Java 21 托管的 Lambda 函数的情况下,DevOps Guru 能够成功检测 Aurora (Serverless v2) PostgreSQL 数据库的异常情况运行时通过 JDBC 连接到它。我们仅将数据库从 0.5 ACU 扩展到 1 ACU,并通过调用 Lambda 函数在数分钟内同时按 id 数百次检索产品,在数据库上创建了非常高的负载。我们看到 DevOps Guru 正确指出了数据库连接总数的增加和数据库 (CPU) 负载持续较高的情况。 在本文中,我想弄清楚 DevOps Guru 是否会通过执行相同的实验来检测异常,但使用 Aurora Serverless v2 的数据 API 和 AWS SDK for Java 而不是 JDBC。

使用数据 API 对 Aurora Serverless v2 进行异常检测

让我们看看我们的示例应用程序并使用 SAM 模板来创建基础架构并部署下图所示的应用程序:

Data API for Amazon Aurora Serverless vith AWS SDK for Java - Part Aurora Serverless vata API meets DevOps Guru or not?

该应用程序创建存储在 Aurora Serverless v2 PostgreSQL 数据库中的产品,并使用数据 API 按 ID 检索它们。我们将用来按 id 检索产品的相关 Lambda 函数是 GetProductByIdViaAuroraServerlessV2DataApi,其处理程序实现是 GetProductByIdViaAuroraServerlessV2DataApiHandler。

和上一篇文章一样,我们使用hey工具来进行这样的压力测试

hey -z 15m -c 300 -H "X-API-Key: XXXa6XXXX" https://XXX.execute-api.eu-central-1.amazonaws.com/prod/productsWithDataApi/1   

在此示例中,我们使用 300 个并发容器调用 API 网关端点 15 分钟。在 prod/productsWithoutDataApi 端点后面,将调用 Lambda 函数 GetProductByIdViaAuroraServerlessV2WithoutDataApi,它将通过 id 1 从 Aurora Serverless v2 PostgreSQL 数据库检索产品。

我们在 [SAM 模板]((https://github.com/Vadym79/AWSLambdaJavaAuroraServerlessV2DataApi/blob/master/template.yaml) Aurora 数据库集群中进行配置,从最小容量 0.5 扩展到最大容量 1 ACU(即非常小的数据库大小),以防增加负载以节省成本。

  AuroraServerlessV2Cluster:
    Type: 'AWS::RDS::DBCluster'
...
      ServerlessV2ScalingConfiguration:
        MinCapacity: 0.5
        MaxCapacity: 1

Aurora(无服务器 v2)数据库管理可用数据库连接的最大数量,与数据库大小(在我们的例子中是 ACU 设置)成比例,还使用 ​​Aurora Serverless v2 的数据 API(这与 v1 存在巨大差异,v1 将成为到 2024 年底将不再支持,硬配额为每秒 1000 个数据库连接)。有关更多信息,请阅读有关 Aurora Serverless v2 的最大连接数的文档。因此,随着调用次数的增加,我们预计很快就会达到最大可用数据库连接数和高数据库 (CPU) 负载,这样数据库将无法响应新的 Lambda 函数请求来检索产品id(Lambda 也会遇到)。 这样我们就会引发异常,并想知道 DevOps Guru 是否能够检测到它。它能够,有点......产生了以下见解:

Data API for Amazon Aurora Serverless vith AWS SDK for Java - Part Aurora Serverless vata API meets DevOps Guru or not?

并且已识别出以下聚合异常指标:

Data API for Amazon Aurora Serverless vith AWS SDK for Java - Part Aurora Serverless vata API meets DevOps Guru or not?

与我的文章 Amazon DevOps Guru for the Serverless applications - 第 10 部分 Aurora Serverless v2 上的异常检测中描述的使用 JDBC 而不是 Data API 时识别的聚合异常指标相比,我们完全搞乱了 Aurora 数据库异常指标:数据库连接总和和数据库 (CPU) 负载,但正确地看到 Lambda 中的错误,该错误在 15 秒内定义的时间内运行,因为数据库无法响应。

Data API for Amazon Aurora Serverless vith AWS SDK for Java - Part Aurora Serverless vata API meets DevOps Guru or not?.

那么,有什么区别呢? 让我们探讨一下我们使用 JDBC(非数据 API)和数据 API 在 Aurora Serverless v2 PostgreSQL 集群上重现的两个事件:

就 ACU 利用率/扩展而言,它们看起来相同:

Data API for Amazon Aurora Serverless vith AWS SDK for Java - Part Aurora Serverless vata API meets DevOps Guru or not?

就其他数据库指标而言,例如:CPU 利用率、DatabaseConnection DBLoad(CPU),存在巨大差异:

Data API for Amazon Aurora Serverless vith AWS SDK for Java - Part Aurora Serverless vata API meets DevOps Guru or not?

  • 对于 JDBC(非数据 API)和数据 API 情况,CPU 利用率看起来相同。但 DevOps Guru 似乎没有考虑这个指标,因为我们甚至没有在 JDBC 实验中看到它
  • DBLoad(CPU) 对于数据 API 使用率来说非常低。似乎对于 Dat API,Aurora Serverless v2 数据库前面有一些负载均衡器,用于监视连接使用情况并保护数据库免于过载。
  • 对于数据 API 使用情况,DatabaseConnection 指标未显示(或显示为 0)。原因是我们不管理 Data API 的数据库连接,它是在另一端为我们完成的。当然,它们仍然发挥着我们在 Aurora Serverless v2 的最大连接数中了解到的重要作用,但该指标似乎在 CloudWatch 指标中暴露于外部,甚至 DevOps Guru 也无法访问真实数字。

由于这一点以及非常低的 DBLoad(CPU),与 JDBC 用例相比,没有生成针对具有数据 API 使用情况的 Aurora Serverless v2 集群的 DevOps Guru 见解。

我做了第二个实验,直接连接到 Aurora Serverless v2 集群,并编写脚本来创建负载测试,方法是使用标准方式(非数据 API)编写通过 id 多次获取产品的脚本。与我们对 hey 工具所做的类似,但直接访问数据库而不是调用 Api Gateway。在将数据库置于负载之下后,我使用如上所述的 hey 工具开始了相同的实验,并想看看会发生什么。产生了相同的见解,但这次具有以下异常指标:

Data API for Amazon Aurora Serverless vith AWS SDK for Java - Part Aurora Serverless vata API meets DevOps Guru or not?

现在我们至少看到了额外的 Aurora Serverless v2 数据库连接总和异常指标,但 DBLoad(CPU) 指标仍然缺失。

异常图形如下所示:

Data API for Amazon Aurora Serverless vith AWS SDK for Java - Part Aurora Serverless vata API meets DevOps Guru or not?

当然,这个实验并不干净,因为我相继进行了两次负载测试,并且部分是并行的:第一个测试直接连接到数据库而不使用 API Gateway,第二个测试使用 Data API。这证实了我最初的假设,即数据库连接总和指标是为 Aurora Serverless v2(以及一般的 RDS)生成 DevOps Guru 见解的非常重要的标准,并且在使用数据 API 的情况下通常不会公开。
我已经联系了 Devops Guru 团队并与他们分享了我的见解,希望他们能够改进服务。或者首先将修复将数据库连接公开为 CloudWatch 指标,以便将 Aurora Serverless v2 与数据 API 结合使用。

结论

在本文中了解到,如果 Lambda 函数通过数据 API 连接到 Java 21 托管运行时,DevOps Guru 可以成功检测 Aurora (Serverless v2) PostgreSQL 数据库的异常,但只能显示与 Lambda 函数相关的异常指标由于数据库没有响应而超时。其主要原因似乎是,在将 Aurora Serverless v2 与数据 API 结合使用时,作为 CloudWatch 指标的数据库连接不会公开(或始终显示为 0)。 Aurora Serverless v2 数据库指标(数据库连接总数)仅在第二次人工实验期间显示。

版本聲明 本文轉載於:https://dev.to/aws-builders/data-api-for-amazon-aurora-serverless-v2-with-aws-sdk-for-java-part-10-aurora-serverless-v2- data-api-meets-devops-guru-or-not-1c60?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何實時捕獲和流媒體以進行聊天機器人命令執行?
    如何實時捕獲和流媒體以進行聊天機器人命令執行?
    在開發能夠執行命令的chatbots的領域中,實時從命令執行實時捕獲Stdout,一個常見的需求是能夠檢索和顯示標準輸出(stdout)在cath cath cant cant cant cant cant cant cant cant interfaces in Chate cant inter...
    程式設計 發佈於2025-07-13
  • Java字符串非空且非null的有效檢查方法
    Java字符串非空且非null的有效檢查方法
    檢查字符串是否不是null而不是空的 if(str!= null && str.isementy())二手: if(str!= null && str.length()== 0) option 3:trim()。 isement(Isement() trim whitespace whites...
    程式設計 發佈於2025-07-13
  • 為什麼使用Firefox後退按鈕時JavaScript執行停止?
    為什麼使用Firefox後退按鈕時JavaScript執行停止?
    導航歷史記錄問題:JavaScript使用Firefox Back Back 此行為是由瀏覽器緩存JavaScript資源引起的。要解決此問題並確保在後續頁面訪問中執行腳本,Firefox用戶應設置一個空功能。 警報'); }; alert('inline Alert')...
    程式設計 發佈於2025-07-13
  • Spark DataFrame添加常量列的妙招
    Spark DataFrame添加常量列的妙招
    在Spark Dataframe ,將常數列添加到Spark DataFrame,該列具有適用於所有行的任意值的Spark DataFrame,可以通過多種方式實現。使用文字值(SPARK 1.3)在嘗試提供直接值時,用於此問題時,旨在為此目的的column方法可能會導致錯誤。 df.withCo...
    程式設計 發佈於2025-07-13
  • 如何克服PHP的功能重新定義限制?
    如何克服PHP的功能重新定義限制?
    克服PHP的函數重新定義限制在PHP中,多次定義一個相同名稱的函數是一個no-no。嘗試這樣做,如提供的代碼段所示,將導致可怕的“不能重新列出”錯誤。 但是,PHP工具腰帶中有一個隱藏的寶石:runkit擴展。它使您能夠靈活地重新定義函數。 runkit_function_renction_...
    程式設計 發佈於2025-07-13
  • 如何高效地在一個事務中插入數據到多個MySQL表?
    如何高效地在一個事務中插入數據到多個MySQL表?
    mySQL插入到多個表中,該數據可能會產生意外的結果。雖然似乎有多個查詢可以解決問題,但將從用戶表的自動信息ID與配置文件表的手動用戶ID相關聯提出了挑戰。 使用Transactions和last_insert_id() 插入用戶(用戶名,密碼)值('test','tes...
    程式設計 發佈於2025-07-13
  • 反射動態實現Go接口用於RPC方法探索
    反射動態實現Go接口用於RPC方法探索
    在GO 使用反射來實現定義RPC式方法的界面。例如,考慮一個接口,例如:鍵入myService接口{ 登錄(用戶名,密碼字符串)(sessionId int,錯誤錯誤) helloworld(sessionid int)(hi String,錯誤錯誤) } 替代方案而不是依靠反射...
    程式設計 發佈於2025-07-13
  • CSS可以根據任何屬性值來定位HTML元素嗎?
    CSS可以根據任何屬性值來定位HTML元素嗎?
    靶向html元素,在CSS 中使用任何屬性值,在CSS中,可以基於特定屬性(如下所示)基於特定屬性的基於特定屬性的emants目標元素: 字體家庭:康斯拉斯(Consolas); } 但是,出現一個常見的問題:元素可以根據任何屬性值而定位嗎?本文探討了此主題。 的目標元素有任何任何屬性值,...
    程式設計 發佈於2025-07-13
  • Java數組中元素位置查找技巧
    Java數組中元素位置查找技巧
    在Java數組中檢索元素的位置 利用Java的反射API將數組轉換為列表中,允許您使用indexof方法。 (primitives)(鏈接到Mishax的解決方案) 用於排序陣列的數組此方法此方法返回元素的索引,如果發現了元素的索引,或一個負值,指示應放置元素的插入點。
    程式設計 發佈於2025-07-13
  • 在JavaScript中如何並發運行異步操作並正確處理錯誤?
    在JavaScript中如何並發運行異步操作並正確處理錯誤?
    同意操作execution 在執行asynchronous操作時,相關的代碼段落會遇到一個問題,當執行asynchronous操作:此實現在啟動下一個操作之前依次等待每個操作的完成。要啟用並發執行,需要進行修改的方法。 第一個解決方案試圖通過獲得每個操作的承諾來解決此問題,然後單獨等待它們: c...
    程式設計 發佈於2025-07-13
  • 如何使用組在MySQL中旋轉數據?
    如何使用組在MySQL中旋轉數據?
    在關係數據庫中使用mySQL組使用mySQL組進行查詢結果,在關係數據庫中使用MySQL組,轉移數據的數據是指重新排列的行和列的重排以增強數據可視化。在這裡,我們面對一個共同的挑戰:使用組的組將數據從基於行的基於列的轉換為基於列。 Let's consider the following ...
    程式設計 發佈於2025-07-13
  • \“(1)vs.(;;):編譯器優化是否消除了性能差異?\”
    \“(1)vs.(;;):編譯器優化是否消除了性能差異?\”
    答案: 在大多數現代編譯器中,while(1)和(1)和(;;)之間沒有性能差異。編譯器: perl: 1 輸入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
    程式設計 發佈於2025-07-13
  • 表單刷新後如何防止重複提交?
    表單刷新後如何防止重複提交?
    在Web開發中預防重複提交 在表格提交後刷新頁面時,遇到重複提交的問題是常見的。要解決這個問題,請考慮以下方法: 想像一下具有這樣的代碼段,看起來像這樣的代碼段:)){ //數據庫操作... 迴聲“操作完成”; 死(); } ? > ...
    程式設計 發佈於2025-07-13
  • 為什麼PYTZ最初顯示出意外的時區偏移?
    為什麼PYTZ最初顯示出意外的時區偏移?
    與pytz 最初從pytz獲得特定的偏移。例如,亞洲/hong_kong最初顯示一個七個小時37分鐘的偏移: 差異源利用本地化將時區分配給日期,使用了適當的時區名稱和偏移量。但是,直接使用DateTime構造器分配時區不允許進行正確的調整。 example pytz.timezone(&#...
    程式設計 發佈於2025-07-13
  • 如何同步迭代並從PHP中的兩個等級陣列打印值?
    如何同步迭代並從PHP中的兩個等級陣列打印值?
    同步的迭代和打印值來自相同大小的兩個數組使用兩個數組相等大小的selectbox時,一個包含country代碼的數組,另一個包含鄉村代碼,另一個包含其相應名稱的數組,可能會因不當提供了exply for for for the uncore for the forsion for for ytry...
    程式設計 發佈於2025-07-13

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3