脚本开发 / 响应大量数据 DFF.RESP_LARGE_DATA
当需要返回大量内容(MB 级别及以上)时,直接通过return
方式返回可能会因系统内部通讯处理等导致性能大幅下降。
此时,可使用DFF.RESP_LARGE_DATA(...)
提升性能。
参数 |
类型 |
必须/默认值 |
说明 |
data |
str/dict/list |
必须 |
指定返回的数据 |
content_type |
str |
None |
指定响应体类型,如json , text , html 等 |
使用此方法时,必须保证资源目录配置、挂载正确,所有的 Web 服务器和工作单元都能正常访问到同一个共享目录
常见用例如下:
Python |
---|
| @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
|