指令碼開發 / 響應大量資料 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
|