看麻了,竟然是個(gè)學(xué)習(xí)網(wǎng)站?
今天,我想給大家分享一個(gè)很多人都不知道的學(xué)習(xí)網(wǎng)站。
就是阿里云。

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

但是,你放心,這真不是廣告。
確實(shí),從本質(zhì)上來(lái)講,這是一個(gè)賣服務(wù)的網(wǎng)站。但是壯士請(qǐng)留步啊,我又不叫你去這上面買服務(wù),我真的在這上面學(xué)到了很多有用的知識(shí)。
放心,學(xué)這些知識(shí)不要錢的。
當(dāng)然了,阿里云要是能看到我的文章,想要給我打一筆錢我也是很樂(lè)意的。
好了,話不多說(shuō),發(fā)車。
幫助中心
如果你覺(jué)得阿里云是一個(gè)賣服務(wù)的網(wǎng)站,是一個(gè)讓你花錢的地方,說(shuō)明你的打開方式是官方期望的打開方式。
但是如果你用我的打開方式,它就會(huì)搖身一變,變成一個(gè)免費(fèi)的學(xué)習(xí)網(wǎng)站。
我的打開方式,就是從它「幫助中心」進(jìn)去:
https://help.aliyun.com/

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

再比如,中間件這里,我也圈幾個(gè):

當(dāng)然,還有很多其他的可以看的東西,我就不一一展示了,大家感興趣自己去翻就行了。
在幫助中心里面展示的東西,就是阿里云能賣的服務(wù)。
而他們要賣服務(wù),一定要有對(duì)應(yīng)的文檔說(shuō)明。
就是“吹牛逼”嘛,說(shuō)我的服務(wù)多么多么好,多么多么穩(wěn)定,多么多少省心,有那些應(yīng)用場(chǎng)景,巴拉巴拉巴拉...
所以去翻閱對(duì)應(yīng)技術(shù)點(diǎn)他們提供的文檔,就是正確的打開方式。
下面我用 Redis 來(lái)舉個(gè)例子。
阿里云 Redis 文檔
我覺(jué)得阿里云里面 Redis 的技術(shù)文檔是做的最好的,所以帶你看看。
https://help.aliyun.com/product/26340.html

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

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

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

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

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

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

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

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

另外的同城容災(zāi)方案、跨地域容災(zāi)方案我就不一一介紹了,大家自己去翻一下就行。
命令支持
在命令支持這塊,我也有新的發(fā)現(xiàn):

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

它們是干啥的呢?
來(lái),我問(wèn)你一個(gè)問(wèn)題:用 Redis 做分布式鎖的時(shí)候,解鎖用的命令是什么?
是 DEL 命令,是的,回答的很好。
那么解鎖的時(shí)候需要注意什么呢?

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

t1時(shí)刻,App1設(shè)置了分布式鎖resource_1,過(guò)期時(shí)間為3秒。 App1由于程序慢等原因等待超過(guò)了3秒,而resource_1已經(jīng)在t2時(shí)刻被釋放。 t3時(shí)刻,App2獲得這個(gè)分布式鎖。 App1從等待中恢復(fù),在t4時(shí)刻運(yùn)行DEL resource_1將App2持有的分布式鎖釋放了。
哦豁,不是自己加的鎖,卻把鎖給釋放了?
所以,從上述過(guò)程可以看出,一個(gè)客戶端設(shè)置的鎖,必須由自己解開。
因此客戶端需要先使用 GET 命令確認(rèn)鎖是不是自己設(shè)置的,然后再使用 DEL 解鎖。
先獲取、再判斷、接著刪除,很明顯,這不是一個(gè)原子性的操作,怎么辦?
可以用 lua 腳本。
在 Redis 中通常需要用 lua 腳本來(lái)實(shí)現(xiàn)自鎖自解的功能,比如這樣:
if?redis.call("get",KEYS[1])?==?ARGV[1]?then
????return?redis.call("del",KEYS[1])
else
????return?0
end
是不是感覺(jué)有點(diǎn)麻煩呀?
所以,阿里自己搞了一個(gè) 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
是不是簡(jiǎn)潔了很多?
而它的底層我沒(méi)去看,但是猜也知道,就是對(duì) lua 腳本的一個(gè)封裝。
CAS 命令是拿來(lái)續(xù)租的,可以自己去看看。
https://help.aliyun.com/document_detail/146758.html
同時(shí)文中還提到了如何保障一致性的問(wèn)題:

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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


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

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

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

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


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


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

這也是我想要把這個(gè)“學(xué)習(xí)網(wǎng)站”分享給你的原因,以后多一個(gè)找資料的地方,多一個(gè)學(xué)習(xí)新東西的地方,挺好的。
完!
