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