基於Dynomite的分佈式延遲隊列

在Netflix的平臺上運行着許多的業務流程,這些流程的任務是經過異步編排進行驅動,如今咱們要實現一個分佈式延遲隊列,這個延遲隊列具備以下特色:java

  • 分佈式
  • 不用外部的鎖機制
  • 高併發
  • 至少一次語義交付
  • 不遵循嚴格的FIFO
  • 延遲隊列(消息在未來某個時間以前不會從隊列中取出)
  • 優先級

1、使用Dynomite和Redis構建隊列

Dynomite是一種通用的實現,能夠與許多不一樣的key-value存儲引擎一塊兒使用。目前它提供了對Redis序列化協議(RESP)和Memcached寫協議的支持。咱們選擇Dynomite,是由於其具備性能,多數據中心複製和高可用性的特色。此外,Dynomite提供分片和可插拔的數據存儲引擎,容許咱們在數據需求增長垂直和水平擴展。面試

一、爲何選擇Redis?

咱們選擇Redis做爲構建隊列的存儲引擎:redis

  • Redis架構經過提供構建隊列所需的數據結構很好地支持了隊列設計,同時Redis的性能也很是優秀,具有低延遲的特性
  • Dynomite在Redis之上提供了高可用性、對等複製以及一致性等特性,用於構建分佈式集羣隊列。

一個隊列被存儲爲Redis的有序集合(ZADD和ZRANGE等操做),Redis使用分數對有序集合中的成員進行排序,當往隊列中存儲數據時,根據優先級和超時時間計算分數。服務器

二、使用Redis實現數據的push和pop

對於每一個隊列,維護三組Redis數據結構:數據結構

  • 包含隊列元素和分數的有序集合
  • 包含消息內容的Hash集合,其中key爲消息ID。
  • 包含客戶端已經消費但還沒有確認的消息有序集合,Un-ack集合。

PUSH架構

  • 根據消息超時(延遲隊列)和優先級計算得分
  • 添加到隊列的有序集合
  • 將Message對象到Hash集合中,key是messageId。

POP併發

  • 計算當前時間爲最大分數。
  • 獲取分數在0和最大分數之間的消息。
  • 將messageID添加到unack集合中,並從隊列的有序集中刪除這個messageID。
  • 若是上一步成功,則根據messageID從Redis集合中檢索消息。

ACK框架

  • 從unack集合中刪除messageID。
  • 從Message有效集合中刪除messageID。
    客戶端未進行確認的消息,會被再度推回到隊列中(這是一個定時任務負責檢測)。

三、可用分區和機架意識

咱們的隊列是在Dynomite的JAVA客戶端Dyno之上創建的,Dyno爲持久鏈接提供鏈接池,而且能夠配置爲拓撲感知,此外,Dyno爲應用程序提供特定的本地機架(在AWS中,機架是一個區域,例如 us-east-1a、us-east-1b等),us-east-1a的客戶端將鏈接到相同區域的Dynomite/Redis節點,除非該節點不可用,在這種狀況下該客戶端將進行故障轉移。這個屬性被用於經過區域劃分隊列。異步

分片
隊列根據可用區域進行分片,將數據推送到隊列時,經過輪訓機制肯定分片,這種機制能夠確保全部分片的數據是平衡的,每一個分片都表明Redis中的有序集合,有序集中的key是queueName和AVAILABILITY _ZONE的組合。分佈式

避免全局鎖

 

  • 每一個節點(上圖中的N1...Nn)與可用性區域具備關聯性,而且與該區域中的redis服務器進行通訊。
  • Dynomite / Redis節點一次只能提供一個請求,Dynomite能夠容許數千個併發鏈接,可是請求是由Redis中的單個線程處理,這確保了當發出兩個併發調用從隊列輪詢元素時,是由Redis服務器順序執行,從而避免任何本地或分佈式鎖。
  • 在發生故障轉移的狀況下,確保沒有兩個客戶端鏈接從隊列中獲取相同的消息。

處理Un-ACK的消息
後臺進程監視UNACK集合中的消息,這些消息在給定時間內未被客戶端確認(每一個隊列可配置)。這些消息將移回到隊列中。

 

感興趣能夠加Java架構師羣獲取Java工程化、高性能及分佈式、高性能、深刻淺出。高架構。性能調優、Spring,MyBatis,Netty源碼分析和大數據等多個知識點高級進階乾貨的直播免費學習權限 都是大牛帶飛 讓你少走不少的彎路的 羣..號是:855801563 對了 小白勿進 最好是有開發經驗

注:加羣要求

一、具備工做經驗的,面對目前流行的技術不知從何下手,須要突破技術瓶頸的能夠加。

二、在公司待久了,過得很安逸,但跳槽時面試碰壁。須要在短期內進修、跳槽拿高薪的能夠加。

三、若是沒有工做經驗,但基礎很是紮實,對java工做機制,經常使用設計思想,經常使用java開發框架掌握熟練的,能夠加。

四、以爲本身很牛B,通常需求都能搞定。可是所學的知識點沒有系統化,很難在技術領域繼續突破的能夠加。

5.阿里Java高級大牛直播講解知識點,分享知識,多年工做經驗的梳理和總結,帶着你們全面、科學地創建本身的技術體系和技術認知!

相關文章
相關標籤/搜索