天天看點

學習心得神隐拆東補西

本篇主要是思想總結,沒有技術幹貨,隻是一些底層知識的學習感觸。

神隐

在面臨一些海量資料處理的時候,計算機的處理速度也會很長,這可能導緻我們系統出現一段時間的不可用,或者表現在使用者端就是突然間的卡頓。

回想到之前學習過的架構也好,底層算法也罷。對于此類問題有個統一的解決思路-------拆分過程

這些東西目前在我腦海裡還很抽象,我盡量舉一些例子具象化。

redis中的hash結構,它有一個擴容機制,當負載因子達到一定數值,就會觸發hash的擴容,但是如果此時 hash 中的資料量已經非常大,擴容操作将會耗費大量的時間,此時redis會處于不可用的狀态(redis單線程處理用戶端請求),而redis則采用了 漸進性 rehash的方法。

  • 先建立出擴容後的hash
  • 然後慢慢的把舊hash中的資料往新hash這邊搬(搬一會兒,停下來做其他的事,然後又過來搬)

而反應到使用者這邊,我們并不知道,就好像使用者正在上課的老師,而redis就是在下面搞小動作的學生,老師轉過頭來,它就停止搞小動作,專心聽講,老師轉過去,它又搞小動作。

而在CMS垃圾回收器裡也有所展現,GC過程中是存在一個 STW的狀态,也就是所有使用者線程被暫停。而這個時間随着垃圾回收的用時增加而增加。

當STW的時間過長時,使用者這邊就會表現出系統卡頓的現象。而 CMS 也是以搞小動作的方式進行了時間拆分。

  • 暫停一會兒,我GC一下
  • 開啟使用者線程,跟我GC一起玩
  • 再暫停一下,等我搞搞小動作
  • 再開啟,跟我GC一起玩

或許我們本應該 STW 0.5秒,但是這樣一拆,假如每次就 0.1秒的暫停時間。使用者這邊卡頓現象就很微弱。

這樣把原本應該花費的時間進行拆分,而讓使用者根本感覺不到的操作。前人的思想值得敬佩,真·神隐之術。

拆東補西

雖然平時說拆東牆補西牆經常是作為貶義詞,但是運用在一些場景中,便是智慧。

尤其突出的就是并發問題中的 CAP 原理。我們隻能得其二,不能全都要。那這個時候就要考慮了,我們到底要什麼。是強一緻性?是高可用性?還是分區容錯性?

如果我們要保持強一緻性,那麼在很多場景下,直接加鎖,妥妥的線程安全。但是,并發數一上去,處理時間就大大延長,使用者得到回報的時間又大大增加,可用性大大降低。

凡事結合實際需求,今天是西牆那邊起風,那就該去補西牆。明天是東牆漏風,那就該去補東牆。

并發場景中處處展現均衡之道。

學習心得神隐拆東補西

繼續閱讀