我們通過url:http://localhost:10000/turbine.stream?cluster=default
可以獲取到指標的json資料。那麼指標資料又是從何處獲取到的。
答案是:從各個服務的/manage/hystrix.stream端點獲取的
可以找到turbine的架構設計
詳細資訊參考
說明:turbine啟動的時候,會去連線需要監控的主機,建立起監聽,每乙個例項會有乙個監聽。當例項監聽從各個服務獲取到資料的時候,會將資料填充到派發器dispatcher中,由派發器將資料輸出到各個客戶端。
turbine的實現在turbine核心包下
com.netflix.turbine:turbine-core
在該包下,可以找到幾個關鍵的類
instancemonitor
、handlerqueuetuple
、turbinedatadispatcher
、turbinestreamservlet
我們啟動除錯的時候,可以看到
例項的url其實是指向具體需要監控的例項的端點,即
檢視這個鏈結我們可以看到
instancemonitor
啟動監聽
public void startmonitor() throws exception
taskfuture = threadpool.submit(new callable()
} catch(throwable t) finally
cleanup();
monitorstate.set(state.cleanedup);
}return null;
}});
}
private void init() throws exception
}
dowork()
方法做了什麼呢
private void dowork() throws exception else
listlist = new arraylist();
list.add(instancedata);
/* send to all handlers */
//將獲取到的資料新增到dispatcher中
boolean continuerunning = dispatcher.pushdata(getstatsinstance(), list);
if(!continuerunning)
}
getnextstatsdata
讀取資料
那麼派發器是什麼呢,它的實現檢視turbinedatadispatcher
檢視它的pushdata
方法
發現呼叫的是tuple.pushdata(statsdata);
而tuple
其實就像乙個管道,檢視handlerqueuetuple
的pushdata
方法
public void pushdata(k data)
boolean success = queue.writeevent(data);
if (iscritical()) else }}
看到queue.writeevent(data)
、往佇列裡寫資料
這個佇列又是什麼呢?
其實就是乙個事件佇列eventqueue
,檢視它的寫事件方法
public boolean writeevent(t event)
count.incrementandget();
queue.add(event);
return true;
}
如果佇列中的長度大於maxcapacity,將不會再往佇列裡填充資料。當客戶端連線上的時候,queue就會被消費。如果客戶端沒有連線上的時候,queue讀出來,經過一系列的操作會寫回queue中,直到佇列滿了就不在寫了。1、當沒有客戶端連線上的時候
eventhandler經過一些列的處理,資料會被寫回到queue中
2、當有客戶端連上的時候,假設我們通過瀏覽器位址列輸入了
此時我們看到eventhandler為turbinestreamingconnection
,見下圖
handldata()
就變成了turbinestreamingconnection
中的方法
public void handledata(collectiondata)
//將資料寫到steamhandler中
writetostream(data);
}
writetostream()
中有個關鍵的操作streamhandler.writedata(jsonstringfordatahash)
writedata()
方法就可以將資料寫到response中
客戶端訪問http://localhost:10000/turbine.stream?cluster=default
的時候,其實就是通過turbinestreamservlet
獲取到響應結果的。
網路資料是怎麼傳輸的
上圖是iso的七層網路體系結構,每一層都有其相應的工作協議。資料傳輸過程如下 如qq 在傳送主機a上,傳送的資料經過應用層時,應用層對資料進行了包裝,它在要傳輸的資料上加了乙個應用層首部ah後,繼續向傳輸層傳送。傳輸層接收到應用層的資料後,將資料 應用層ah當做資料,給它進行包裝,加上自己的首部,此...
什麼是資料傾斜,怎麼解決資料傾斜?
相信很多接觸mapreduce的朋友對 資料傾斜 這四個字並不陌生,那麼究竟什麼是資料傾斜?又改怎樣解決這種該死的情況呢?何為資料傾斜?正常的資料分布理論上都是傾斜的,就是我們所說的2 8原理 80 的財富集中在20 的人手中,80 的使用者只使用20 的功能,20 的使用者貢獻了80 的訪問量,不...
怎麼來看遊戲常規指標資料 I
前些天,寫了一篇遊戲資料分析的內容,大家的反響效果不錯,可能內容有些簡陋,有些小白,的確,在遊戲bi之外,可能boss或者旁觀者只能去關注這些指標性的資料,並問一些問題,而這是對於運營人員最要命的,因為要在很短的時間內去反饋和分析這些指標資料背後的問題。運營人員所熟知的資料指標其實是比較有限的,但是...