0

0

如何通过分页与批处理解决大规模数据API请求导致的503错误

心靈之曲

心靈之曲

发布时间:2026-02-21 15:29:11

|

323人浏览过

|

来源于php中文网

原创

如何通过分页与批处理解决大规模数据API请求导致的503错误

当从rest api批量拉取160万条记录时,因单次请求量过大(如25,000条/次)引发服务端超时或过载,导致503 service unavailable错误;本文提供基于游标分页与内存友好的分批处理方案,兼顾性能、稳定性和可扩展性。

当从rest api批量拉取160万条记录时,因单次请求量过大(如25,000条/次)引发服务端超时或过载,导致503 service unavailable错误;本文提供基于游标分页与内存友好的分批处理方案,兼顾性能、稳定性和可扩展性。

在高吞吐数据同步场景中,直接使用固定大小分页(如 ?limit=25000&offset=...)拉取数百万记录极易触发503错误——这并非客户端问题,而是服务端因长时间占用数据库连接、内存激增或响应超时而主动拒绝后续请求。Postman中“看似成功”往往掩盖了真实风险:它不模拟生产环境的并发压力、连接复用限制及超时策略,且缺乏错误重试与状态持久化能力。

根本解法是采用游标分页(Cursor-based Pagination) + 客户端二级分批处理

游标分页替代偏移分页
避免 offset 导致的性能退化(数据库需跳过前N行),改用排序字段(如 created_at 或自增ID)作为游标。每次请求携带上一批最后一条记录的游标值,服务端据此查询下一页:

POST /api/v1/data
Content-Type: application/json
{
  "cursor": "2024-05-20T14:22:38Z",  // 上一批最后一条的 created_at
  "limit": 25000
}

服务端SQL示例(PostgreSQL):

Dang.ai
Dang.ai

Dang.ai是一个AI工具目录集,已收集超过5000+ AI工具

下载
SELECT * FROM records 
WHERE created_at > $1 
ORDER BY created_at ASC 
LIMIT 25000;

客户端内存友好分批消费
即使单次API响应含25,000条,也不应一次性加载至内存处理。建议在应用层将每批响应再拆分为1,000条小批次进行异步写入或转换:

import requests
import time

def fetch_all_data():
    cursor = None  # 初始游标为空,首次请求获取最早数据
    total_fetched = 0

    while True:
        payload = {"limit": 25000}
        if cursor:
            payload["cursor"] = cursor

        resp = requests.post("https://api.example.com/data", json=payload, timeout=60)
        if resp.status_code != 200:
            raise Exception(f"API error: {resp.status_code} - {resp.text}")

        data_batch = resp.json()["data"]
        if not data_batch:
            break

        # 二次分批:每1000条为一组处理,降低内存峰值
        for i in range(0, len(data_batch), 1000):
            batch = data_batch[i:i+1000]
            process_batch(batch)  # 如写入DB、发送Kafka等
            total_fetched += len(batch)

        # 更新游标:取本批最后一条的排序字段值
        cursor = data_batch[-1]["created_at"]
        print(f"Fetched {total_fetched} records...")

        # 可选:轻量级节流,避免压垮服务端
        time.sleep(0.1)

def process_batch(batch):
    # 示例:批量插入数据库(使用参数化查询防注入)
    pass

⚠️ 关键注意事项

  • 服务端必须支持游标分页:确保API文档明确说明游标字段、排序规则及空游标行为(如首次请求不传cursor即返回最早数据);
  • 时间精度要足够:若按created_at分页,需确认数据库时间精度(毫秒级)并避免同一毫秒内多条记录——此时应追加唯一字段(如id)作为二级游标:WHERE (created_at, id) > ($1, $2);
  • 幂等性与断点续传:记录已处理的最新游标值到可靠存储(如Redis或DB),程序崩溃后可从中断处恢复;
  • 超时与重试策略:设置合理timeout(建议30–60s),对503/504错误实施指数退避重试(如retry_after=2^attempt * 1s);
  • 监控与告警:追踪单次请求耗时、游标推进速度、失败率,及时发现服务端性能拐点。

综上,503错误本质是系统设计失配的信号。放弃“大而全”的单次请求思维,转向“小而稳”的游标驱动流式拉取,辅以客户端精细化批处理,方能在海量数据场景中实现高可用、低延迟、易运维的数据同步链路。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

1006

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

334

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

379

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1782

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

376

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

1332

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

585

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

436

2024.04.29

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

796

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号