最好看免費觀看高清大全城中之城上海關鍵詞優(yōu)化排名哪家好
文章目錄
- 1.異步
- 1.1 調(diào)用異步
- 1.2 流程異步
- 1.3 數(shù)據(jù)流異步
- 1.4 小結(jié)
- 2.并發(fā)
- 2.1 請求并發(fā)
- 2.2 冗余請求
- 2.3 小結(jié)
- 參考文獻
1.異步
對于處理耗時長的任務,如果采用同步等待的方式,會嚴重降低系統(tǒng)的吞吐量,可以采用異步化進行解決。
異步(Asynchronous)是一種編程模型或執(zhí)行方式,在這種方式中,任務的啟動和完成不是同步的,也就是說,程序不會在等待任務完成時阻塞,而是可以繼續(xù)執(zhí)行其他操作。當異步任務完成時,程序會通過回調(diào)、通知或事件的方式獲取結(jié)果或處理后續(xù)操作。
1.1 調(diào)用異步
異步調(diào)用發(fā)生在使用異步編程模型來提高代碼效率的時候,實現(xiàn)方式主要有:
- Callback
異步回調(diào)通過注冊一個回調(diào)函數(shù),然后發(fā)起異步任務,當任務執(zhí)行完畢時會回調(diào)用戶注冊的回調(diào)函數(shù),從而減少調(diào)用端等待時間。這種方式會造成代碼分散難以維護,定位問題也相對困難。
- Promise 和 Future
當用戶提交一個任務時會立刻先返回一個Future,然后任務異步執(zhí)行,后續(xù)可以通過 Future 獲取執(zhí)行結(jié)果。
JavaScript 中的 Promise 和 Java 中的 CompletableFuture 都是常見的異步處理方式。
// 使用 Promise 處理異步操作
let promise = new Promise((resolve, reject) => {// 模擬異步操作setTimeout(() => resolve('Operation complete'), 1000);
});promise.then(result => console.log(result)); // 輸出: "Operation complete"
- Async/Await
Async/Await 是對 Promise 的進一步封裝,提供了更簡潔、更易讀的異步代碼寫法。使用 async 標記的函數(shù)會返回一個 Promise,而 await 關鍵字用于暫停函數(shù)的執(zhí)行,直到 Promise 處理完成。
JavaScript 和 Python 都支持 async/await 語法。
async function fetchData() {let response = await fetch('https://api.example.com/data');let data = await response.json();console.log(data);
}fetchData();
- 事件驅(qū)動
事件驅(qū)動模型常用于 GUI 編程和服務器端編程,通過事件觸發(fā)異步操作的處理。
比如 Node.js 通過事件驅(qū)動模型來處理異步 I/O 操作。
const EventEmitter = require('events');
const eventEmitter = new EventEmitter();// 定義事件處理程序
eventEmitter.on('dataReceived', (data) => {console.log('Data received:', data);
});// 模擬異步數(shù)據(jù)接收
setTimeout(() => eventEmitter.emit('dataReceived', 'Sample Data'), 1000);
- CPS(Continuation-Passing Style)
可以對多個異步編程進行編排,組成更復雜的異步處理,并以同步的代碼調(diào)用形式實現(xiàn)異步效果。
CPS 將后續(xù)的處理邏輯當作參數(shù)傳遞給 Then 并可以最終捕獲異常,解決了異步回調(diào)代碼散亂和異常跟蹤難的問題。Java 中的 CompletableFuture 和 C++ PPL(Parallel Patterns Library)基本支持這一特性。典型的調(diào)用形式如下:
void handleRequest(const Request &req) {return req.Read().Then([](Buffer &inbuf){return handleData(inbuf);}).Then([](Buffer &outbuf){return handleWrite(outbuf);}).Finally(){return cleanUp();});
}
關于 CPS 更多信息推薦閱讀:2018 中國 C++ 大會的吳銳_C++服務器開發(fā)實踐部分。
調(diào)用異步是一種異步編程模型,通過允許任務非阻塞地執(zhí)行,使程序在等待某些操作(如 I/O 操作)完成的同時,能夠繼續(xù)處理其他任務,從而提高并發(fā)性和性能。常見的實現(xiàn)方式包括回調(diào)函數(shù)、Promise/Future、Async/Await,以及事件驅(qū)動模型等。
1.2 流程異步
一個業(yè)務流程往往伴隨著調(diào)用鏈路長、后置依賴多等特點,導致業(yè)務流程處理耗時長,降低了系統(tǒng)的可用性和并發(fā)處理能力。
同步改異步,可以降低主鏈路的處理耗時。
舉個例子,比如我們?nèi)?KFC 點餐,遇到排隊的人很多,當點完餐后,大多情況下我們會隔幾分鐘就去問好了沒,反復去問了好幾次才拿到,在這期間我們也沒法干活了。
這個就叫同步輪訓,這樣效率太低了。
服務員被問煩了,就在點完餐后給我們一個號碼牌,每次準備好了就會在服務臺叫號,這樣我們就可以在被叫到的時候再去取餐,中途可以繼續(xù)干自己的事。這就叫異步。
當一個微服務需要處理大量的請求或任務時,直接處理這些任務可能導致服務壓力過大。通過消息隊列(如 Kafka、RabbitMQ、RocketMQ 等)對耗時的任務進行異步化。
微服務將任務消息發(fā)送到消息隊列中,另一個處理服務從隊列中取出任務異步處理。這樣可以解耦服務,提升系統(tǒng)的彈性和擴展性。
1.3 數(shù)據(jù)流異步
處理大量實時數(shù)據(jù)流(如日志數(shù)據(jù)、傳感器數(shù)據(jù))。
使用流處理框架(如 Apache Flink、Spark Streaming)來異步處理數(shù)據(jù)流。數(shù)據(jù)被實時處理和分析,結(jié)果可以用于實時監(jiān)控和決策。
1.4 小結(jié)
在微服務架構(gòu)中,異步處理可以顯著提高系統(tǒng)的性能和擴展性。通過異步編程模型、消息隊列、數(shù)據(jù)流異步處理,微服務可以更高效地處理并發(fā)請求、管理任務和優(yōu)化資源利用。異步編程不僅提升了系統(tǒng)的響應速度,還增強了系統(tǒng)的靈活性和可擴展性。
2.并發(fā)
在微服務架構(gòu)中,并發(fā)處理是提升系統(tǒng)性能和響應能力的關鍵技術。并發(fā)使得系統(tǒng)能夠同時處理多個任務或請求,顯著提高吞吐量和資源利用率。
2.1 請求并發(fā)
如果一個任務需要處理多個子任務,可以將沒有依賴關系的子任務并發(fā)化,這種場景在后臺開發(fā)很常見。
如一個請求需要查詢 3 個數(shù)據(jù),分別耗時 T1、T2、T3,如果串行調(diào)用總耗時 T=T1+T2+T3。對三個任務執(zhí)行并發(fā),總耗時 T=max(T1,T 2,T3)。同理,寫操作也如此。對于同種請求,還可以同時進行批量合并,減少 RPC 次數(shù)。
2.2 冗余請求
冗余請求指同時向后端服務發(fā)送多個同樣的請求,誰響應快就是使用誰,其他的則丟棄。
這種策略縮短了主調(diào)方的等待時間,但也使整個系統(tǒng)調(diào)用量猛增,一般適用于初始化或者請求少的場景。比如騰訊的移動連通服務維納斯(WNS,Wireless Network Service)的跑馬模塊其實就是這種機制,跑馬模塊為了快速建立長連接同時向后臺多個 IP/Port 發(fā)起請求,誰快就用誰,這在弱網(wǎng)的移動設備上特別有用,如果使用等待超時再重試的機制,無疑將大大增加用戶的等待時間。
這種方式較少使用,知道即可。
2.3 小結(jié)
并發(fā)在微服務架構(gòu)中通過多線程/多進程、異步 I/O、并行計算和流處理等方式,顯著提升了系統(tǒng)的處理能力和性能。它能夠有效地處理大量并發(fā)請求和數(shù)據(jù)流,優(yōu)化資源利用率,并提高系統(tǒng)的響應速度和吞吐量。通過合理應用并發(fā)技術,微服務系統(tǒng)可以更好地應對高負載和高并發(fā)的挑戰(zhàn)。
參考文獻
服務高并發(fā)、高性能、高可用實現(xiàn)方案- 楊豈