跳轉至

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