1. 程式人生 > >Storm 是如何跟蹤一條訊息以及它衍生出來的訊息都被成功處理的

Storm 是如何跟蹤一條訊息以及它衍生出來的訊息都被成功處理的

我們做 Notify Server 時可以間接借鑑這個解決方案的思路。 Storm 是一個分散式的、容錯的實時計算系統,由 Twitter 開源。 先不介紹術語和背景知識,直接來一些吸引眼球的內容: 一,Tuple Tree spout 發射一個訊息(tuple),可能會導致成百上千的訊息基於此訊息被建立。這些訊息構成一個樹狀結構,我們稱之為“tuple tree”。 tuple 是如何被跟蹤的呢?系統中有成千上萬的訊息,如果為每個 spout 傳送的訊息都構建一棵樹的話,很快記憶體就會耗盡。所以,必須採用不同的策略來跟蹤每個訊息。 二,Acker 跟蹤 Tuple acker 對於 tuple 的跟蹤演算法是 storm 最大的突破。這個演算法使得對於任意大的一個 tuple tree, 它只需要恆定的20位元組就可以進行跟蹤了。 Storm 系統中有一組叫做“acker”的特殊任務,它們負責跟蹤 DAG(有向無環圖)中的每個訊息。每當發現一個 DAG 被完全處理,它就向建立這個根訊息的 spout 任務傳送一個訊號。 原理很簡單: 1)當一個訊息被建立的時候(無論是在 spout 還是 bolt 中),系統都為該訊息分配一個 64bit 的隨機值作為id。這些 messageid 是 acker 用來跟蹤由 spout 訊息派生出來的 tuple tree 的。 2)acker 對於每個 tuple 儲存一個 ack-val 的校驗值(一個64 bit數字),它的初始值是0。 然後每發射一個 tuple (即訊息的建立),或者 ack 一個 tuple (即訊息的被應答),那麼 tuple 的 id 都要跟 ack-val 異或一下,並且把得到的值更新為 ack-val 的新值。假設每個發射出去的 tuple 都被 ack 了, 那麼最後 ack-val 一定是0(因為一個數字跟自己異或得到的值是0)。 總的來說,ack-val 是這棵樹上所有建立的 tuple-id 以及 ack 的 tuple-id 一起異或(XOR)
。ack-val 表示了整棵樹的的狀態,無論這棵樹多大,只需要這個固定大小的數字就可以跟蹤整棵樹。 每當 acker 發現一棵樹的 ack val 值為0時,它就知道這棵樹已經被完全處理了 因為訊息的隨機ID是一個64bit的值,因此ack val在樹處理完之前被置為0的概率非常小。 三,Acker 有很多,選擇哪一個呢? 當一個 tuple 需要 ack 的時候,它到底選擇哪個 acker 來發送這個資訊呢? storm用一致性雜湊來把一個 tuple-message-id 對應到 acker, 因為每一個 tuple 知道它所有的祖宗的 tuple-message-id, 所以它自然可以算出要通知哪個 acker 來 ack。 參考資源: 2)2013,量子統計,Storm入門教程
第四章
第五章

相關推薦

Storm 是如何跟蹤訊息以及衍生出來訊息成功處理

我們做 Notify Server 時可以間接借鑑這個解決方案的思路。 Storm 是一個分散式的、容錯的實時計算系統,由 Twitter 開源。 先不介紹術語和背景知識,直接來一些吸引眼球的內容: 一,Tuple Tree spout 發射一個訊息(tuple),可能

2018,人生是蛇,咬著自己的尾巴

1. Ouroboros 古埃及有一個圖騰:一條咬住自己的尾巴的蛇。後來這個圖騰廣泛流傳,滲透到印度教,古希臘,也出現在北歐神話中。其名為:Ouroboros。象徵著宇宙迴圈,無始無終,開始即是結束,結束亦是開始。其實生活也常常是這樣,任憑時間推移,生活卻總在某個地方迴歸原點。 2. 風

android UiAutomator如何向所有微信好友傳送“你好,***”開頭的祝福訊息

在剛過去的情人節裡,在已經過去的元宵節裡,還有過去一段時間的除夕新年等節日裡,都需要向好友傳送一條祝福訊息,最好是附帶上對方的姓名,這樣顯得不是群發的,故寫了一個方法來完成這件事情。同樣的方法也可以用到簡訊中去。 public void sendMassageToAllFr

SQL語句查出每門課大於80分的學生的姓名

src exist spa weight utf8 exists null ont http 用一條SQL語句查出每門課都大於80分的學生的姓名,數據表結構如下: 建表SQL如下: SET FOREIGN_KEY_CHECKS=0; -- --------------

表A中記錄的兩個字段對應於表B的同一個字段 如何查詢?SQL, thinkphp[5]

username 如何 sel 表名 admin clas team ech field 表 A=approval_order, B=admin, 表A中technician_username, salesman_username 都是id號,中文名保存在admin表的

案例2:用SQL查詢出數學語文成績大於80分的學生姓名?

方法1: 查出科目成績有小於80分的學生姓名,再約束並去重學生不等於查出來的姓名 select distinct A.name from t_score A where A.name not in(select distinct B.name from t_score B where B.fenshu &

SQL語句提交後,db2做了什麼?

一直在做 db2 資料倉庫的運維工作,對一些常用操作已經非常熟悉,但是總感覺自己學到是仍然是操作的細節,而不是真正的知識。如果你問我,一條 SQL 語句提交後,db2 都做了哪些工作,我可能會有點慌,因為我不能肯定的回答出來。於是,我就搜尋一些資料,結合自己的理解,總結一下關於 db2 體系

RabbitMQ 訊息中介軟體如何保證消費者customer能夠成功處理訊息?

一、確保消費者customer處理訊息成功 預設情況下消費者C1接收到訊息1無論是否正常接受和處理都會立即應答rabbit伺服器,

每日問:Android 滑動衝突,你們是怎樣處理

堅持原創日更,短平快的 Android 進階系列,敬請直接在微信公眾號搜尋:nanchen,直接關注並設為星標,精彩不容錯過。 在 Android 開發中,滑動衝突總是我們一個無法避免的話題。而對於解決方案卻是眾說紛紜。比如 RecyclerView 巢狀 RecyclerView,直接通過相關方法禁掉內部

Qt的paint函數重寫,以及QPaint給線繪制箭頭

ons eal mark .net urn div stat class sdn 直接代碼: QPainter *painter; static const double Pi = 3.1415926535897932384626433832795

Kafka:ZK+Kafka+Spark Streaming集群環境搭建(二十五)Structured Streaming:同一個topic中包含組數據的多個部分,按照key它們拼接為記錄(以及遇到的問題)。

eas array 記錄 splay span ack timestamp b- each 需求: 目前kafka的topic上有一批數據,這些數據被分配到9個不同的partition中(就是發布時key:{m1,m2,m3,m4...m9},value:{records

叮!你有來自百度深度學習公開課的訊息待檢視

作為百度自主研發的深度學習平臺,PaddlePaddle 的易學易用和靈活高效極大地降低了開發者的研發門檻。為幫助開發者打造一條深度學習快速進階之路,百度開設了“深度學習公開課”,從 PaddlePaddle 開發基礎與功能、深度學習工程師的職業規劃以及 PaddlePaddle 應用解析等方面,為開發者

java--建立一個帶預設構造方法(即無參構造)的類,在構造方法中列印訊息"Hello Constructor";再為這個類新增一個過載構造方法,令其接收一個字串引數,將其一起打印出來

題目描述:建立一個帶預設構造方法(即無參構造)的類,在構造方法中列印一條訊息"Hello Constructor";再為這個類新增一個過載構造方法,令其接收一個字串引數,並在這個有參構造方法中把"Hello Constructor"和接收的引數一起打印出來。 //Person類 class Pe

判斷資料是否是新紀錄,以及儲存之前執行的方法

在basecontroller實體類中宣告一個final isnewrecord=false 對外公開一個方法:getisnewRecord(),預設是返回false,如果物件的id不為空就返回true public boolean getIsNewRecord() {  &n

java--建立一個帶預設構造方法(即無參構造)的類,在構造方法中列印訊息"Hello Constructor";再為這個類新增一個過載構造方法,令其接收一個字串引數,將其一起打印出來

題目描述:建立一個帶預設構造方法(即無參構造)的類,在構造方法中列印一條訊息"Hello Constructor";再為這個類新增一個過載構造方法,令其接收一個字串引數,並在這個有參構造方法中把"Hello Constructor"和接收的引數一起打印出來。 //Perso

android實現檢測app是否有通知許可權,沒有就跳轉去設定,設定成功返回時並測試發出通知訊息

1.判斷是否有通知許可權 2.沒有的話,彈出一個對話方塊,提示使用者是否去設定,使用者點選確定後跳轉到設定頁面 3.手動設定許可權成功後,結果會返回到 onActivityResult方法中,其中返回的請求碼等於傳入的碼時,並且結果碼等於2,編輯正確設定了,此時就可以呼

QQ “你可能收到訊息” ”曾經”是如何實現的?

2.5更新:大家不用試了。TX已經把它封了。 大家不用試了。TX已經把它封了。 大家不用試了。TX已經把它封了。 感謝大家的支援。 ===================================================================  

Redis原始碼解析:25叢集()握手、心跳訊息以及下線檢測

         Redis叢集是Redis提供的分散式資料庫方案,通過分片來進行資料共享,並提供複製和故障轉移功能。 一:初始化 1:資料結構 在原始碼中,通過server.cluster記錄整個叢集當前的狀態,比如叢集中的所有節點;叢集目前的狀態,比如是上線還是下線;

Java之建立一個帶預設構造方法(即無參構造)的類,在構造方法中列印訊息"Hello Constructor";再為這個類新增一個過載構造方法,令其接收一個字串引數。

建立一個帶預設構造方法(即無參構造)的類,在構造方法中列印一條訊息"Hello Constructor";再為這個類新增一個過載構造方法,令其接收一個字串引數,並在這個有參構造方法中把"Hello Constructor"和接收的引數一起打印出來。 效果如下: 附上程

微信裡面的簽到加積分介面(已經測試過沒問題)服務號不能每天傳送訊息,為了避免這個,每天簽到的時候,推送最新的訊息給客戶。

  public string QianDao(string WeiXinId, string key)//引數是微訊號         {             strs = WeiXinId.Trim() + "WJXFGCLN+Mihaha";