
基于 API 的 SaaS:定義、優勢和挑戰
// 異步
function getMsg() {
??? setTimeout(function () {
??????? return { msg: "Hello Node.js" };
??? }, 2000);
}
const msg = getMsg();
2、代碼執行順序
司步API從上到下依次執行,前面代碼會阻塞后面代碼的執行;異步API不會等待API執行完成后再向下執行代碼。
for (var i = 0; i < 100000; i++) {
??? console.log(i);
}
console.log("for循環后面的代碼");
異步API不會等待API執行完成后再向下執行代碼
console.log("代碼開始執行");
setTimeout(() => {
??? console.log("2秒后執行的代碼");
}, 2000);
setTimeout(() => {
??? console.log('"0秒"后執行的代碼');
}, 0);
console.log("代碼結束執行");
3、回調函數
自己定義的函數讓別人去調用
// getData函數定義
function getData(callback) {}
// getData函數調用
getData(() => {});
4、使用回調函數獲取異步API執行結果
function getMsg(callback) {
??? setTimeout(function () {
??????? callback({ msg: "Hello Node.js" });
??? }, 2000);
}
getMsg(function (msg) {
??? console.log(msg);
});
5、代碼執行順序分析
console.log("代碼開始執行");
setTimeout(() => {
??? console.log("2秒后執行的代碼");
}, 2000);
setTimeout(() => {
??? console.log('"0秒"后執行的代碼');
}, 0);
console.log("代碼結束執行");
6、Node.js中的異步API
fs.readFile("./demo.txt", (err, result) => {});
var server = http.createServer();
server.on("request", (req, res) => {});
1.長時間運行操作場景中,異步API更占優勢。
以需要長時間運行的業務為例,假設開發者正在構建一個使用機器學習來檢測博客帖子情緒的 SaaS,開發者需要提交一個指向該博客帖子的鏈接,該服務將分析該帖子的情緒并將其返回。這個操作可能需要幾秒甚至一分鐘才能完成。可是這個時間太慢了,對于用戶來說,如果不能在 5 秒內做出響應,就會失去耐心。因此,需要一個理解長時間運行操作概念的 API。
若使用同步 API設計,它的操作流程會是
“curl?-X?POST?-H?“Content-Type:?application/json”?-d?‘{“url”:?“https://www.wundergraph.com/blog/long_running_operations”}’?http://localhost:3000/api/v1/analyze_sentiment”
最終的響應結果是
“{?“status”:?“success”,??“data”:?{???“url”:?“https://www.wundergraph.com/blog/long_running_oerations”,????“sentiment”:?“positive”??}}”
此操作可能需要很長時間才能完成,并且用戶可能會取消它。
若使用異步 REST API設計,開發者需要返回具有唯一標識符的響應,以便客戶端可以輪詢服務器以獲取結果。設計此類 API 的正確方法是返回 202 Accepted 狀態代碼。
因此開發者最終獲得的響應效果將是一個帶有狀態代碼 202 和響應。此刻,客戶端可以使用以下命令來獲取作業的狀態:
curl?http://localhost:3000/api/v1/analyze_sentiment/1/status
意味著?API 的調用者可以及時獲取作業的當前狀態或取消它。
以 Unity 首選的資源管理工具Addressable Asset System為例,它雖然可以將資源的引用和打包分開處理,加快運行模式下和運行版本的項目迭代。但是現有的許多Unity 用戶開發的游戲不會有遠程下載內容的需要,意味著異步行為在其它項目中反而會變成約束。因此,開發者需要新添功能更專一、準確化程度更高的同步 API。
假設開發者新添加了Synchronous Addressables API,在 1.17.4 版的 Addressables 包中可以使用,兼容 Unity 2021.1、Unity 2020 LTS 和 Unity 2019 LTS。在有了新的 API 后,項目不必調整為異步加載就能用上 Addressables?了。同步行為在函數中以 AsyncOperationHandle 的 WaitForCompletion 方法表示,該方法會返回同步運算的結果。
開發者可以先聲明 Addressables.LoadAssetAsync<GameObject>(“MyPrefab”),返回 GameObject 運算的開關 AsyncOperationHandle<GameObject>。這時再聲明 WaitForCompletion 會讓系統阻攔代碼執行,直到資源加載完成。在加載完成后,WaitForCompletion 便會返回代碼請求的 GameObject。完成對異步和同步的同步運算。
事實上,在大部分實例中,同步加載的性能可比肩異步加載。而且同步加載的準確性更高。
從聯網汽車和恒溫器到智能交通信號燈和農場的作物管理,物聯網被用在各種部署中。物聯網設備通常會生成大量實時數據,并使用流技術來保存這些數據。但這并不適用于向最終用戶提供數據,因為物聯網設備本身缺乏一種有效、安全的方法來將其數據公開給想要查看或分析數據的用戶。幸運的是,這種情況正在改變。隨著事件原生 API 和API 網關的出現,可以根據數據消費者的需求,同步和異步地從 IoT 設備(以及各種其他資源)公開數據。
同步 API 是一種通過請求-響應模型公開數據的 API。當數據僅定期更改和/或當數據消費者不需要持續更新的信息流時,這種方法可以根據數據消費者的請求數據進行響應,比如構建一個報告室外溫度的應用程序,同步 API?可以實時報告數據;但是,如果處于數據不斷變化的環境內,異步API 會是更好的選擇,比如流經管道的水量或機器人在工廠車間的位置不斷變化,使用異步 API,流數據可以通過 API 公開。這樣,數據消費者可以使用 API 調用訪問持續更新的數據流,而無需直接連接到后端數據流。
參考鏈接:
https://mp.weixin.qq.com/s/bvoIptd7YwU45icqvoqokg
https://mp.weixin.qq.com/s/9c11pJ5d1nbE2vmGvCDwmQ
https://blog.csdn.net/cz_00001/article/details/132837290
https://mp.weixin.qq.com/s/OjmnK8LST7IavP5-9ByZZA
https://mp.weixin.qq.com/s/kw3huYO3XXtx30RCfwheAg