一個很多人都不知道的學習網站。
- 2022 年 2 月 28 日
- 筆記
你好呀,我是歪歪。
這期我想給大家分享一個很多人都不知道的學習網站。
就是阿里雲。
我估計有很多人看到「阿里雲」這幾個字出來的時候,就浮現出不好的感覺,心中暗喊:不好,感覺這是一個廣告。趕緊跑。
確實,從本質上來講,這是一個賣服務的網站。但是壯士請留步啊,我又不叫你去這上面買服務,我真的在這上面學到了很多有用的知識。
放心,學這些知識不要錢的。
當然了,阿里雲要是能看到我的文章,想要給我打一筆錢我也是很樂意的。
好了,話不多說,發車。
幫助中心
如果你覺得阿里雲是一個賣服務的網站,是一個讓你花錢的地方,說明你的打開方式是官方期望的打開方式。
但是如果你用我的打開方式,它就會搖身一變,變成一個免費的學習網站。
我的打開方式,就是從它的「幫助中心」進去:
//help.aliyun.com/
然後,關注它右邊導航欄的這一溜欄目。
比如,資料庫這裡,我隨便圈幾個:
再比如,中間件這裡,我也圈幾個:
當然,還有很多其他的可以看的東西,我就不一一展示了,大家感興趣自己去翻就行了。
在幫助中心裏面展示的東西,就是阿里雲能賣的服務。
而他們要賣服務,一定要有對應的文檔說明。
就是「吹牛逼」嘛,說我的服務多麼多麼好,多麼多麼穩定,多麼多少省心,有那些應用場景,巴拉巴拉巴拉…
所以去翻閱對應技術點他們提供的文檔,就是正確的打開方式。
下面我用 Redis 來舉個例子。
阿里雲 Redis 文檔
我覺得阿里雲裡面 Redis 的技術文檔是做的最好的,所以帶你看看。
//help.aliyun.com/product/26340.html
這個學習路徑裡面,就有很多值得我們關注的地方。
比如我們先看這個幾個地方的內容:
應用場景
第一個Redis 有哪些應用場景?
這個問題是不是面試的時候面試官也經常問你:Redis 在你的應用裡面是幹啥用的?
你怎麼回答?
保守一點的說,95% 的人都會說:拿來當做快取用。
確實,基本上都是拿來當個快取用用而已。但是你是不是可以補充一句:除了可以當快取用,我還知道它有其他的一下應用場景,比如:
//help.aliyun.com/document_detail/43829.html
咔咔咔,就直接把文檔上舉的例子再羅列一下,有行業,有場景,這樣的回答肯定比你乾癟癟的回答一個「快取」好吧。
災備方案
然後我們看「災備方案」這一部分:
//help.aliyun.com/document_detail/100734.html
也許你聽過「災備」這個概念,但是大多是運維人員關係的,我們作為開發其實了解的不多。
但是如果你會,那就是加分項。
阿里雲介紹了三種災備方案。
-
單可用區高可用方案,災備級別最低,主備節點部署在同一可用區中的不同機器上,當任一節點發生故障時,由高可用HA(High Availability)系統自動執行故障切換,避免單點故障引起的服務中斷。 -
同城容災方案,災備級別中等,主備節點分別部署在同一地域下兩個不同的可用區,當任一可用區因電力、網路等不可抗因素失去通訊時,高可用HA系統將執行故障切換,確保整個實例的持續可用。 -
跨地域容災方案,災備級別最高,由多個子實例構成全球分散式實例,所有子實例通過同步通道保持實時數據同步,由通道管理器負責子實例的健康狀態監測、主備切換等等異常事件的處理,適用於異地災備、異地多活、應用就近訪問、分攤負載等場景。
而單單一個災備級別最低的「單可用區高可用方案」也有多種不同的部署架構:
比如下面這個標準版-雙副本高可用架構:
它採用了雙機主從(Master-Replica)架構,高可用 HA 模組偵測到主節點故障時,會自動進行主從切換,將 Replica 提升為 Master,而原來的 Master 恢復連接後會成為新的 Replica。
這就是一個要實現高可用的最基本最簡單的架構圖。
但是這個架構的問題在於只有一個集群,要是這整個集群都掛了怎麼辦呢?
沒辦法,只有演進架構。
所以,還有集群版的雙副本高可用架構:
集群架構(雙副本)實例中的數據分片用於承載數據,每個數據分片均為雙副本(分別部署在不同機器上)高可用架構,主節點發生故障後,系統會自動進行主備切換保證服務高可用。
然後還有經常提到的讀寫分離架構:
另外的同城容災方案、跨地域容災方案我就不一一介紹了,大家自己去翻一下就行。
命令支援
在命令支援這塊,我也有新的發現:
有一些企業版才支援的命令,也就是說這是阿里對於 Redis 進行了二次開發,對某些命令進行了加強。
比如這兩個命令:
它們是幹啥的呢?
來,我問你一個問題:用 Redis 做分散式鎖的時候,解鎖用的命令是什麼?
是 DEL 命令,是的,回答的很好。
那麼解鎖的時候需要注意什麼呢?
是不是需要檢查解鎖的執行緒和加鎖的執行緒得是同一個。
你要是不明白為什麼也沒關係,官網上舉個了這麼一個例子:
-
t1時刻,App1設置了分散式鎖resource_1,過期時間為3秒。 -
App1由於程式慢等原因等待超過了3秒,而resource_1已經在t2時刻被釋放。 -
t3時刻,App2獲得這個分散式鎖。 -
App1從等待中恢復,在t4時刻運行DEL resource_1將App2持有的分散式鎖釋放了。
哦豁,不是自己加的鎖,卻把鎖給釋放了?
所以,從上述過程可以看出,一個客戶端設置的鎖,必須由自己解開。
因此客戶端需要先使用 GET 命令確認鎖是不是自己設置的,然後再使用 DEL 解鎖。
先獲取、再判斷、接著刪除,很明顯,這不是一個原子性的操作,怎麼辦?
是的,lua 腳本。
在 Redis 中通常需要用 lua 腳本來實現自鎖自解的功能,比如這樣:
if redis.call("get",KEYS[1]) == ARGV[1] then
return redis.call("del",KEYS[1])
else
return 0
end
是不是感覺有點麻煩呀?
所以,阿里自己搞了一個 CAD 命令。
加鎖邏輯還是一樣:
SET resource_1 random_value NX EX 5
解鎖就變成了這樣:
/* if (GET(resource_1) == my_random_value) DEL(resource_1) */
CAD resource_1 my_random_value
是不是簡潔了很多?
而它的底層我沒去看,但是猜也知道,就是對 lua 腳本的一個封裝。
CAS 命令是拿來續租的,可以自己去看看。
//help.aliyun.com/document_detail/146758.html
同時文中還提到了如何保障一致性的問題:
如果你理解不了「如果丟失的數據跟分散式鎖有關,則會導致鎖的機制出現問題,從而引起業務異常」這句話,也就理解不了後面說的「紅鎖」的解決方案。
那麼這裡是不是又是一個引子,讓你找到在這個體系裡面新的要學習的東西?
而關於這個點,其實我之前也寫文章解釋過《【求錘得錘的故事】Redis鎖從面試連環炮聊到神仙打架。》,你要不清楚,也可以去看看。
除此之外,你可以看到它左邊的導航欄裡面舉了好幾個例子:
這些都是自研的,但是其實一部分命令其實都是開源的,包括前面提到的 CAD 和 CAS 命令:
//github.com/alibaba/TairString/blob/main/README-CN.md
是不是又找到一個可以學習的方向?
比如有個 TairZset 命令。
我們知道,Redis 原生的 zset 主要可以用來做排行榜,但是只支援單維度的排序。
阿里搞了個 TairZset 命令,擴展了一下,就支援多維度了:
這個命令也是開源的。
性能排查與調優
//help.aliyun.com/document_detail/265988.html
這一部分的內容,簡直就是絕了。
光看標題就知道是乾貨了。
比如我舉其中的一個例子來說:
請問,Redis 的 CPU 使用率高了,你有哪些解決方案或者說是排查思路?
不知道沒有關係,這裡寫了三種。
第一種是查找並禁用高消耗命令。
高消耗命令:即時間複雜度為O(N)或更高的命令。通常情況下,命令的時間複雜度越高,在執行時會消耗較多的資源,從而導致CPU使用率上升。
由於 Redis 的特性,在執行高消耗命令時會引發排隊導致應用響應變慢。
極端情況下,甚至可能導致實例被整體阻塞,引發應用超時中斷或流量跳過快取層直接到達後端的資料庫側,引發雪崩效應。
那麼我們怎麼找到高消耗的命令呢?
這個就是它們產品提供的一個功能了:
這裡面連數據都給你截上了,基本上看的是一清二楚。
那如果我們不用它的可視化頁面,用原生的功能,怎麼做呢?
slowlog-log-slower-than 和 slowlog-max-len 這個兩個參數配置了解一下,前者是設置慢查詢的閾值,後者是存放慢查詢的記錄。
而且,就算你面試的時候說,我們是通過可視化頁面找到的高消耗命令,我也覺得沒啥問題,畢竟主要是看你有那些思路。
有思路了,找到對應的解決方案還不是手到擒來的事情。
除此之外,還有這幾個方案:
如果經過這些操作之後, CPU 的使用率還是很高怎麼辦?
在評估業務正常的情況下,加錢,加機器,升級配置。
最佳實踐
//help.aliyun.com/document_detail/163162.html
一定一定一定要去看每個技術點對應的最佳實踐這一部分。
比如在遊戲玩家積分排行榜的這個實踐中,還給你提供了一套環境以及直接可以運行的程式碼:
你只管按照步驟操作就行了。
又比如在JedisPool資源池優化的這裡面。
針對 Redis 的配置給出了說明和建議值。合理的配置能夠提升 Redis 的服務性能,降低資源開銷。
這些都是很重要的關於參數的配置。
也許你自己配置的時候,從其他項目中隨便就拷貝一個過來了,項目也跑的好好的,你甚至不知道每個參數是幹啥的。
但是在這裡,你能找到答案。
還有包括秒殺和雙十一,這些看起來很厲害的東西,這裡都有:
其他
比如在 RabbitMQ 裡面,有關於消息冪等的最佳實踐:
也有關於消息重試、延時隊列等的高級特性的描述:
比如在數字金融裡面有個這東西:
是一套在金融領域可復用的技術解決方案,而相關的技術棧的絕大部分都是開源的。
如果你之前不了解 SOFAStack 這個玩意,那麼這個地方就是你了解它的入口。
上次有個讀者問我關於 RocketMQ 的事務消息的問題,我雖然沒有用過,但是我給他發過去一個連接:
//help.aliyun.com/document_detail/43348.html
這裡面,就有他想要找的東西:
當時他問我:怎麼隨便一搜就能搜到一篇高品質的文章?
我說恰好之前看過而已。其實,我之前沒有看過。
但是我知道阿里雲上面肯定有賣 RocketMQ 服務的,那麼它這裡面大概率有這方面的資料。
所以我就上去那麼隨便一翻,就找到了。
這也是我想要把這個「學習網站」分享給你的原因,以後多一個找資料的地方,多一個學習新東西的地方,挺好的。