為什么要使用批量請求處理?

當客戶端向服務器發送多個 API 請求時,每個請求都需要一個單獨的 HTTP 請求/響應周期。這種做法可能會導致延遲增加、性能下降和服務器負載增加。通過將多個請求合并為一個批處理請求,可以顯著減少 HTTP 請求/響應周期的數量,從而提高性能并降低延遲。

批處理請求處理特別適用于以下場景:

批量請求處理的真實示例

示例 1: 社交媒體應用程序

在傳統方法中,您需要為以下操作發出多個 API 請求:

  1. 檢索用戶的好友列表。
  2. 對于每個好友,檢索他們的最新帖子。

使用批處理請求處理,您可以將這些請求合并為一個批處理請求。這樣,您可以一次性獲取所有朋友的帖子,減少延遲和提高性能。

示例 2: 移動應用程序

對于產品列表的填充,您通常需要發出以下多個請求:

  1. 檢索產品 ID 列表。
  2. 對于每個產品 ID,檢索產品詳細信息。

通過批處理請求,您可以將所有產品 ID 的詳細信息請求合并為一個批處理請求,從而提高數據檢索效率。

示例 3: 會議管理應用程序

在會議管理應用程序中,如果您需要顯示演講者的會話和主題,您可能會遇到以下情況:

  1. /speaker/{speakerId}/sessions 獲取會話信息。
  2. /speaker/{speakerId}/topics 獲取相關主題信息。

使用批處理請求,您可以將這兩個請求合并為一個單一的請求,以獲取所有會話和主題信息,從而減少請求次數和提升用戶體驗。

使用 Apache APISIX API 網關進行批量請求處理

在 Apache APISIX 中實現批量請求處理可以使用 batch-requests 插件。該插件允許在單個請求有效負載中定義一組 API 請求。每個請求可擁有自己的 HTTP 方法、URL 路徑、標頭集和有效負載。以下是如何使用該插件的示例:

假設有一個用于會議管理的 Web 應用程序,系統中有多個演講者,需要在單個網頁上顯示演講者的會話和相關主題。使用 batch-requests 插件可以將所有這些請求分組到一個 HTTP 請求中。以下是 curl 命令發送批量請求的示例:

curl -i http://{API_GATEWAY_HOST_ADDRESS}/speaker -X POST -d \
'{
"pipeline": [
{
"method": "GET",
"path": "/speaker/1/topics"
},
{
"method": "GET",
"path": "/speaker/1/sessions"
}
]
}'

收到批量請求后,batch-requests 插件將解析負載,并并行執行每個請求。插件會將每個請求的響應聚合,并以單個 HTTP 響應的形式返回給客戶端。

批量請求插件演示

在使用 batch-requests 插件之前,需要先安裝 Apache APISIX。

先決條件

可以使用以下快速啟動腳本輕松安裝和啟動 APISIX:

curl -sL https://run.api7.ai/apisix/quickstart | sh

配置后端服務(上游)

需要為請求路由到的會議 API 配置后端服務。這可以通過 Admin API 在 Apache APISIX 中添加一個上游服務器來實現。

curl http://127.0.0.1:9180/apisix/admin/upstreams/1 -X PUT -d '
{
"name": "Conferences API upstream",
"desc": "Register Conferences API as the upstream",
"type": "roundrobin",
"scheme": "https",
"nodes": {
"conferenceapi.azurewebsites.net:443": 1
}
}'

為批處理 API 創建路由

需要創建一個新路由,該路由攔截對公共虛擬端點的請求,并使用插件進行批處理。

curl http://127.0.0.1:9180/apisix/admin/routes/a -X PUT -d '
{
"uri": "/speaker",
"plugins": {
"public-api": {
"uri": "/apisix/batch-requests"
}
}
}'

為演講者的主題和會話端點創建路由

接下來,為演講者的主題和會話端點(及路徑匹配)創建另一個路由,以便 API 網關從批處理請求中提取的單個請求被轉發到會議 API 端點,并引用現有的上游服務。

curl http://127.0.0.1:9180/apisix/admin/routes/b -X PUT -d '
{
"methods": ["GET"],
"uris": ["/speaker/*/topics","/speaker/*/sessions"],
"plugins": {
"proxy-rewrite":{
"host":"conferenceapi.azurewebsites.net"
}
},
"upstream_id":"1"
}'

注意,這里使用了另一個代理重寫插件,并為會議 API 隱式指定了主機地址。否則,API 網關將進行 DNS 轉換,并通過其 IP 地址請求會議 API。

測試批處理請求處理

以下是如何在 APISIX 中使用 batch-requests 插件的示例:

curl -i http://127.0.0.1:9080/speaker  -X POST -d \
'{
"pipeline": [
{
"method": "GET",
"path": "/speaker/1/topics"
},
{
"method": "GET",
"path": "/speaker/1/sessions"
}
]
}'

在此示例中,為端點定義了路由,該端點支持通過 batch-requests 插件進行批量請求處理。該插件配置了一組兩個請求,每個請求按 ID 檢索包含主題和會話的演講者記錄。如果運行此命令,將從 API 網關返回合并響應:

[
{
"body":"{\r\n \"collection\": {\r\n \"version\": \"1.0\",\r\n \"links\": [],\r\n \"items\": [\r\n {\r\n \"href\": \"https://conferenceapi.azurewebsites.net/topic/8\",\r\n \"data\": [\r\n {\r\n \"name\": \"Title\",\r\n \"value\": \"Microsoft\"\r\n }\r\n ],\r\n \"links\": [\r\n {\r\n \"rel\": \"http://tavis.net/rels/sessions\",\r\n \"href\": \"https://conferenceapi.azurewebsites.net/topic/8/sessions\"\r\n }\r\n ]\r\n },\r\n {\r\n \"href\": \"https://conferenceapi.azurewebsites.net/topic/10\",\r\n \"data\": [\r\n {\r\n \"name\": \"Title\",\r\n \"value\": \"Mobile\"\r\n }\r\n ],\r\n \"links\": [\r\n {\r\n \"rel\": \"http://tavis.net/rels/sessions\",\r\n \"href\": \"https://conferenceapi.azurewebsites.net/topic/10/sessions\"\r\n }\r\n ]\r\n }\r\n ],\r\n \"queries\": [],\r\n \"template\": {\r\n \"data\": []\r\n }\r\n }\r\n}",
"status":200,
"headers":{
"Expires":"-1",
"Connection":"keep-alive",
"Pragma":"no-cache",
"Content-Length":"953",
"Server":"APISIX/3.2.0",
"Content-Type":"application/vnd.collection+json",
"X-AspNet-Version":"4.0.30319",
"Cache-Control":"no-cache",
"X-Powered-By":"ASP.NET"
},
"reason":"OK"
},
{
"body":"{\r\n \"collection\": {\r\n \"version\": \"1.0\",\r\n \"links\": [],\r\n \"items\": [\r\n {\r\n \"href\": \"https://conferenceapi.azurewebsites.net/session/206\",\r\n \"data\": [\r\n {\r\n \"name\": \"Title\",\r\n \"value\": \"\\r\\n\\t\\t\\tjQuery Mobile and ASP.NET MVC\\r\\n\\t\\t\"\r\n },\r\n {\r\n \"name\": \"Timeslot\",\r\n \"value\": \"05 December 2013 09:00 - 10:00\"\r\n },\r\n {\r\n \"name\": \"Speaker\",\r\n \"value\": \"Scott Allen\"\r\n }\r\n ],\r\n \"links\": [\r\n {\r\n \"rel\": \"http://tavis.net/rels/speaker\",\r\n \"href\": \"https://conferenceapi.azurewebsites.net/speaker/16\"\r\n },\r\n {\r\n \"rel\": \"http://tavis.net/rels/topics\",\r\n \"href\": \"https://conferenceapi.azurewebsites.net/session/206/topics\"\r\n }\r\n ]\r\n }\r\n ],\r\n \"queries\": [],\r\n \"template\": {\r\n \"data\": []\r\n }\r\n }\r\n}",
"status":200,
"headers":{
"Expires":"-1",
"Connection":"keep-alive",
"Pragma":"no-cache",
"Content-Length":"961",
"Server":"APISIX/3.2.0",
"Content-Type":"application/vnd.collection+json",
"X-AspNet-Version":"4.0.30319",
"Cache-Control":"no-cache",
"X-Powered-By":"ASP.NET"
},
"reason":"OK"
}
]

要點

使用 API Gateway 進行批量請求處理是一種提升 API 性能的有效技術。Apache APISIX 提供了一個名為 batch-requests 的插件,方便開發者實現批量請求處理。

最后

使用 API Gateway 還可以在響應數據中提供自定義聚合。通過 serverless-function 插件,可以執行自定義代碼,合并來自后端服務的響應,并以不同的結構返回給 API 消費者。

原文鏈接:Batch Request Processing With API Gateway

上一篇:

如何編寫 API 文檔:最佳實踐和示例

下一篇:

API 版本控制策略的 4 個最佳實踐
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費