Skip to content

Latest commit

 

History

History
116 lines (82 loc) · 4.62 KB

04. 進階撰寫技巧.md

File metadata and controls

116 lines (82 loc) · 4.62 KB

注意事項與執行效率的提升方式

雖然範例程式已說明了使用本雲端系統的開發方式,但有些事項稍微
注意一下,可以避免一些誤區,亦可大幅地提升整體的執行效率,以
下就是一些常見的問題:

資料的 UKey 是什麼意思

以下是最基礎的資料上傳方式,這時資料沒有特別指定 ukey。也
就是說,這筆資料屬於流水帳,就是會持續丟到資料庫裡面儲存的資
料,常見於 IoT 的設備端 raw data。這時,系統會依據收到的
資料時間,自動產生一個 ukey 給這筆資料,讓該資料會依照時間
排序。

let _data = { temp: 23.5, humi: 70.2 };  
let _payload = { uuid: _uuid, suid: _suid, values: [_data] };

HttpPost("https://test.mars-cloud.com/api/put?data", _payload);

以上的這範例,最後就會產生如下的資料,存入資料庫中:

{ temp: 23.5, system_time: 1714704702532, humi: 70.2, ukey: 9223370322150073275_0 }

這時,可以看到系統會壓上一個 system time 以及一個 ukey。其
中 system time 是系統收到該筆資料的時間,而 ukey 則為時間的
補數(long.MAX - system_time)。一個為升冪、一個是降冪,以方
便排序、搜尋處理。

另一種資料,則是開發者自行指定的 ukey,通常會是特定的資料內容。
像是與帳號、設備綁定的相關資料,或是ERP、交易記錄的單號等。

let _data = { ukey: _transaction_number, transaction_time: ????, transaction_result: ????, ... };  
let _payload = { uuid: _uuid, suid: _suid, values: [_data] };

HttpPost("https://test.mars-cloud.com/api/put?data", _payload);

如何儲存 binary 資料

本雲端系統的資料儲存方式,為基於 JSON 格式的文字基礎。因此,
若要儲存 binary 格式的資料時,需透過 BASE64 轉換,確保資料
轉換為無特殊字元之字串,再儲存至系統之中。但此方式不適合大量、
或是單筆大容量之資料儲存(如:影片)。

let _byteData = [ 0xFE, 0xAD, 0x9C, ....];
let _data = { my_byte_data: Base64Encode(_byteData).toString() };
let _payload = { uuid: _uuid, suid: _suid, values: [_data] };

HttpPost("https://test.mars-cloud.com/api/put?data", _payload);

如若需要大量或是單筆大容量的 binary 資料儲存,建議在自行撰寫
的服務中,回傳網路位置,然後只儲存該 url 至系統之中:

let _byteData = [ 0xFE, 0xAD, 0x9C, ....];
let _data_url = CallService("my.service", "/api/save_my_binary_data", _byteData);

let _data = { my_byte_data: _data_url };
let _payload = { uuid: _uuid, suid: _suid, values: [_data] };

HttpPost("https://test.mars-cloud.com/api/put?data", _payload);

提升儲存大量資料的效率

一般來說,儲存資料的方式大致上如上述的方式,但範例都是一筆一筆
存入的。如果一次要存入上百筆、甚至是上萬筆資料時,如果採用單筆
上傳,會讓效率變得極低。因此,會建議使用一次多筆傳輸的方式,大
致上的概念如下:

let _largetData = [{ ... }, { ... }, { ... }, ..., { ... }];
let _payload = { uuid: _uuid, suid: _suid, values: _largetData };

HttpPost("https://test.mars-cloud.com/api/put?data", _payload);

使用以上方式,會省去多次呼叫 API 的傳輸建立時間,於是就可快速、大
量地上傳資料。

提升讀取大量資料的效率

有儲存大量資料,自然會有讀取大量資料的需求。讀取大量資料的瓶頸,
主要來自於兩個關鍵:

  • 資料的結構配置與資料數量
  • 資料的傳輸量

其中資料的結構配置比較複雜,需根據專案的形態與資料內容來設計。本公
司有提供完整的顧問內容,歡迎來信或來電詢問。在此,我們先來討論資料
傳輸量的問題。

let _payload = { uuid: _uuid, suid: _suid, count: 0 }; // 當 count 為 0 時,代表取出全部資料
let _data = HttpPost("https://test.mars-cloud.com/api/lastdata?method=read&compressed=true", _payload);

_unBase64Data = Base64Decode(_data);
_unCompressedData = Unzip(_unBase64Data);

當取資料的 Restful API,加上了 compressed=true 這個參數後,
系統會將資料進行 ZIP 演算法的壓縮。由於本系統的資料,皆為文字形
態儲存,因此平均壓縮約為原資料量的 1/10 ~ 1/20 左右。因此會大幅
降低網路傳輸成本。但由於壓縮資料會耗費主機的運算資源與運算時間,所
以小資料量使用這種方式傳輸,不見得會加快速度。建議 2MB 以上的資料,
才使用此功能。