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