我來曝光一個很多人都不知道的學(xué)習(xí)網(wǎng)站。
這期我想給大家分享一個很多人都不知道的學(xué)習(xí)網(wǎng)站。
就是阿里云。

我估計有很多人看到“阿里云”這幾個字出來的時候,就浮現(xiàn)出不好的感覺,心中暗喊:不好,感覺這是一個廣告。趕緊跑。

但是,你放心,這真不是廣告。
確實(shí),從本質(zhì)上來講,這是一個賣服務(wù)的網(wǎng)站。但是壯士請留步啊,我又不叫你去這上面買服務(wù),我真的在這上面學(xué)到了很多有用的知識。
放心,學(xué)這些知識不要錢的。
當(dāng)然了,阿里云要是能看到我的文章,想要給我打一筆錢我也是很樂意的。

好了,話不多說,發(fā)車。
幫助中心
如果你覺得阿里云是一個賣服務(wù)的網(wǎng)站,是一個讓你花錢的地方,說明你的打開方式是官方期望的打開方式。
但是如果你用我的打開方式,它就會搖身一變,變成一個免費(fèi)的學(xué)習(xí)網(wǎng)站。
我的打開方式,就是從它的“幫助中心”進(jìn)去:
https://help.aliyun.com/

然后,關(guān)注它右邊導(dǎo)航欄的這一溜欄目。
比如,數(shù)據(jù)庫這里,我隨便圈幾個:

再比如,中間件這里,我也圈幾個:

當(dāng)然,還有很多其他的可以看的東西,我就不一一展示了,大家感興趣自己去翻就行了。
在幫助中心里面展示的東西,就是阿里云能賣的服務(wù)。
而他們要賣服務(wù),一定要有對應(yīng)的文檔說明。
就是“吹牛逼”嘛,說我的服務(wù)多么多么好,多么多么穩(wěn)定,多么多少省心,有那些應(yīng)用場景,巴拉巴拉巴拉...

所以去翻閱對應(yīng)技術(shù)點(diǎn)他們提供的文檔,就是正確的打開方式。
下面我用 Redis 來舉個例子。
阿里云 Redis 文檔
我覺得阿里云里面 Redis 的技術(shù)文檔是做的最好的,所以帶你看看。
https://help.aliyun.com/product/26340.html

這個學(xué)習(xí)路徑里面,就有很多值得我們關(guān)注的地方。
比如我們先看這個幾個地方的內(nèi)容:

應(yīng)用場景
第一個Redis 有哪些應(yīng)用場景?
這個問題是不是面試的時候面試官也經(jīng)常問你:Redis 在你的應(yīng)用里面是干啥用的?
你怎么回答?

保守一點(diǎn)的說,95% 的人都會說:拿來當(dāng)做緩存用。
確實(shí),基本上都是拿來當(dāng)個緩存用用而已。但是你是不是可以補(bǔ)充一句:除了可以當(dāng)緩存用,我還知道它有其他的一下應(yīng)用場景,比如:
https://help.aliyun.com/document_detail/43829.html

咔咔咔,就直接把文檔上舉的例子再羅列一下,有行業(yè),有場景,這樣的回答肯定比你干癟癟的回答一個“緩存”好吧。

災(zāi)備方案
然后我們看“災(zāi)備方案”這一部分:
https://help.aliyun.com/document_detail/100734.html
也許你聽過“災(zāi)備”這個概念,但是大多是運(yùn)維人員關(guān)系的,我們作為開發(fā)其實(shí)了解的不多。
但是如果你會,那就是加分項。

阿里云介紹了三種災(zāi)備方案。
單可用區(qū)高可用方案,災(zāi)備級別最低,主備節(jié)點(diǎn)部署在同一可用區(qū)中的不同機(jī)器上,當(dāng)任一節(jié)點(diǎn)發(fā)生故障時,由高可用HA(High Availability)系統(tǒng)自動執(zhí)行故障切換,避免單點(diǎn)故障引起的服務(wù)中斷。 同城容災(zāi)方案,災(zāi)備級別中等,主備節(jié)點(diǎn)分別部署在同一地域下兩個不同的可用區(qū),當(dāng)任一可用區(qū)因電力、網(wǎng)絡(luò)等不可抗因素失去通信時,高可用HA系統(tǒng)將執(zhí)行故障切換,確保整個實(shí)例的持續(xù)可用。 跨地域容災(zāi)方案,災(zāi)備級別最高,由多個子實(shí)例構(gòu)成全球分布式實(shí)例,所有子實(shí)例通過同步通道保持實(shí)時數(shù)據(jù)同步,由通道管理器負(fù)責(zé)子實(shí)例的健康狀態(tài)監(jiān)測、主備切換等等異常事件的處理,適用于異地災(zāi)備、異地多活、應(yīng)用就近訪問、分?jǐn)傌?fù)載等場景。
而單單一個災(zāi)備級別最低的“單可用區(qū)高可用方案”也有多種不同的部署架構(gòu):
比如下面這個標(biāo)準(zhǔn)版-雙副本高可用架構(gòu):

它采用了雙機(jī)主從(Master-Replica)架構(gòu),高可用 HA 模塊偵測到主節(jié)點(diǎn)故障時,會自動進(jìn)行主從切換,將 Replica 提升為 Master,而原來的 Master 恢復(fù)連接后會成為新的 Replica。
這就是一個要實(shí)現(xiàn)高可用的最基本最簡單的架構(gòu)圖。
但是這個架構(gòu)的問題在于只有一個集群,要是這整個集群都掛了怎么辦呢?
沒辦法,只有演進(jìn)架構(gòu)。
所以,還有集群版的雙副本高可用架構(gòu):

集群架構(gòu)(雙副本)實(shí)例中的數(shù)據(jù)分片用于承載數(shù)據(jù),每個數(shù)據(jù)分片均為雙副本(分別部署在不同機(jī)器上)高可用架構(gòu),主節(jié)點(diǎn)發(fā)生故障后,系統(tǒng)會自動進(jìn)行主備切換保證服務(wù)高可用。
然后還有經(jīng)常提到的讀寫分離架構(gòu):

另外的同城容災(zāi)方案、跨地域容災(zāi)方案我就不一一介紹了,大家自己去翻一下就行。

命令支持
在命令支持這塊,我也有新的發(fā)現(xiàn):

有一些企業(yè)版才支持的命令,也就是說這是阿里對于 Redis 進(jìn)行了二次開發(fā),對某些命令進(jìn)行了加強(qiáng)。
比如這兩個命令:

它們是干啥的呢?
來,我問你一個問題:用 Redis 做分布式鎖的時候,解鎖用的命令是什么?
是 DEL 命令,是的,回答的很好。
那么解鎖的時候需要注意什么呢?

是不是需要檢查解鎖的線程和加鎖的線程得是同一個。
你要是不明白為什么也沒關(guān)系,官網(wǎng)上舉個了這么一個例子:

t1時刻,App1設(shè)置了分布式鎖resource_1,過期時間為3秒。 App1由于程序慢等原因等待超過了3秒,而resource_1已經(jīng)在t2時刻被釋放。 t3時刻,App2獲得這個分布式鎖。 App1從等待中恢復(fù),在t4時刻運(yùn)行DEL resource_1將App2持有的分布式鎖釋放了。
哦豁,不是自己加的鎖,卻把鎖給釋放了?
所以,從上述過程可以看出,一個客戶端設(shè)置的鎖,必須由自己解開。
因此客戶端需要先使用 GET 命令確認(rèn)鎖是不是自己設(shè)置的,然后再使用 DEL 解鎖。
先獲取、再判斷、接著刪除,很明顯,這不是一個原子性的操作,怎么辦?

是的,lua 腳本。
在 Redis 中通常需要用 lua 腳本來實(shí)現(xiàn)自鎖自解的功能,比如這樣:
if?redis.call("get",KEYS[1])?==?ARGV[1]?then
????return?redis.call("del",KEYS[1])
else
????return?0
end
是不是感覺有點(diǎn)麻煩呀?
所以,阿里自己搞了一個 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 命令是拿來續(xù)租的,可以自己去看看。
https://help.aliyun.com/document_detail/146758.html
同時文中還提到了如何保障一致性的問題:

如果你理解不了“如果丟失的數(shù)據(jù)跟分布式鎖有關(guān),則會導(dǎo)致鎖的機(jī)制出現(xiàn)問題,從而引起業(yè)務(wù)異常”這句話,也就理解不了后面說的“紅鎖”的解決方案。
那么這里是不是又是一個引子,讓你找到在這個體系里面新的要學(xué)習(xí)的東西?
而關(guān)于這個點(diǎn),其實(shí)我之前也寫文章解釋過《【求錘得錘的故事】Redis鎖從面試連環(huán)炮聊到神仙打架。》,你要不清楚,也可以去看看。
除此之外,你可以看到它左邊的導(dǎo)航欄里面舉了好幾個例子:

這些都是自研的,但是其實(shí)一部分命令其實(shí)都是開源的,包括前面提到的 CAD 和 CAS 命令:
https://github.com/alibaba/TairString/blob/main/README-CN.md

是不是又找到一個可以學(xué)習(xí)的方向?

比如有個 TairZset 命令。
我們知道,Redis 原生的 zset 主要可以用來做排行榜,但是只支持單維度的排序。
阿里搞了個 TairZset 命令,擴(kuò)展了一下,就支持多維度了:

這個命令也是開源的。
性能排查與調(diào)優(yōu)
https://help.aliyun.com/document_detail/265988.html
這一部分的內(nèi)容,簡直就是絕了。

光看標(biāo)題就知道是干貨了。
比如我舉其中的一個例子來說:

請問,Redis 的 CPU 使用率高了,你有哪些解決方案或者說是排查思路?
不知道沒有關(guān)系,這里寫了三種。
第一種是查找并禁用高消耗命令。
高消耗命令:即時間復(fù)雜度為O(N)或更高的命令。通常情況下,命令的時間復(fù)雜度越高,在執(zhí)行時會消耗較多的資源,從而導(dǎo)致CPU使用率上升。
由于 Redis 的特性,在執(zhí)行高消耗命令時會引發(fā)排隊導(dǎo)致應(yīng)用響應(yīng)變慢。
極端情況下,甚至可能導(dǎo)致實(shí)例被整體阻塞,引發(fā)應(yīng)用超時中斷或流量跳過緩存層直接到達(dá)后端的數(shù)據(jù)庫側(cè),引發(fā)雪崩效應(yīng)。
那么我們怎么找到高消耗的命令呢?
這個就是它們產(chǎn)品提供的一個功能了:

這里面連數(shù)據(jù)都給你截上了,基本上看的是一清二楚。
那如果我們不用它的可視化頁面,用原生的功能,怎么做呢?
slowlog-log-slower-than 和 slowlog-max-len 這個兩個參數(shù)配置了解一下,前者是設(shè)置慢查詢的閾值,后者是存放慢查詢的記錄。
而且,就算你面試的時候說,我們是通過可視化頁面找到的高消耗命令,我也覺得沒啥問題,畢竟主要是看你有那些思路。
有思路了,找到對應(yīng)的解決方案還不是手到擒來的事情。
除此之外,還有這幾個方案:

如果經(jīng)過這些操作之后, CPU 的使用率還是很高怎么辦?
在評估業(yè)務(wù)正常的情況下,加錢,加機(jī)器,升級配置。

最佳實(shí)踐
https://help.aliyun.com/document_detail/163162.html
一定一定一定要去看每個技術(shù)點(diǎn)對應(yīng)的最佳實(shí)踐這一部分。

比如在游戲玩家積分排行榜的這個實(shí)踐中,還給你提供了一套環(huán)境以及直接可以運(yùn)行的代碼:

你只管按照步驟操作就行了。

又比如在JedisPool資源池優(yōu)化的這里面。

針對 Redis 的配置給出了說明和建議值。合理的配置能夠提升 Redis 的服務(wù)性能,降低資源開銷。


這些都是很重要的關(guān)于參數(shù)的配置。
也許你自己配置的時候,從其他項目中隨便就拷貝一個過來了,項目也跑的好好的,你甚至不知道每個參數(shù)是干啥的。

但是在這里,你能找到答案。
還有包括秒殺和雙十一,這些看起來很厲害的東西,這里都有:


其他
比如在 RabbitMQ 里面,有關(guān)于消息冪等的最佳實(shí)踐:

也有關(guān)于消息重試、延時隊列等的高級特性的描述:

比如在數(shù)字金融里面有個這東西:

是一套在金融領(lǐng)域可復(fù)用的技術(shù)解決方案,而相關(guān)的技術(shù)棧的絕大部分都是開源的。
如果你之前不了解 SOFAStack 這個玩意,那么這個地方就是你了解它的入口。


上次有個讀者問我關(guān)于 RocketMQ 的事務(wù)消息的問題,我雖然沒有用過,但是我給他發(fā)過去一個連接:
https://help.aliyun.com/document_detail/43348.html
這里面,就有他想要找的東西:


當(dāng)時他問我:怎么隨便一搜就能搜到一篇高質(zhì)量的文章?

我說恰好之前看過而已。其實(shí),我之前沒有看過。
但是我知道阿里云上面肯定有賣 RocketMQ 服務(wù)的,那么它這里面大概率有這方面的資料。
所以我就上去那么隨便一翻,就找到了。

這也是我想要把這個“學(xué)習(xí)網(wǎng)站”分享給你的原因,以后多一個找資料的地方,多一個學(xué)習(xí)新東西的地方,挺好的。
好了,那本文的技術(shù)部分就到這里啦。
下面這個環(huán)節(jié)叫做[荒腔走板],技術(shù)文章后面我偶爾會記錄、分享點(diǎn)生活相關(guān)的事情,和技術(shù)毫無關(guān)系。我知道看起來很突兀,但是我喜歡,因?yàn)檫@是一個普通博主的生活氣息。
你要不喜歡,退出之前記得文末點(diǎn)個“在看”哦。
荒腔走板

這周搞了一下家里的“工位”,整體來說就是搞得花里浮哨的。
之前桌面上的支架是我自己放的一塊裝修的時候的邊角料,也就是一塊長方形的中空玻璃,只是這玩意實(shí)在是太重了,而且臟了一點(diǎn)都能看的特別清楚,搞的我每天都要擦一次桌面。
于是我在網(wǎng)上買了一個木頭的,看起來質(zhì)量還不錯,就是味兒大,我在陽臺放了一周多,才把味道散去。
最后把家里各種各樣的小玩偶全部都堆到這里來,發(fā)現(xiàn)我還是薅了各大平臺很多手辦羊毛的。
希望以后再接再厲,目標(biāo)就是堆滿。
家里整體風(fēng)格是簡約風(fēng),但是工作區(qū)域我就像弄的復(fù)雜一點(diǎn),滿滿當(dāng)當(dāng)?shù)模@樣會比較有干勁兒。
哦,對了,這周還抽空去了一趟動物園,發(fā)了一期荒腔走板,可以看看,是個耍朋友的好地方:《歪歪帶你耍成都。這個地方巴適哦!》
雖然閱讀量非常低,但是希望以后能做成一個系列,就叫做“歪游記“,對標(biāo)周董的“周游記”哈哈。
最后說一句(求關(guān)注)
好了,看到了這里了, 轉(zhuǎn)發(fā)、在看、點(diǎn)贊 隨便安排一個吧,要是你都安排上我也不介意。寫文章很累的,需要一點(diǎn)正反饋。
給各位讀者朋友們磕一個了:

