所有文章 > API开发 > 使用 API 网关进行批量请求处理
使用 API 网关进行批量请求处理

使用 API 网关进行批量请求处理

批处理请求处理是一种在 Web 开发中提高 API 性能的强大技术。它允许将多个 API 请求合并为一个单独的 HTTP 请求/响应周期,从而减少客户端与服务器之间的往返次数。客户端的一个请求可以被转换成多个后端服务器的请求,最终将响应聚合为一个统一的客户端响应。

本文将探讨如何在 Apache APISIX 中实现批量请求处理,并讨论这种技术的潜在用例及其带来的好处。

为什么要使用批量请求处理?

当客户端向服务器发送多个 API 请求时,每个请求都需要一个单独的 HTTP 请求/响应周期。这种做法可能会导致延迟增加、性能下降和服务器负载增加。通过将多个请求合并为一个批处理请求,可以显著减少 HTTP 请求/响应周期的数量,从而提高性能并降低延迟。

批处理请求处理特别适用于以下场景:

  • 从数据库中检索多条记录:一次性请求多条记录,而不是对每条记录分别进行请求。
  • 更新数据库中的多条记录:将多个更新操作合并为一个请求,减少对数据库的访问次数。
  • 执行多个 API 请求以完成任务:将多个 API 操作合并为一个批处理请求,提高操作效率和响应速度。

批量请求处理的真实示例

示例 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。

先决条件

  • Docker:用于安装容器化的 etcd 和 APISIX。
  • curl:用于向 APISIX Admin API 发送请求。也可以使用 Postman 等工具与 API 进行交互。

可以使用以下快速启动脚本轻松安装和启动 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文章!