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反饋問題。
相關文章
- EF架構~EF非同步改造之路~倉儲介面的改造架構非同步
- EF架構~EF非同步改造之路~讓DbContextRepository去實現非同步介面架構非同步Context
- 可靠、高吞吐架構基礎改造架構
- 改造 Android 官方架構元件 ViewModelAndroid架構元件View
- 異構資料來源同步之資料同步 → datax 改造,有點意思
- Android MVP架構改造~如何重用頂層業務AndroidMVP架構
- 更安全、更低耗的微服務架構改造之道微服務架構
- 同步非同步,阻塞非阻塞非同步
- 非同步、同步、阻塞、非阻塞非同步
- 同步、非同步、阻塞、非阻塞非同步
- MySQL 半同步複製+MMM架構MySql架構
- 車聯網服務non-RESTful架構改造實踐REST架構
- 專案管理的魅力--舊有網路架構改造(轉)專案管理架構
- 同步非同步 與 阻塞非阻塞非同步
- 理解阻塞、非阻塞、同步、非同步非同步
- 同步、非同步,阻塞、非阻塞理解非同步
- 同步、非同步、阻塞與非阻塞非同步
- 同步、非同步、阻塞和非阻塞非同步
- 架構師必備:巧用Canal實現非同步、解耦的架構架構非同步解耦
- 羅輯思維首席架構師:Go微服務改造實踐架構Go微服務
- 系統架構7個非功能性需求架構
- [轉]阻塞/非阻塞與同步/非同步非同步
- 同步與非同步 阻塞與非阻塞非同步
- 對.net系統架構改造的一點經驗和教訓架構
- 非易失性WAL BUFFER解析:flush WAL改造
- java同步非阻塞IOJava
- 非同步和非阻塞非同步
- 同步、非同步、阻塞、非阻塞的區別非同步
- 分散式架構中非同步的使用場景分散式架構非同步
- 徹底搞懂同步非同步與阻塞非阻塞非同步
- IO - 同步 非同步 阻塞 非阻塞的區別非同步
- 同步、非同步、阻塞、非阻塞的簡單理解非同步
- 同步與非同步、阻塞與非阻塞的理解非同步
- 1.2.1. 非多租戶架構帶來的挑戰架構
- 分散式政企應用如何快速實現雲原生的微服務架構改造分散式微服務架構
- .net專案架構改造之搭建基於java環境配置一覽【上】架構Java
- Redux技術架構簡介(二)– 非同步實現Redux架構非同步
- DAOS 分散式非同步物件儲存|架構設計分散式非同步物件架構