腳本開發 / 響應大量數據 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 |
---|
| @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
|