<del id="nnjnj"></del><track id="nnjnj"></track>

<p id="nnjnj"></p>

<address id="nnjnj"></address>

    <pre id="nnjnj"><pre id="nnjnj"></pre></pre>

      <noframes id="nnjnj"><ruby id="nnjnj"><ruby id="nnjnj"></ruby></ruby>

      • 自動秒收錄
      • 軟件:1973
      • 資訊:57811|
      • 收錄網站:279872|

      IT精英團

      深入了解美團葉子發射器開源方案

      深入了解美團葉子發射器開源方案

      瀏覽次數:
      評論次數:
      編輯: 樂詠
      信息來源: ITPUB
      更新日期: 2022-09-20 00:45:53
      摘要

      大家好,我是樹哥。之前我們有聊過「如何設計一個分布式ID發號器」,其中有講過4種解決方案,分別是:UUID類雪花算法數據庫自增主鍵Redis原子自增美團以第2、3種解決方案為基礎,開發出

      • 正文開始
      • 相關閱讀
      • 推薦作品

      大家好,我是樹哥。

      我們之前講過“如何設計一個分布式的身份證號碼發送器”,其中有四種解決方案,分別是:

      全球唯一標識符

      雪花狀算法

      數據庫自增主鍵

      Redis原子自增長

      基于美團的第二和第三種解決方案,開發了一個分布式ID生成方案Leaf,并且開源。我們可以在GitHub上獲得該項目的源代碼,以及相關文檔。項目地址是美團-大眾點評/leaf3360分布式id生成服務。

      今天我們來學習一下Leaf的設計思路,看看大廠是怎么設計大型中間件的,有利于進一步提高我們自己的系統設計能力。

      數據庫自增主鍵

      在“如何設計分布式ID發射器?在文章中,我們說可以基于數據庫自增主鍵來設計數字發送器。但是我們也提到了以下兩個問題:

      只能依賴堆機器提高性能。's的要求再次增加時,我們只能無限期地堆積機器,這似乎是一種物理防御。

      當我們需要給水平擴展困難。,增加一臺機器時,處理過程非常麻煩。首先,我們需要部署新添加的服務器,設置新的步長,并設置一個不可能的初始值。新服務器部署好了,一個接一個的處理老服務器,真的很痛苦??梢哉f是人力運維。

      簡單來說就是基于數據庫主鍵自增的方式,其發號效率受限于單個物理機。它在低QPS時可以被支持,但在高QPS時卻不能被支持。即使可以通過設計步長來堆疊機器,運行和維護成本也非常高。

      在這種業務背景下,美團開源的Leaf做了進一步的優化,在數據庫和業務服務之間增加了一個中間層。以前業務系統直接請求數據庫?,F在業務系統不直接請求數據庫,而是請求葉子中間層,然后葉子中間層去數據庫取數據。

      整個服務在Leaf 中間層每次去數據庫獲取 ID 的時候,一次性獲取一批 ID 號碼段,而不是只獲取一個 ID。的具體處理流程如下。

      葉段處理流程——圖片來自美團技術團隊的博客。如上圖所示,綠色業務系統請求葉號發放服務時,攜帶業務代碼標識。然后葉編號服務根據服務號碼類型返回下一個唯一ID。葉子號發放服務一次從數據庫中獲取1000個id,數據庫在表中插入一條數據,表示這1000個id發放給了某個商家。

      另外,通過這種方式,原本業務系統獲取 1000 個 ID 需要進行 1000 次數據請求,現在可能只需要 1 次就夠了,極大地提高了運行效率。,在業務系統獲取ID時,是從內存中獲取的,所以不需要詢問第三方,大大提高了響應速度。

      雖然上述方法解決了數據庫層的壓力問題,但也存在一些問題,如在 ID 號碼段發完時,這時候需要去進行數據庫請求,這次請求的耗時就會突增,系統監控上就會出現耗時尖刺。.

      為了解決這個問題,美團Leaf采用了「雙 Buffer + 預加載」's策略,即在內存中維護兩個ID段,當其使用率達到10%時預加載最后一個ID段。其實有點像我們。

      App 上加載瀑布流的預加載,思路是一樣的。其設計思路如下圖所示。

      雙 Buffer + 預加載 - 圖片來自美團技術團隊博客

      通過預加載的方式,Leaf 解決了尖刺的問題,并且提供了一定程度的數據庫宕機高可用。如果數據庫宕機,Leaf 服務還可以提供一段時間的服務,只要其在短時間內可以恢復。

      按照官方博客種的說法,這套方案再上線半年之后又遇到了問題 —— 發號 ID 段是固定的,但流量不是固定的,如果流量增加 10 倍,就會發現維持的時間很短,這樣仍然有可能導致數據庫壓力較大。

      為了解決這個問題,其采用了動態號碼段的思路,即:根據上次號碼段的長度及分發耗時,計算出下次應發的號碼段長度。對于號碼長度的計算規則如下:

      • T < 15min,nextStep = step * 2
      • 15min < T < 30min,nextStep = step
      • T > 30min,nextStep = step / 2

      簡單地說,如果耗時低于 15 分鐘,那么下次應發的號碼段長度變為原有的 2 倍。如果在 15 - 30 分鐘之間,那么就保持應發號碼段長度不變。如果耗時大于 30 分鐘, 那么下次應發號碼段長度減半。

      這種設計思路,其實有點像 Hotspot 虛擬機獲取鎖時的自適應自旋,或許我們可以稱它為:自適應長度。

      即使 Leaf 做了如此多的優化,但在更惡劣的環境下,仍然可能發生系統不可以的情況,例如:

      1. 數據庫主庫突然宕機,短時間內無法恢復,此時系統不可用。
      2. 業務流量突增幾十倍,即使有批量分發,但數據庫單機無法支撐如此高的寫請求。
      3. 等等

      在上面這些場景下,系統仍然無法保證高可用。究其根本,這是因為 Leaf 對數據庫是強依賴的,因此需要從數據庫層面去做高可用保障。

      按照 Leaf 官方博客的思路,Leaf 目前使用了半同步的方式同步數據,并且實現了主從切換。這就解決了主庫宕機的問題,進一步提升了高可用程度。

      MySQL 半同步有點類似于 Kafka 的副本同步,需要有一個 slave 收到 binlog 之后,才能提交事務,從而保證了一定程度上的一致性,降低了號碼段重發的風險。

      但由于半同步方式,并無法保證數據強一致性,因此極端情況下還是可能會有號碼段重發的風險,只是較低罷了。如果需要保證完全的強一致性,那么需要考慮使用 MySQL 的 Group Replication 特性。但由于美團內部的數據庫強一致性特性還在迭代中,因此 Leaf 也未實現數據強一致性。

      類雪花算法

      在「如何設計一個分布式 ID 發號器?」文章里,我們說到雪花算法是一個非常好的分布式 ID 生成算法。但其存在一個缺陷 —— 存在時鐘回撥的問題。美團開源的 Leaf 也實現了基于雪花算法的分布式 ID 生成功能,并且解決了時鐘回撥的問題。

      美團 Leaf 引入了 zookeeper 來解決時鐘回撥問題,其大致思路為:每個 Leaf 運行時定時向 zk 上報時間戳。每次 Leaf 服務啟動時,先校驗本機時間與上次發 ID 的時間,再校驗與 zk 上所有節點的平均時間戳。如果任何一個階段有異常,那么就啟動失敗報警。

      這個解決方案還是比較好理解的,就是對比上次發 ID 的時間,還有其他機器的平均時間。除了時間回撥的問題,當機器數量變多的時候,雪花算法中的 workerId 也不是很好維護。

      因此,Leaf 也用 zookeeper 作為中間件,以每個服務器的 IP + Port 作為 key 去注冊一個節點,獲取一個 int 類型的節點作為 workerId。

      總結

      美團開源的 Leaf 提供了兩種 ID 生成方式:

      1. 號碼段模式。基于數據庫自增組件,ID 從低位趨勢增長,能夠忍受 MySQL 短時間不可用。
      2. 類雪花算法模式。基于雪花算法,解決了時間回撥以及海量機器的 workId 維護問題。

      對于號碼段模式而言,其在傳統的自增 ID 基礎上,增加了 Proxy 模式,提出號碼段模式。接著,又采用「雙 Buffer + 預加載」的方式解決尖刺的問題。再之,為了解決流量暴增的問題,采用了自適應號碼段長度的優化思路。最后,在數據庫高可用上,使用 MySQL 半同步復制 + 主從切換,從一定程度上保障了高可用。

      對于類雪花算法模式而言,其引入了 zookeeper 作為海量機器的 workerId 生成方法。其次,還通過「本地存儲時間戳 + 定時上報時間戳」的方式,解決了時間戳的問題。

      好了,這就是今天分享的全部內容了。

      如果你喜歡今天的分享,記得一鍵三連支持我!你的鼓勵,是我寫文章最大的動力!

      參考資料

      • Meituan-Dianping/Leaf: Distributed ID Generate Service

      • Leaf:美團分布式 ID 生成服務開源 - 美團技術團隊

      • Leaf—— 美團點評分布式 ID 生成系統 - 美團技術團隊

      • 美團分布式 ID 生成框架 Leaf 源碼分析及優化改進 - SegmentFault 思否

      • Leaf:美團的分布式唯一 ID 方案深入剖析 - 簡書

      • UidGenerator:百度開源的分布式 ID 服務(解決了時鐘回撥問題)



      內存泄漏——原因、避免和位置
      ? 上一篇 2022-09-20
      從PG15開始WAL壓縮優化
      下一篇 ? 2022-09-20
      • 如何在Ubuntu中保留文件系統并備份當前開發板鏡像
        0閱讀 0條評論 個贊
        在Ubuntu保留文件系統或者說備份當前開發板鏡像的需求在不斷增加。比如Ubuntu文件系統需要安裝庫文件的話直接使用apt-get工具就可以下載,但由于需要下載的核心板較多,比較費時間,這時需要將安……
      • 國產核心板全志T507助力消防系統升級
        0閱讀 0條評論 個贊
        9月16日下午,位于湖南長沙市區內的中國電信大樓發生火災,建筑高度218米,現場濃煙滾滾,數十層樓體燃燒劇烈。消防救援人員趕到現場后很快將火勢控制住,目前大樓火勢已被撲滅,所幸未發現人員傷亡。湖南電信……
      • 教大家如何處理Spring Boot易流中的用戶和群體!
        0閱讀 0條評論 個贊
        1.準備工作2.用戶操作2.1添加用戶2.2修改用戶2.3刪除用戶2.4查詢用戶3.組操作3.1添加組3.2修改組3.3刪除組3.4查詢組4.查看表詳情雖然說我們在實際開發中,……
      • 從PG15開始WAL壓縮優化
        0閱讀 0條評論 個贊
        PG15傳聞中的超級令人激動的功能大多數跳票了,年初我也寫過一個關于PG15新功能跳票的文章。PG15BETA已經發出幾個月了,似乎PG15里令人激動人心的功能不多,不過從長長的新功能列表里,……
      • 內存泄漏——原因、避免和位置
        0閱讀 0條評論 個贊
        .css-1yuhvjn{margin-top:16px;}.css-3jt6os.FileLinkCard{-webkit-align-items:center;-webkit-box-align……
      發表評論 共有條評論
      用戶名: 密碼:
      驗證碼: 匿名發表
      • Java源代碼分析|對象
        0閱讀 0條評論 個贊
        Object定義Object類是類層次結構的根。每個類都有Object類作為超類。所有對象,包括數組等,都實現了這個類的方法。靜態代碼塊在Object類的最開始部分,有如下四行代碼:priva……
      • 珊瑚??缃K端解決方案及移動端動態布局實踐
        0閱讀 0條評論 個贊
        目錄1.背景和介紹1.1跨端動態化技術的現狀和問題1.2珊瑚海介紹1.3與其他框架的對比1.4應用案例2.珊瑚海技術方案2.1整體設計2.2D2X2.3開發工具2.4移動端引擎2.5……
      • SQL SERVER存儲過程學習筆記
        6閱讀 0條評論 個贊
        將常用的或很復雜的工作,預先用SQL語句寫好并用一個指定的名稱存儲起來,那么以后要叫數據庫提供與已定義好的存儲過程的功能相同的服務時,只需調用execute,即可自動完成命令。存儲過程的優點1.存儲……
      • 如何使用spark或hive sql將Excel文件加載到hive表中
        0閱讀 0條評論 個贊
        .css-1yuhvjn{margin-top:16px;}.css-3jt6os.FileLinkCard{-webkit-align-items:center;-webkit-box-align……
      • 面試問題:Java序列化和反序列化
        0閱讀 0條評論 個贊
        目錄序列化和反序列化的概念應用場景?序列化實現的方式繼承Serializable接口,普通序列化繼承Externalizable接口,強制自定義序列化serialVersionUID的作用靜態變量不會……
      • SQL Server批量完整備份
        0閱讀 0條評論 個贊
        一.本文所涉及的內容(Contents)本文所涉及的內容(Contents)背景(Contexts)實現代碼(SQLCodes)實現方式一(One)實現方式二(Two)實現方式三(Three)參考文……
      • 人工智能OPS的莫拉維克悖論
        3閱讀 0條評論 個贊
        莫拉維克的悖論是人工智能和機器人研究人員觀察到,與傳統假設相反,推理需要很少的計算,但感覺運動和感知技能需要大量的計算資源。該原則由HansMoravec、RodneyBrooks、Marvin……
      • 如何不寫YAML來管理Kubernetes應用程序?
        2閱讀 0條評論 個贊
        Kubernetes將自身邊界內的事物都抽象為資源。其中的主要部分,是以Deployment、StatefulSet為代表的workload工作負載控制器,其他各類資源都圍繞這些主要的資源工……
      • spring MVC(II)——請求處理參數和響應數據處理
        0閱讀 0條評論 個贊
        1、請求處理參數1.1請求參數@RequestParam1.1.1不使用@RequestParam注解請求參數處理,不使用參數注解:1.如果請求參數名和請求處理的形參名一致,springMv……
      • 舉例說明庫伯內特公司的豆莢核心資源
        3閱讀 0條評論 個贊
        目錄一、Pod定義二、Pod入門yaml描述文件三、共享NetworkNamespace四、共享PID五、容器生命周期六、初始化容器6.1、簡介6.2、與普通容器的區別6.3、實驗七、Pod探針7.1……
      • sql server系統表的詳細說明
        0閱讀 0條評論 個贊
        sysaltfiles主數據庫保存數據庫的文件syscharsets主數據庫字符集與排序順序sysconfigures主數據庫配置選項syscurconfigs主數據庫當前配置選項sysdatab……
      • Velox簡介:一個開源的統一執行引擎
        0閱讀 0條評論 個贊
        ?Meta正在引入Velox,這是一個開源的統一執行引擎(unifiedexecutionengine),旨在加速數據管理系統和簡化其開發。?Velox正在積極開發中,Meta在2022……
      • 基于ASP.NET核心6.0的簡潔架構
        0閱讀 0條評論 個贊
        背景最近嘗試錄制了一個系列視頻:《ASP.NETCore6.0+Vue.js3實戰開發》,本節是視頻內部整潔架構的理論和實戰的文字稿。因為在錄制之前,我通常會編寫完整的文字內容作為視頻文案,這……
      • 公司排班系統遇到瓶頸?我自己造一個!
        10閱讀 0條評論 個贊
        本期名人堂我們有幸邀請到了白鯨開源的聯合創始人代立冬先生。代立冬先生與我們分享了自己社區開源的經歷,詳細介紹了一個開源項目是如何加入Apache孵化器,如何在導師的輔導下慢慢孵化、成長的過程,以及自己……
      • 網純原生實現時間單位定時任務執行,未依賴第三方組件
        0閱讀 0條評論 個贊
        常用的定時任務組件有Quartz.Net和Hangfire兩種,這兩種是使用人數比較多的定時任務組件,個人以前也是使用的Hangfire,慢慢的發現自己想要的其實只是一個能夠根據Cron……
      • 2022數字技能職業教育生態研討會
        9閱讀 0條評論 個贊
        職業教育是國民教育體系和人力資源開發的重要組成部分。發展職業教育,已經成為世界各國應對經濟、社會、人口、環境、就業等方面挑戰,實現可持續發展的重要戰略選擇。中國職業教育源遠流長,師徒制教學有著悠久的……
      • 碼頭工人日常工作的常用命令
        0閱讀 0條評論 個贊
        容器生命周期管理Docker創建新容器并運行[run]語法:dockerrun[OPTIONS]IMAGE[COMMAND][ARG...]OPTIONS說明:-astdin:指定標準輸入……
      • 海量小文件總結及解決策略(三)NameNode、Hadoop歸檔文件等
        0閱讀 0條評論 個贊
        .css-1yuhvjn{margin-top:16px;}.css-3jt6os.FileLinkCard{-webkit-align-items:center;-webkit-box-align……
      • 圖解架構| SaaS、PaaS、IaaS
        0閱讀 0條評論 個贊
        這是悟空的第164篇原創文章官網:www.passjava.cn你好,我是悟空哥。上次聊到了架構圖如何畫,其中涉及到了云服務的架構圖,里面提到了很重要的三個概念PaaS、IaaS、SaaS,很有必要……
      • Java開發學習(29)——Maven依賴轉移、可選依賴和排除依賴分析
        0閱讀 0條評論 個贊
        現在的項目一般是拆分成一個個獨立的模塊,當在其他項目中想要使用獨立出來的這些模塊,只需要在其pom.xml使用標簽來進行jar包的引入即可。其實就是依賴……
      最近發布資訊
      更多
      警花高潮嗷嗷叫
      <del id="nnjnj"></del><track id="nnjnj"></track>

      <p id="nnjnj"></p>

      <address id="nnjnj"></address>

        <pre id="nnjnj"><pre id="nnjnj"></pre></pre>

          <noframes id="nnjnj"><ruby id="nnjnj"><ruby id="nnjnj"></ruby></ruby>