Trino容錯模式深度測評與思考

来源:https://www.cnblogs.com/huaweiyun/archive/2023/10/13/17762480.html
-Advertisement-
Play Games

Trino是一款開源的高性能、分散式SQL查詢引擎,專門用於對各種異構數據源運行互動式分析查詢,支持從GB到PB的數據量範圍。 ...


本文分享自華為雲社區《走向批處理-互動式分析一體化: Trino容錯模式深度測評與思考》,作者:HetuEngine九級代言 。

本文系華為雲大數據研發團隊原創,原創作者:文博,夢月

1 Trino簡介

2020年12月27日,Presto社區大佬們——Martin Traverso、 Dain Sundstrom 以及 David Phillips 宣佈將開源項目PrestoSQL的名字更名為TrinoDB(本文簡稱Trino)。

Trino是一款開源的高性能、分散式SQL查詢引擎,專門用於對各種異構數據源運行互動式分析查詢,支持從GB到PB的數據量範圍。Trino專門為互動式分析而設計,可以對來自不同數據源的數據(包括:Hive、AWS S3、Alluxio、MySQL、Kafka、ES等等)進行合併查詢,並提供良好的自定義連接器編程擴展框架。適用於期望響應時間從亞秒到數分鐘不等的分析師場景。

1.PNG

在誕生之初,Trino是為了填補當時 Facebook 內部實時查詢和 ETL 處理之間的空白。Trino的核心目標就是提供互動式查詢,也就是我們常說的 Ad-Hoc Query,很多公司都使用它作為 OLAP 計算引擎。近年來業務場景越來越複雜,除了互動式查詢場景,很多公司也需要兼顧批處理作業,技術大佬們開始思考如何用Trino來進行大數據集的批加工處理。

2 傳統Trino架構的局限性

在傳統Trino運行架構中,Trino 預先規划了處理特定查詢的所有task 。這些task彼此關聯,一項task的結果是下一項task的輸入。對於MPP引擎來說,這種相互依賴是必要的。一旦任何任務在此過程中失敗,就會破壞整個任務鏈條,導致整個SQL執行退出。

Trino執行SQL任務過程如下圖(來自Trino官網):

2.png

優點:

       數據通過task進行流式傳輸,沒有中間檢查點,高吞吐低延遲

不足:

  • 缺乏細粒度的故障回覆,出現問題只能從頭運行整個Query
  • 完全依賴記憶體資源進行數據裝載和交換
  • 執行規劃一旦確定就無法根據實際執行進展靈活調整

3 Trino容錯執行架構(FTE)

Trino開源社區設計了一種新的容錯執行架構(fault-tolerant execution architecture),它允許我們實現具有細粒度重試的高級資源感知調度(advanced resource-aware scheduling)。該項目代號為“Tardigrade”。

Tardigrade項目旨在打破原有的全有或全無的執行障礙。它為資源管理、自適應查詢優化和故障恢復帶來了許多新的機會。該項目以水熊蟲命名 ,水熊蟲是世界上最堅不可摧的生物,類似於FTE為 Trino 帶來的魯棒性。

3.png

以下是 Tardigrade 項目帶來的一些直觀效果:

  • 當長時間運行的SQL Query遇到故障時,不必從頭開始運行;
  • 當Query需要的記憶體超過集群中當前可用的記憶體時,仍然能夠運行成功;
  • 當多個Query同時提交時,它們能夠以公平的方式共用資源,並穩步運行

從代碼實現角度看, Trino直接在內核中實現了task級容錯、自動重試、shuffle等核心功能。如下圖所示(來自Trino官網):

4.png

Trino會將一個Query執行分成多個stage。在容錯模式下,上游stage的shuffle數據會進行落盤(支持寫到AWS S3、HDFS及本地存儲)。下游stage從中間存儲里讀取所需要的數據,併在該過程中對後續task任務進行重新優化與分配。

5.png

帶來的改進:

  • 適應性規劃:可以在緩衝數據時,動態調整查詢計劃
  • 資源管理:在查詢運行時調整資源分配。當集群空閑時,我們可以允許單個查詢利用集群上的所有可用資源。當更多工作負載開始時,可​​以逐漸減少初始查詢的資源分配。
  • 細粒度的故障恢復:允許透明地重啟失敗的任務,使得ETL完成時間更可預測。

接下來,本文將帶各位深入體驗Trino容錯執行模式。

4 基礎性能測試

首先在計算資源充足的場景下進行基礎性能測試。選取1TB數據量的TPCDS,計算資源規格為2CN+16Worker 136GB/進程,測試開啟容錯前後,執行TPCDS99,耗時統計如下:

6.png

測試寫入性能選擇TPCDS表中最大的表catalog_sales測試寫入性能,SQL為:

--- create table catalog_sales_copy as select * from catalog_sales;

測試數據如下:

數據集

計算資源

執行耗時(單位:秒)

不開容錯和spill

Task容錯

Task容錯+spill

1TB

1CN+2Worker,20GB/進程

622.2

673

687

10TB

1CN+3Worker,136GB/進程

3445

1485

1486

小結:

  • 開啟Task容錯會進行中間交換區結果落盤,存在性能損耗,執行耗時約為之前的2倍;
  • Query容錯沒有落盤的過程,與不開啟容錯性能持平。
  • 1TB數據集時,Task容錯寫入性能也會有8%-10%損耗,但在10TB數據集時反而有性能提升,待深入分析;

5 大數據量場景的穩定性測試

本節將在計算資源嚴重不足的場景下進行TPCDS壓力測試。測試結果如下:

數據量

計算資源

錯誤率

不開容錯

Task容錯

Task容錯+
spill to disk

1TB

1CN+2Worker,40GB/進程

7.07%

0%

0%

1CN+2Worker,20GB/進程

12.12%

0%

0%

1CN+2Worker,10GB/進程

16.16%

4.04%

0%

10TB

1CN+3Worker,136GB/進程

8.08%

0%

0%

50TB

1CN+16Worker,136GB/進程

13.13%

6.06%

5.05%

小結:

  • 記憶體不足情況下使用Task容錯,能夠大幅度提高SQL執行成功率。與spill to disk特性結合使用能帶來更好的容錯效果;
  • 在50TB數據集時,Task容錯仍然能夠提高執行成功率,但某些複雜SQL可能會存在單點瓶頸。目前觀察到主要是單點聚合瓶頸。

6 高併發場景測試

6.1 1TB TPCD標準數據集

計算資源規格:1CN+8Worker,136GB/進程

測試SQL用例: Q01(多事實表關聯查詢,即TPCDS99中的Q29)

測試結果如下表所示:

測試場景

1併發

100併發

200併發

不開啟容錯

QUERY容錯

TASK容錯

不開啟容錯

QUERY容錯

TASK容錯

不開啟容錯

QUERY容錯

TASK容錯

多表關聯查詢(多事實表)Q01-1輪

4.1/min

5.2/min

2.6/min

7.3/min

7.2/min

8.1/min

17.50%失敗

18%失敗

7.9/min

多表關聯查詢(多事實表)Q01-5輪

5.2/min

4.8/min

3.4/min

8.3/min

8.6/min

8.6/min

64.9%失敗

74.9%失敗

8.5/min

7.png

6.2 10TB TPCD標準數據集

計算資源規格:1CN+8Worker,136GB/進程

測試SQL用例:

單表多列聚合排序查詢Q02:

select

  • ws_item_sk,
  • ws_web_site_sk,
  • sum(ws_sales_price) total

from

  • web_sales

where

  • ws_sold_date_sk >= 2450815
  • and ws_sold_date_sk <= 2451179

group by

  • ws_item_sk,
  • ws_web_site_sk

having

  • sum(ws_sales_price) > 0

order by

  • total desc

limit 100;

開啟TASK容錯全部能夠執行成功。測結果如下表所示:

測試場景

1併發

100併發

200併發

300併發

400併發

不開容錯

TASK容錯

不開容錯

TASK容錯

不開容錯

TASK容錯

不開容錯

TASK容錯

不開容錯

TASK容錯

單表多列聚合排序查詢Q02_1輪

3.3/min

1.3/min

7.9/min

5.7/min

9.7/min

8.8/min

8.5/min

5.9/min

97.25% 失敗

6.8/min

單表多列聚合排序查詢Q02_5輪

7.1/min

2.0/min

10.7/min

9.5/min

10.3/min

9.3/min

8.20% 失敗

8.0/min

99.1% 失敗

6.6/min

小結:

Task容錯能夠提升Trino引擎的併發上限,很大程度上減少諸如“Encountered too many errors talking to a worker node.”報錯的產生。

7 多個引擎橫向對比測試

首先從TPCDS99中挑選出計算資源受限前提下,Trino不開啟容錯100%會跑失敗的SQL用例,包括:

Q04,Q11,Q23,Q38,Q64,Q65,Q67,Q74,Q75,Q78,Q80,Q81,Q85,Q87,Q93,Q95,Q97

基於相同計算資源(記憶體、CPU、Container個數),橫向對比Trino、Spark、Hive(TEZ) 的性能表現。

註:測試Trino時實際採用的是華為雲HetuEngine 2.0的內核版本。

7.1 1TB TPCD標準數據集

 

8.png

可看出,在1TB數據量、使用相同資源情況下,開啟Task容錯,Trino能夠將原先跑失敗的SQL執行成功,且性能約為Spark的3倍左右,是Hive(TEZ)的數十倍。

7.2 10TB TPCDS標準數據集

針對10TB TPCDS標準數據集,進行對比測試:

9.png

可看出,在10TB數據量、使用相同資源情況下,開啟Task容錯,Trino能夠將原先跑失敗的SQL執行成功,且性能約為Spark的3倍左右。

8 綜合評價

綜上,基於測試數據總結歸納如下——

單併發基礎性能

  • 記憶體資源充足:不開啟容錯 = Query容錯 > Task容錯
  • 記憶體資源不足:Task容錯可以跑過,不開啟容錯/Query容錯跑不出結果

大數據量場景的穩定性

         Task容錯 + spill to disk > Task容錯 > 不開啟容錯

  • 1-10TB數據集:Task容錯的表現很穩定,通過率100%
  • 50TB數據集: 結合使用Task容錯、spill to disk相比單獨用Task容錯表現更好(少失敗1個用例)

併發場景的穩定性

         Task容錯 > 不開啟容錯

多個引擎橫向性能對比

  • 1TB TPCDS數據集:Trino(Task容錯) > Spark > Hive(TEZ)
  • 10TB TPCDS數據集:Trino (Task容錯) > Spark

總體而言,Trino的FTE功能在性能、穩定性維度的測試表現超出了預期。隨著該能力的逐步演進與完善,相信Trino將在一站式數據加工與分析場景發揮出更大的價值。

9 思考與改進

在擁有了第一手的測試數據與分析結論後,接下來我們將思考如何利用好Trino容錯模式,最大化的發揮其價值,同時要提前識別可能存在的問題,探索解決之道。

9.1 容錯模式啟用決策

從前面的測試數據可以看出,開啟容錯模式對於短查詢性能存在一定的影響(對大查詢性能反而存在優化的可能)。因此需要思考何時、何種方式來開啟容錯模式。

有如下思路可供選擇——

  • 用戶自主擇機啟用

最簡單的辦法就是讓業務用戶自主擇機選擇啟用或者關閉容錯模式。通常情況下,有經驗的用戶知道哪些查詢可能是計算量大或者運行時間久的查詢。他們可以通過改變JDBC連接的session參數來實現在“互動式模式”和“容錯模式”之間靈活切換;

  • 基於代價決策

可以基於SQL執行的預測代價來決定是否開啟“容錯模式”。一般來說,這個技術需要依賴實現統計獲得的列級別統計信息。然而,列級別統計信息有時候是不可用的,而且基於代價估算的預測精度往往不夠理想;

  • 自適應選擇技術

預設情況下,查詢可以“互動式模式”啟動,然後在運行N分鐘後,經過一段時間學習後,由引擎內核根據可用資源情況、業務特點等維度信息,自主決策啟動或關閉“容錯模式”。這個思路需要將Trino引擎與機器學習、AI技術結合起來,踐行數智融合路線;

  • 基於歷史信息決策

針對特定數據源的某些類型的查詢,可以預先收集歷史運行記錄併進行分析建模。基於事先學習掌握的先驗知識模型,在SQL執行前選擇最優的執行模式。

9.2 水平擴展規模應用

Trino具備了容錯執行模式,測試數據顯示效果不錯,那麼接下來大家就會思考:是否可以基於該能力提供更大規模的分析查詢加速服務呢?

實際業務場景中,企業可能需要按需進行任務提交與彈性資源調度,尤其是在大規模、雲原生環境中,即使開啟容錯模式,對於單個Trino集群,其協調節點(Coordinator)依然可能存在併發能力的瓶頸。此外,從軟體架構角度看,單一Trino集群的可用性也存在一定的風險,影響雲服務環境下的SLA目標達成。

針對上述問題,華為雲互動式分析引擎HetuEngine提供了三層分散式架構,通過統一的SQL訪問入口——HSFabric來向業務提供全局唯一的JDBC服務地址。

10.png

通過HSFabric統一SQL訪問入口,HetuEngine實現了將業務層邏輯與某個特定的計算實例解耦,單個資源租戶內部可以橫向擴展多個計算實例,同一個租戶內部的SQL任務可以在不同計算實例間靈活分配。

無論從多租戶還是單一租戶角度看,HetuEngine的併發容量可水平擴展,同時也提升了服務可用性和資源利用率。

基於上述架構,HetuEngine支持服務管理員自由決定是否開啟/關閉單個租戶的容錯執行模式,以便更好的滿足不同場景的業務訴求。

11.png

9.3 故障處理與恢復

在Trino容錯執行過程中,Stage間的Shuffle數據會大量落入到分散式文件系統上。這裡以HDFS為例進行討論可能存在問題。

假設——1個大SQL在執行過程中,Trino正在往HDFS上寫shuffle數據,突然Trino所在物理機節點發生意外(比如,停電、斷網、操作系統崩潰等),或者Trino本身出現故障停止工作(比如,過載等)。這可能會導致整個Trino集群都徹底停止工作。此時,需要管理員人工介入才能重新恢復Trino集群的正常工作狀態。

顯而易見,對Trino來說,至少存在2個問題需要思考和解決:

  • 如何實現Trino集群的應急快速恢復
  • 確保HDFS上的殘留文件及時被清理,避免存儲空間耗盡

華為雲互動式分析引擎HetuEngine基於三層服務化+容器化架構,可有效應對上述挑戰:

針對問題1

藉助於全容器化的部署架構,HetuEngine的任一計算實例(對應於1個分散式Trino集群)中的任一軟體進程在發生故障/意外時,均可由Service層快速自動拉起新的容器進程來接管和補齊服務缺失,在人工介入前快速完成故障自愈。

在可用資源可能存在不足時,HetuEngine支持計算實例線上彈性伸縮,通過自動調整Worker數量來動態平衡資源利用率,快速補充因故障而丟失的Worker節點資源。

在Coordinator節點發生故障時,HetuEngine從三方面入手進行應對——

  1. 同一計算實例中的Worker節點立即與備Coordinator進行組網;
  2. 備Coordinator升為新的主Coordinator;
  3. 統一SQL入口立即將新的SQL請求引流到新的主Coordinator

12.png

針對問題2

HetuEngine的Service層全天24小時不間斷監控,跟蹤並及時發現、清理各層級作業殘留(包括:數據、文件、目錄、元數據等)。

同時針對歷史任務進行多維度地深入洞察,生成高價值SQL運維圖表和決策推薦信息,最終呈現在控制台頁面。

Service層提供的全方位貼心服務,極大降低了對數據分析平臺管理員的專業知識要求,解決管理員對於長期運營的後顧之憂。

9.4 大數據平臺業務無損的彈性擴縮容

通常來說,大數據平臺的彈性伸縮方案只會涵蓋Hive、Spark這類批處理引擎。因Hive、Spark本身具備了容錯執行能力,即使因為大數據平臺的管控面下髮指令強制縮容一個正在運行Hive/Spark作業的物理節點,也不會影響相關作業的最終執行成功,最多只是引發了局部task的重試,增加了執行時長。因此,面向Hive、Spark引擎的大數據平臺彈性伸縮方案相對來說比較容易,只需要關註資源層面的管理操作即可。

但對Trino這類MPP架構引擎來說,上述大數據平臺的彈性伸縮管理模式就可能會面臨如下幾個方面的挑戰:

  • MPP架構的SQL引擎一般都是常駐形態,在縮容過程中任何一個節點被強殺都可能導致該節點上正在運行中的SQL任務失敗;
  • Trino的協調節點Coordinator預設為1個,在縮容過程中,強殺Coordinator所在的節點會導致整個Trino集群不可用,運行中的所有SQL任務失敗;
  • Trino集群的擴容,需要平臺管理面深入理解Trino集群的內部服務發現與工作機制,針對具體集群的IP和埠號定製配置,才能順利的將新節點加入到一個已經存在的Trino集群中。

綜上,要想在大數據平臺服務上實現對Trino生態引擎的彈性伸縮,且做到業務無損,需要在大數據平臺服務層和Trino內核層之間抽象出一個面向多資源租戶+多個計算實例(Trino集群)的資源管理&業務接入service層。

HetuEngine的service層對大數據平臺服務層屏蔽底層Trino內核細節,對上提供Rest API調用,並將大數據平臺服務層的管理運維訴求轉換為對具體Trino集群的實際變更。同時要做到對多個Trino集群的日常狀態監控與自維護。

13.png

在上述架構基礎之上,可以基於Trino容錯執行的能力,在開啟彈性伸縮時,進一步降低大數據平臺層面彈性伸縮的等待時間。

一種可行的思路大致是——

大數據平臺服務層向HetuEngine的service層下發縮容指令,service確定即將被縮容的節點上正在運行的計算實例,並將其動態切換到容錯模式。在通常情況下,service層可以快速向上層服務層答覆縮容操作准備繼續,不用等待SQL任務執行完。

9.5 小結

基於上述架構與思路,華為雲HetuEngine能很好地應對容錯執行模式可能引入的新問題,顯著提升生產環境實際運維效率,助力用戶很方便地享受容錯執行的新紅利。

接下來, HetuEngine將逐步引入和完善在兩個不同執行模式間的智能切換能力,進一步完善對大數據云服務彈性伸縮的場景適配,在數據湖內一站式SQL分析領域持續創新、長期演進。

10 HetuEngine 2.0版本預告

預計2023年9月30日,HetuEngine 2.0將隨華為雲MRS 3.3.0-LTS正式發佈。在該版本中,可以看到一系列的新能力,例如——

  • 基於Java17運行全新內核,基礎性能、穩定性再上一個新臺階,TPCDS提速30%
  • 大SQL主動防禦:事前提示/攔截,事中熔斷,事後統計
  • 支持容錯執行模式:適用範圍更廣泛,使能一站式SQL加工 & 分析
  • 租戶內多計算實例架構:自動負載均衡、針對單個業務的併發能力可水平擴展
  • 新增數據源類型:Hudi,MySQL
  • 新增支持新建Hudi表、Insert數據
  • 新增支持Hue對接HetuEngine,提供可視化SQL編輯頁面
  • 新增支持代理用戶模式,支持對客戶的自有用戶體系的代理鑒權及審計

14.png

相關鏈接:https://support.huaweicloud.com/intl/zh-cn/cmpntguide-lts-mrs/mrs_01_1711.html

 

點擊關註,第一時間瞭解華為雲新鮮技術~

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 不知道大家有沒有瞭解FreeSSL,我近期發展這個網站 https://freessl.cn,如果你們都是個人站點,對證書沒什麼特別要求,可以考慮用他們家生成的證書,並且能自動續費,完全不用操心。 ...
  • 一 .netframework程式遷移到.netcore5.0對於.netframwork程式想要升級為.netcore5.0的方法,微軟官方也給出了方法見 https://docs.microsoft.com/en-us/dotnet/desktop/winforms/migration/?vie ...
  • C#核心 面向對象--封裝 用程式來抽象現實世界,(萬物皆對象)來編程實現功能。 三大特性:封裝、繼承、多態。 類與對象 聲明位置:namespace中 樣式:class 類名{} 命名:帕斯卡命名法(首字母大寫) 實例化對象:根據類來新建一個對象。Person p=new Person(); 成員 ...
  • <工作記錄——Report> 報表前的數據獲取操作是高重覆性的,今天差不多完成了腳本,下述是代碼: 1 // See https://aka.ms/new-console-template for more information 2 using System.IO; 3 using System. ...
  • 目錄一、微處理器與匯流排1.微處理器的概述1.1 運算器1.2 控制器1.2.1 指令控制1.2.2 時序控制1.2.3 操作控制二、8086/8088微處理器1.8086/8088CPU的指令特點1.1 指令流水線1.2 記憶體的分段管理技術1.3 支持多處理器系統2.8088/8086的外部引腳及其 ...
  • 本腳本通過域管下發預設為root許可權執行 #!/bin/bash cd /home #快捷方式圖標名稱 string_imgName="temp1.png" #快捷方式文件名稱 string_fileName="/changePassword.desktop" #快捷方式內容 function in ...
  • Tcpdump 抓包工具使用以及Wireshark解析pacp包 參考鏈接(比較詳細):https://blog.csdn.net/weixin_42866036/article/details/128004750 1.項目上數據在共用時,由於介面有Token鑒權動作,有時調用介面會出現鑒權失效問題 ...
  • 前言 存儲引擎都是把數據存儲在文件系統上,通過通過查詢命令,可以查看數據目錄所在的本機路徑。 mysql> SHOW VARIABLES LIKE 'datadir'; + + + | Variable_name | Value | + + + | datadir | /var/lib/mysql/ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...