System Design 異步 - 學(xué)習(xí)筆記

引用:
系統(tǒng)設(shè)計(jì)入門

異步

異步工作流有助于減少那些原本順序執(zhí)行的請(qǐng)求時(shí)間。它們可以通過(guò)提前進(jìn)行一些耗時(shí)的工作來(lái)幫助減少請(qǐng)求時(shí)間,比如定期匯總數(shù)據(jù)。

消息隊(duì)列

消息隊(duì)列接收,保留和傳遞消息。如果按順序執(zhí)行操作太慢的話,你可以使用有以下工作流的消息隊(duì)列:

  • 應(yīng)用程序?qū)⒆鳂I(yè)發(fā)布到隊(duì)列,然后通知用戶作業(yè)狀態(tài)
  • 一個(gè) worker 從隊(duì)列中取出該作業(yè),對(duì)其進(jìn)行處理,然后顯示該作業(yè)完成

不去阻塞用戶操作,作業(yè)在后臺(tái)處理。在此期間,客戶端可能會(huì)進(jìn)行一些處理使得看上去像是任務(wù)已經(jīng)完成了。
例如,如果要發(fā)送一條推文,推文可能會(huì)馬上出現(xiàn)在你的時(shí)間線上,但是可能需要一些時(shí)間才能將你的推文推送到你的所有關(guān)注者那里去。

Redis 是一個(gè)令人滿意的簡(jiǎn)單的消息代理,但是消息有可能會(huì)丟失。
RabbitMQ 很受歡迎但是要求你適應(yīng)「AMQP」協(xié)議并且管理你自己的節(jié)點(diǎn)。
Amazon SQS 是被托管的,但可能具有高延遲,并且消息可能會(huì)被傳送兩次。

任務(wù)隊(duì)列

任務(wù)隊(duì)列接收任務(wù)及其相關(guān)數(shù)據(jù),運(yùn)行它們,然后傳遞其結(jié)果。 它們可以支持調(diào)度,并可用于在后臺(tái)運(yùn)行計(jì)算密集型作業(yè)。

Celery 支持調(diào)度,主要是用 Python 開(kāi)發(fā)的。
參見(jiàn):Celery 分布式任務(wù)隊(duì)列快速入門

背壓

如果隊(duì)列開(kāi)始明顯增長(zhǎng),那么隊(duì)列大小可能會(huì)超過(guò)內(nèi)存大小,導(dǎo)致高速緩存未命中,磁盤讀取,甚至性能更慢。背壓可以通過(guò)限制隊(duì)列大小來(lái)幫助我們,從而為隊(duì)列中的作業(yè)保持高吞吐率良好的響應(yīng)時(shí)間。
一旦隊(duì)列填滿,客戶端將得到服務(wù)器忙活著 HTTP 503 狀態(tài)碼,以便稍后重試。

異步的缺點(diǎn):

  • 簡(jiǎn)單的計(jì)算和實(shí)時(shí)工作流等用例可能更適用于同步操作,因?yàn)橐腙?duì)列可能會(huì)增加延遲和復(fù)雜性
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容