跳转至

脚本开发 / 响应大量数据 DFF.RESP_LARGE_DATA

此功能于 1.3.0 版本新增

当需要返回大量内容(MB 级别及以上)时,直接通过return方式返回可能会因系统内部通讯处理等导致性能大幅下降。 此时,可使用DFF.RESP_LARGE_DATA(...)提升性能。

参数 类型 必须/默认值 说明
data str/dict/list 必须 指定返回的数据
content_type str None 指定响应体类型,如json, text, html

使用此方法时,必须保证资源目录配置、挂载正确,所有的 Web 服务器和工作单元都能正常访问到同一个共享目录

常见用例如下:

Python
1
2
3
4
5
@DFF.API('用例 1')
def case_1():
    data = {} # 大量数据(MB 级别及以上)

    return DFF.RESP_LARGE_DATA(data)

原理说明

DataFlux Func 底层由 Web 服务器和工作单元通过作为消息队列的 Redis 组合而成。直接return的数据,会被序列化后送入消息队列,再由 Web 服务器返回给调用方。

由于 JSON 的序列化/反序列化,Redis 上进行的入队出队、内部网络通讯等,都会因为单个 JSON 数据尺寸过大而导致性能下降。

本函数在底层实质上做了如下操作: 1. 将需要返回的数据作为文件保存到资源目录download目录下 2. 将请求作为「文件下载」响应(即上文中的DFF.RESP_FILE) 3. Web 服务器直接从资源目录中读取上述 1. 中保存的文件返回给客户端

通过此「绕行」的方法,使得系统内部通讯层面的处理轻量化以提升性能。

性能对比

以下是同样返回大约 3.5MB 大小的 JSON 时的性能对比:

  • 通过return data直接返回 JSON 时,耗费 18 秒时间
Bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
$ time wget http://172.16.35.143:8089/api/v1/al/auln-Ljo3y8HMUl91
--2021-09-16 22:40:09--  http://172.16.35.143:8089/api/v1/al/auln-Ljo3y8HMUl91
正在连接 172.16.35.143:8089... 已连接。
已发出 HTTP 请求,正在等待回应 ... 200 OK
长度:3363192 (3.2M) [application/json]
正在保存至:“auln-Ljo3y8HMUl91”

auln-Ljo3y8HMUl91            100%[=============================================>]   3.21M  --.-KB/s  用时 0.06s

2021-09-16 22:40:27 (50.4 MB/s) - 已保存 “auln-Ljo3y8HMUl91” [3363192/3363192])

wget http://172.16.35.143:8089/api/v1/al/auln-Ljo3y8HMUl91  0.00s user 0.02s system 0% cpu 18.321 total
  • 通过return DFF.RESP_LARGE_DATA(data)返回 JSON 时,仅耗费不足 1 秒时间
Bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
$ time wget http://172.16.35.143:8089/api/v1/al/auln-HPrfGRKIhYET
--2021-09-16 22:40:50--  http://172.16.35.143:8089/api/v1/al/auln-HPrfGRKIhYET
正在连接 172.16.35.143:8089... 已连接。
已发出 HTTP 请求,正在等待回应 ... 200 OK
长度:3687382 (3.5M) [application/json]
正在保存至:“auln-HPrfGRKIhYET”

auln-HPrfGRKIhYET            100%[=============================================>]   3.52M  --.-KB/s  用时 0.02s

2021-09-16 22:40:50 (183 MB/s) - 已保存 “auln-HPrfGRKIhYET” [3687382/3687382])

wget http://172.16.35.143:8089/api/v1/al/auln-HPrfGRKIhYET  0.00s user 0.02s system 12% cpu 0.174 total