異步工作流有助于減少那些原本順序執(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ù)雜性。