為什么要使用批量請(qǐng)求處理?

當(dāng)客戶(hù)端向服務(wù)器發(fā)送多個(gè) API 請(qǐng)求時(shí),每個(gè)請(qǐng)求都需要一個(gè)單獨(dú)的 HTTP 請(qǐng)求/響應(yīng)周期。這種做法可能會(huì)導(dǎo)致延遲增加、性能下降和服務(wù)器負(fù)載增加。通過(guò)將多個(gè)請(qǐng)求合并為一個(gè)批處理請(qǐng)求,可以顯著減少 HTTP 請(qǐng)求/響應(yīng)周期的數(shù)量,從而提高性能并降低延遲。

批處理請(qǐng)求處理特別適用于以下場(chǎng)景:

批量請(qǐng)求處理的真實(shí)示例

示例 1: 社交媒體應(yīng)用程序

在傳統(tǒng)方法中,您需要為以下操作發(fā)出多個(gè) API 請(qǐng)求:

  1. 檢索用戶(hù)的好友列表。
  2. 對(duì)于每個(gè)好友,檢索他們的最新帖子。

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

示例 2: 移動(dòng)應(yīng)用程序

對(duì)于產(chǎn)品列表的填充,您通常需要發(fā)出以下多個(gè)請(qǐng)求:

  1. 檢索產(chǎn)品 ID 列表。
  2. 對(duì)于每個(gè)產(chǎn)品 ID,檢索產(chǎn)品詳細(xì)信息。

通過(guò)批處理請(qǐng)求,您可以將所有產(chǎn)品 ID 的詳細(xì)信息請(qǐng)求合并為一個(gè)批處理請(qǐng)求,從而提高數(shù)據(jù)檢索效率。

示例 3: 會(huì)議管理應(yīng)用程序

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

  1. /speaker/{speakerId}/sessions 獲取會(huì)話(huà)信息。
  2. /speaker/{speakerId}/topics 獲取相關(guān)主題信息。

使用批處理請(qǐng)求,您可以將這兩個(gè)請(qǐng)求合并為一個(gè)單一的請(qǐng)求,以獲取所有會(huì)話(huà)和主題信息,從而減少請(qǐng)求次數(shù)和提升用戶(hù)體驗(yàn)。

使用 Apache APISIX API 網(wǎng)關(guān)進(jìn)行批量請(qǐng)求處理

在 Apache APISIX 中實(shí)現(xiàn)批量請(qǐng)求處理可以使用 batch-requests 插件。該插件允許在單個(gè)請(qǐng)求有效負(fù)載中定義一組 API 請(qǐng)求。每個(gè)請(qǐng)求可擁有自己的 HTTP 方法、URL 路徑、標(biāo)頭集和有效負(fù)載。以下是如何使用該插件的示例:

假設(shè)有一個(gè)用于會(huì)議管理的 Web 應(yīng)用程序,系統(tǒng)中有多個(gè)演講者,需要在單個(gè)網(wǎng)頁(yè)上顯示演講者的會(huì)話(huà)和相關(guān)主題。使用 batch-requests 插件可以將所有這些請(qǐng)求分組到一個(gè) HTTP 請(qǐng)求中。以下是 curl 命令發(fā)送批量請(qǐng)求的示例:

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

收到批量請(qǐng)求后,batch-requests 插件將解析負(fù)載,并并行執(zhí)行每個(gè)請(qǐng)求。插件會(huì)將每個(gè)請(qǐng)求的響應(yīng)聚合,并以單個(gè) HTTP 響應(yīng)的形式返回給客戶(hù)端。

批量請(qǐng)求插件演示

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

先決條件

可以使用以下快速啟動(dòng)腳本輕松安裝和啟動(dòng) APISIX:

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

配置后端服務(wù)(上游)

需要為請(qǐng)求路由到的會(huì)議 API 配置后端服務(wù)。這可以通過(guò) Admin API 在 Apache APISIX 中添加一個(gè)上游服務(wù)器來(lái)實(shí)現(xiàn)。

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 創(chuàng)建路由

需要?jiǎng)?chuàng)建一個(gè)新路由,該路由攔截對(duì)公共虛擬端點(diǎn)的請(qǐng)求,并使用插件進(jìn)行批處理。

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

為演講者的主題和會(huì)話(huà)端點(diǎn)創(chuàng)建路由

接下來(lái),為演講者的主題和會(huì)話(huà)端點(diǎn)(及路徑匹配)創(chuàng)建另一個(gè)路由,以便 API 網(wǎng)關(guān)從批處理請(qǐng)求中提取的單個(gè)請(qǐng)求被轉(zhuǎn)發(fā)到會(huì)議 API 端點(diǎn),并引用現(xiàn)有的上游服務(wù)。

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"
}'

注意,這里使用了另一個(gè)代理重寫(xiě)插件,并為會(huì)議 API 隱式指定了主機(jī)地址。否則,API 網(wǎng)關(guān)將進(jìn)行 DNS 轉(zhuǎn)換,并通過(guò)其 IP 地址請(qǐng)求會(huì)議 API。

測(cè)試批處理請(qǐng)求處理

以下是如何在 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"
}
]
}'

在此示例中,為端點(diǎn)定義了路由,該端點(diǎn)支持通過(guò) batch-requests 插件進(jìn)行批量請(qǐng)求處理。該插件配置了一組兩個(gè)請(qǐng)求,每個(gè)請(qǐng)求按 ID 檢索包含主題和會(huì)話(huà)的演講者記錄。如果運(yùn)行此命令,將從 API 網(wǎng)關(guān)返回合并響應(yīng):

[
{
"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"
}
]

要點(diǎn)

使用 API Gateway 進(jìn)行批量請(qǐng)求處理是一種提升 API 性能的有效技術(shù)。Apache APISIX 提供了一個(gè)名為 batch-requests 的插件,方便開(kāi)發(fā)者實(shí)現(xiàn)批量請(qǐng)求處理。

最后

使用 API Gateway 還可以在響應(yīng)數(shù)據(jù)中提供自定義聚合。通過(guò) serverless-function 插件,可以執(zhí)行自定義代碼,合并來(lái)自后端服務(wù)的響應(yīng),并以不同的結(jié)構(gòu)返回給 API 消費(fèi)者。

原文鏈接:Batch Request Processing With API Gateway

上一篇:

如何編寫(xiě) API 文檔:最佳實(shí)踐和示例

下一篇:

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

我們有何不同?

API服務(wù)商零注冊(cè)

多API并行試用

數(shù)據(jù)驅(qū)動(dòng)選型,提升決策效率

查看全部API→
??

熱門(mén)場(chǎng)景實(shí)測(cè),選對(duì)API

#AI文本生成大模型API

對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

對(duì)比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)