在Netflix的平臺上運行着許多的業務流程,這些流程的任務是經過異步編排進行驅動,如今咱們要實現一個分佈式延遲隊列,這個延遲隊列具備以下特色:java
Dynomite是一種通用的實現,能夠與許多不一樣的key-value存儲引擎一塊兒使用。目前它提供了對Redis序列化協議(RESP)和Memcached寫協議的支持。咱們選擇Dynomite,是由於其具備性能,多數據中心複製和高可用性的特色。此外,Dynomite提供分片和可插拔的數據存儲引擎,容許咱們在數據需求增長垂直和水平擴展。面試
咱們選擇Redis做爲構建隊列的存儲引擎:redis
一個隊列被存儲爲Redis的有序集合(ZADD和ZRANGE等操做),Redis使用分數對有序集合中的成員進行排序,當往隊列中存儲數據時,根據優先級和超時時間計算分數。服務器
對於每一個隊列,維護三組Redis數據結構:數據結構
PUSH架構
POP併發
ACK框架
咱們的隊列是在Dynomite的JAVA客戶端Dyno之上創建的,Dyno爲持久鏈接提供鏈接池,而且能夠配置爲拓撲感知,此外,Dyno爲應用程序提供特定的本地機架(在AWS中,機架是一個區域,例如 us-east-1a、us-east-1b等),us-east-1a的客戶端將鏈接到相同區域的Dynomite/Redis節點,除非該節點不可用,在這種狀況下該客戶端將進行故障轉移。這個屬性被用於經過區域劃分隊列。異步
分片
隊列根據可用區域進行分片,將數據推送到隊列時,經過輪訓機制肯定分片,這種機制能夠確保全部分片的數據是平衡的,每一個分片都表明Redis中的有序集合,有序集中的key是queueName和AVAILABILITY _ZONE的組合。分佈式
避免全局鎖
處理Un-ACK的消息
後臺進程監視UNACK集合中的消息,這些消息在給定時間內未被客戶端確認(每一個隊列可配置)。這些消息將移回到隊列中。
感興趣能夠加Java架構師羣獲取Java工程化、高性能及分佈式、高性能、深刻淺出。高架構。性能調優、Spring,MyBatis,Netty源碼分析和大數據等多個知識點高級進階乾貨的直播免費學習權限 都是大牛帶飛 讓你少走不少的彎路的 羣..號是:855801563 對了 小白勿進 最好是有開發經驗
注:加羣要求
一、具備工做經驗的,面對目前流行的技術不知從何下手,須要突破技術瓶頸的能夠加。
二、在公司待久了,過得很安逸,但跳槽時面試碰壁。須要在短期內進修、跳槽拿高薪的能夠加。
三、若是沒有工做經驗,但基礎很是紮實,對java工做機制,經常使用設計思想,經常使用java開發框架掌握熟練的,能夠加。
四、以爲本身很牛B,通常需求都能搞定。可是所學的知識點沒有系統化,很難在技術領域繼續突破的能夠加。
5.阿里Java高級大牛直播講解知識點,分享知識,多年工做經驗的梳理和總結,帶着你們全面、科學地創建本身的技術體系和技術認知!