ossjssdk非同步架構改造
### 背景
隨著js的技術變革,es6/7的語法的慢慢普及,並且很多的sdk都開始對新的非同步進行支援,因此我們也在開始進行調研,總結目前sdk存在的問題:
- oss js sdk目前的非同步api需要依賴第三方庫co
- api的呼叫棧很不清晰,定位問題困難,只要是因為這個co庫
- 對於then的非同步方式需要一個wrapper來處理
- issue上反饋了很多使用者的訴求
### 結構變化
- 所有的對外暴露的api方法 由之前的
function*
轉變為async function
- 需要使用
yeild
的地方均由await
代替 - 底層非同步全部統一使用
Promise
/async await
形式 - 修改了部分bucket相關的api方法引數, 詳情參考readme
### 改進點
#### 1.使呼叫棧變得清晰,方便問題的排查。
co呼叫棧
可以看出: 呼叫棧非常不清晰,太多沒有用的 co 相關的呼叫棧。如果 n 個 generator 層層巢狀,就會出現 n 倍的 (anonymous)->onFullfiled->next->toPromise->co->Promise->(anonymous) 呼叫棧。如果你讀過 co 的原始碼可能知道,這是 co 將 generator 解包的過程。其實這個可以通過 yield generator -> yield* generator 來解決。
async呼叫棧
可以看出: asyncWrap 中呼叫了 B 函式,B 函式呼叫了 A 函式,A 函式中 resolve 了一個值。asyncWrap 中還呼叫了 stopProfiling 函式。
2.去除了co以及相關的依賴
- 減少了包的大小, 降低了1~2M
- 簡化了使用
3.迴歸原生實現方式,相容性更好
- 完全按照js es6/7的標準進行的封裝
- 大部分主流瀏覽器都已經支援
4.初始化client不再需要一個wrapper,直接進行初始化即可
### 使用方式
舉個最常用的上傳api使用例子,分片上傳
const oss = require(`ali-oss`);
const store = oss({
accessKeyId: `your access key`,
accessKeySecret: `your access secret`,
bucket: `your bucket name`,
region: `oss-cn-hangzhou`
});
//async function 進度回撥
async function asyncProgress(p, cpt, res) {
console.log(p);
console.log(cpt);
console.log(res.headers[`x-oss-request-id`]);
}
// 第二個引數是File|Blob
store.multipartUpload(`object`, `local-file`, {
progress: asyncProgress
}).then((result) => {
console.log(result);
});
//function 進度回撥
function progress(p, cpt, res) {
console.log(p);
console.log(cpt);
console.log(res.headers[`x-oss-request-id`]);
}
// 第二個引數是File|Blob
store.multipartUpload(`object`, `local-file`, {
progress: progress
}).then((result) => {
console.log(result);
});
還有其他相關api使用請參考我們的官方文件
### 寫在最後
- 我們會持續跟進js的新技術,選擇適合我們的技術並應用到sdk中去。
- 歡迎隨時到github中提issue反饋問題。
相關文章
- 異構資料來源同步之資料同步 → datax 改造,有點意思
- Android MVP架構改造~如何重用頂層業務AndroidMVP架構
- 更安全、更低耗的微服務架構改造之道微服務架構
- 同步非同步,阻塞非阻塞非同步
- 非同步、同步、阻塞、非阻塞非同步
- 車聯網服務non-RESTful架構改造實踐REST架構
- 同步、非同步,阻塞、非阻塞理解非同步
- 同步、非同步、阻塞與非阻塞非同步
- 同步非同步 與 阻塞非阻塞非同步
- 理解阻塞、非阻塞、同步、非同步非同步
- 架構師必備:巧用Canal實現非同步、解耦的架構架構非同步解耦
- 羅輯思維首席架構師:Go微服務改造實踐架構Go微服務
- 系統架構7個非功能性需求架構
- java同步非阻塞IOJava
- 非易失性WAL BUFFER解析:flush WAL改造
- 同步、非同步、阻塞、非阻塞的區別非同步
- 分散式架構中非同步的使用場景分散式架構非同步
- IO - 同步 非同步 阻塞 非阻塞的區別非同步
- 徹底搞懂同步非同步與阻塞非阻塞非同步
- 1.2.1. 非多租戶架構帶來的挑戰架構
- 分散式政企應用如何快速實現雲原生的微服務架構改造分散式微服務架構
- Redux技術架構簡介(二)– 非同步實現Redux架構非同步
- Redux技術架構簡介(二)-- 非同步實現Redux架構非同步
- 單機是最好的架構之二資料同步架構
- DAOS 分散式非同步物件儲存|架構設計分散式非同步物件架構
- 同步阻塞、同步非阻塞、多路複用的介紹
- React 重要的一次重構:認識非同步渲染架構 FiberReact非同步架構
- CoLAKE: 如何實現非結構性語言和結構性知識表徵的同步訓練
- TDengine:國內4家大型物流公司的資料架構改造例項彙總架構
- 大白話搞懂什麼是同步/非同步/阻塞/非阻塞非同步
- socket阻塞與非阻塞,同步與非同步、I/O模型非同步模型
- 實時多人遊戲同步方案:不同架構的對比遊戲架構
- 架構師必備:MySQL主從同步原理和應用架構MySql主從同步
- 非易失性WAL BUFFER解析:WAL日誌讀寫改造
- 非易失性WAL BUFFER實現機制解析:checkpoint改造
- 海量列式非關聯式資料庫HBase 架構,shell與API資料庫架構API
- Java 非阻塞 IO 和非同步 IOJava非同步
- 怎樣理解阻塞非阻塞與同步非同步的區別?非同步