系統設計面試指南之分散式任務調度

来源:https://www.cnblogs.com/JavaEdge/archive/2023/11/30/17867713.html
-Advertisement-
Play Games

1 簡介 任務是需要資源(CPU 時間、記憶體、存儲、網路帶寬等)在指定時間內完成的一段計算工作。 通過智能地將資源分配給任務以滿足任務級和系統級目標的系統稱為任務調度程式。 任務調度程式: 及時決定和分配資源給任務的過程稱為任務調度。 當我們在 Facebook 發表評論時。我們不會讓評論發佈者等待 ...


1 簡介

任務是需要資源(CPU 時間、記憶體、存儲、網路帶寬等)在指定時間內完成的一段計算工作。

通過智能地將資源分配給任務以滿足任務級和系統級目標的系統稱為任務調度程式。

任務調度程式:

及時決定和分配資源給任務的過程稱為任務調度。

當我們在 Facebook 發表評論時。我們不會讓評論發佈者等待直到那條評論被交付給所有關註者。交付被委托給一個非同步任務調度程式離線完成。

在分散式系統中,許多任務是在用戶的單個請求的背景下運行。考慮Facebook、WhatsApp 或 Instagram 這樣的熱門系統有數億用戶。這些系統需要一個任務調度程式來處理數十億個任務。Facebook 使用 Async 根據其用戶的數十億個並行非同步請求來調度其所有任務。

Async 是 Facebook 自己的分散式任務調度程式,調度其所有任務。一些任務時間敏感,如應該運行的通知用戶某項活動開始直播的任務。如果用戶在直播結束後才收到通知就沒意義了。某些任務可延遲,如向用戶提出好友建議的任務。Async 根據適當的優先順序調度任務。

2 需求

  • 可用性:系統應高可用以調度和執行任務
  • 持久性:系統收到的任務應持久化,不應丟失
  • 可擴展性:系統應能每天調度和執行越來越多的任務
  • 有限的等待時間:這是任務在開始執行之前需要等待的時間。我們不能在預期時間之後執行任務。用戶不應該無限期地等待。如果用戶的等待時間超過一定閾值,他們應該收到通知

3 組件設計

3.1 任務調度程式架構設計

① Task Submitter(任務提交者)

接受任務。沒有單一的任務提交者。相反,我們有一組接收越來越多任務的節點。

② Database(資料庫)

任務提交者接收的所有任務都存儲在分散式資料庫。使用關係資料庫來存儲:

  • task IDs
  • user IDs
  • 所需資源
  • 執行上限
  • 客戶端嘗試總次數
  • 延遲容忍度
  • ...

使用有向無環圖(DAG)存儲依賴任務的數據的圖數據結構的非關係資料庫。

③ Batching and prioritization(批處理和優先順序)

將任務存儲在 RDB 後,將任務分批。優先順序基於任務的屬性,如:

  • 延遲容忍度
  • 或執行時間短的任務等。

將最高 K 優先順序的任務推送到分散式隊列,K限制可以推送到隊列的元素數量。K值取決許多因素,如:

  • 當前可用資源
  • 客戶端
  • 或任務優先順序
  • 訂閱級別

④ Queue manager(隊列管理器)

隊列管理器在隊列中添加、更新或刪除任務。它跟蹤我們使用的隊列的類型。它還負責保持任務在隊列中直到成功執行。如果任務執行失敗,該任務將再次出現在隊列。隊列管理器知道在高峰時段、非高峰時段應該運行什麼隊列。

⑤ Resource manager(資源管理器)

知道哪些資源空閑。它從分散式隊列中拉取任務並分配給它們資源。資源管理器:

  • 跟蹤每個任務的執行情況
  • 並將其狀態發送回隊列管理器

若任務超出其能力或所需的資源使用,則終止該任務,並將狀態發送回任務提交者,後者將通過錯誤消息通知客戶端有關任務終止的情況。

4 執行上限

4.1 任務分類

  • 不能延遲的任務 - 緊急任務
  • 可延遲的任務
  • 需定期執行的任務 - 周期性任務

基於任務類別的多個隊列:

系統需確保非緊急隊列中的任務不會被餓死。一旦某些任務的延遲限制即將達到,它就會被移動到緊急任務隊列以獲得優先服務。

4.2 優先順序

一些任務執行時間很長並占用資源,阻塞其他任務。在調度任務時,執行上限(execution cap)是個重要參數。

若我們完全分配資源給單個任務並等待該任務完成,則由於任務腳本錯誤,某些任務可能不會停止,無法完成執行。我們允許用戶為其任務設置執行上限。指定時間後停止任務執行,釋放資源並分配給隊列中的下一任務。若由於執行上限而停止任務執行,系統會通知所屬用戶的這些實例。他們需針對這種情況採取人工兜底。

5 任務緊急執行

有些任務需緊急執行。如Facebook社交應用中,用戶可在緊急情況下標記自己是安全的,如地震。執行此活動的任務應及時執行,否則此功能對 Facebook 用戶毫無用處。向客戶發送電子郵件通知,告知其賬戶扣除一定金額的資金,是另一個需要緊急執行的任務示例。

為優先處理任務,任務調度程式為每個任務維護一個delay tolerance(延遲容忍度)參數,併在接近其延遲容忍度時執行該任務。

延遲容忍度是任務執行可延遲的最大時間量。首先執行延遲容忍時間最短的任務。通過使用延遲容忍參數,可在高峰時段推遲延遲容忍值更長的任務,為緊急任務留出空間。

6 資源容量優化

有時資源接近過載閾值(如超過 80% 利用率),這就是高峰期。同一資源在非高峰時段可能閑置。所以,須考慮如何在非高峰時段更好利用資源及如何在高峰時段保持資源可用。

有些任務無需緊急執行。如Facebook社交應用,建議好友不是緊急任務。可以為這樣的任務創建一個單獨的隊列,併在非高峰時段執行它們。如果我們一直有比可用資源更多的工作要做,我們可能會遇到容量問題,就該配置更多資源。

7 任務冪等性

如果任務成功執行,但由於某些原因機器無法發送確認,則調度程式將再次調度該任務。再次執行該任務。

我們不希望再次執行任務時最終結果發生更改。這在轉賬時對金融應用程式至關重要。我們要求任務是冪等的。冪等任務無論執行多少次都會產生相同的結果。

此屬性是由開發人員在實現中添加的,通過某些內容(例如名稱)來標識該屬性並覆蓋舊的。

8 評估

8.1 可用性

任務提交是由多個節點完成的。若提交任務的節點失敗,其他節點將接替其位置。推送任務的隊列在本質上也是分散式,確保可用性。由於持續監控是否需要添加或刪除資源,可儘力保證始終有可用資源。設計中的每個組件都是分散式的,使得整個系統可用性大大增強。

8.2 持久性

我們將任務存儲在持久化分散式資料庫中,併在接近執行時間時將任務推送到隊列中。一旦提交任務,它就會在資料庫中直到執行完成。

8.3 可擴展性

任務調度程式提供可擴展性,因為設計中任務提交者是分散式的。可向集群添加更多節點以提交大規模數量的任務。

然後將這些任務保存到也是可擴展的分散式關係資料庫中。

再從 RDB 將任務推送到分散式隊列,它可隨任務數量增加而擴展。可為不同類型的任務添加更多隊列。還可根據資源與需求比添加更多資源。

8.4 容錯性

任務在首次發送執行時不會從隊列中刪除。如果執行失敗,將嘗試最大允許次數的重試。若任務包含死迴圈,會在指定時間後終止任務並通知用戶。

參考:

本文由博客一文多發平臺 OpenWrite 發佈!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 公眾號「架構成長指南」,專註於生產實踐、雲原生、分散式系統、大數據技術分享。 概述 隨著科技的進步,軟體系統的部署架構也在不斷演進,從以前傳統的物理機到虛擬機、Docker和Kubernetes,我們經歷了一系列變化。 這些技術的引入給我們帶來了更高的資源利用率、更快的部署速度和更強大的擴展性,下麵 ...
  • C++ 中要在一個函數內返回不同類型的值,你可以使用 C++17 引入的 std::variant 或 std::any,或者使用模板和多態。下麵將分別介紹這些方法。 方法一:使用 std::variant std::variant 允許你在一個函數內返回不同類型的值,但它要求所有可能的返回類型都在 ...
  • 主要探討了SpringMVC中的流程跳轉和不同形式的控制器之間的跳轉方式。首先回顧了JavaWeb中流程跳轉的核心代碼和頁面跳轉方式,並展示了在Web.xml中添加Servlet以及執行這些方式的示例。隨後,介紹了Spring MVC中的四種跳轉形式,包括控制器到JSP頁面的forward和redi... ...
  • 寫在前面 先吐槽兩句,搞個mysql安裝配置弄了4個小時,怎麼都是外網無法訪問,我靠,我特麽也是服了。 當然,後來我投降了,明天再說,學什麼不是學,娘的,換個方向,狀態依然在! Sijax是什麼? 代表 Simple Ajax ,它是一個 Python / jQuery 庫,使用 jQuery.aj ...
  • Sun公司提供了JavaMail用來實現郵件發送,但是配置煩瑣,Spring中提供了JavaMailSender用來簡化郵件配置,Spring Boot則提供了MailSenderAutoConfiguration對郵件的發送做了進一步簡化。 v準備工作 開通POP3/SMTP服務或者IMAP/SM ...
  • C語言分支結構詳解 1. if 語句 在本篇博客文章中,我們將深入探討C語言中的if語句及其相關用法。if語句是一種用於條件判斷的分支語句,它允許我們根據條件的真假來執行不同的代碼塊。 1.1 if 語句的基本語法和用法 if語句的基本語法如下所示: if (條件) { // 條件為真時執行的代碼塊 ...
  • CF786 我不會告訴你鏈接在圖片里 CF786A CF786A題意 給出一個大小為 \(n\) 的環,點順時針從 \(1\to n\) 編號,兩個人(設為 \(0,1\))輪流移動其中的一個棋子。 對於第 \(opt\) 人,他能夠將這個棋子順時針移動 \(x\in S_{opt}\)(\(S_{ ...
  • public class RandomNickName { public enum Gender{ MAN, WOMAN, UNKNOWN, ; } public static void main(String[] args) { String nickName = nickName(Gender. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...