架構必備技能第一談
- 2022 年 2 月 21 日
- 筆記
前言
此系列將以精簡的言語講述技術人,必須掌握基礎性IT知識技能,請持續關注,希望給大家都是一些精簡的乾貨.
第一部分:分佈式事務
事務的意義在於:保證所提交的事務(或者叫做任務)要麼成功要麼失敗,且要保證數據的正確性.
而在分佈式架構之下,所有的服務運行在不同的環境不同的地域之下,各自做着不同的事情,而業務數據的處理邏輯的正確性至關重要,
分佈式事務就顯得格外重要,也是分佈式架構下必要考慮的一環.
市面上流行的流行的解決方案有:2PC,3PC,TCC,本地消息表,帶有分佈式事務的MQ
PS:設計到事務就必然想到了分佈式的離散的問題的解決手段:依靠中心
分佈式避免中心,但離不開中心,有中心就應該有高可用做支撐.
2PC
在各個節點執行commit前,問問協調器,我可不可以提交?只有所有的相關節點都就緒了,所有的節點才能執行提交.
也就是說:各個節點準備就緒後,都會各自告訴協調器,協調器知道了所有都準備就緒才會告訴大家可以commit了.
先完成的要阻塞等待沒有完成的,所以協調器不能出問題,且性能阻塞不好.
3PC
在2PC的機制上,添加了一個提交前的PreCommit的預提交階段,也就說:大家收到了準備就緒,多確認一次;
同時添加了再協調器和提交者雙端添加超時機制,超時也表示失敗;
這兩點增強了2PC的穩定性,但未解決性能問題;
TCC(Try-Confirm-Cancel)又稱補償事務
注意多了一個補償機制,當有一個節點失敗,此事務相關的節點就要執行補償方法.性能還行,需要注意冪等.
本地消息表
所謂的本地消息表,就是把某一事務相關的系列數據,通過MQ放到一個中心數據庫中.
由一個中心掃描程序進行監控整個事務的執行情況,沒有成功就重新提交MQ.失敗數太多就最終放棄,並通知相關人:運維,運營,技術,業務發起人.
第二部分:必須掌握的設計模式的6大基本原則
23個設計模式,都是從這六大設計模式中演化而來,所以這六大原則是產生23個設計模式的原則,作為技術人,可以不知道23個設計模式,但不能不知道這六個原則,這是心法
23個設計模式那是招式,所以基本原則比23個設計模式更為重要
原則一:單一職責
定義:一個類只負責一個功能領域中的相應職責;
亦即:你定義的類就一個因素可以引起它的變化。
簡化理解:一個類單純地干好一個活。
思考:繼承關係(IS-A)是否有些違背了這一原則,在以後軟件生命周期中,編碼人需要考慮:基類要對子類負責。是不是Has-A更好呢?
原則二:開閉原則
定義:一個軟件模塊(或類)僅對擴展開放,對修改關閉。
亦即:不要想着修改現有功能,而是如何擴展現有功能。
簡化理解:修改現有的功能,就意味着一切從來,帶來不穩定。
思考:這一原則是對既有功能穩定性的維護,另一方面體現了面向抽象(接口)編程的重要性,接口不變,實現內容裏面做調整。
原則三:迪特米法則
定義:最少知識原則
亦即:軟件模塊(或類)間盡量避免相互影響,相互不該知道就不要暴露。
簡化理解:這是對安全和穩定性的維護
思考:安全領域的一個思想就是:權限最小化。
原則四:接口隔離原則
定義:類所需的接口應該是最小的,是自己需要的。
亦即:使用多個專門的接口,而不使用單一的總接口,即客戶端不應該依賴那些它不需要的接口。
簡化理解:不要設計一個很大的接口,自以為包羅萬象,帶來的是冗餘。
原則五:依賴導致原則
定義:抽象不應該依賴於細節,細節應當依賴於抽象。換言之,要針對接口編程,而不是針對實現編程。
思考:為什麼IOC大行其道?解決的問題是為了什麼?
原則六:里氏替換原則
定義:使用的基類可以在任何地方使用繼承的子類,完美的替換基類。
思考:面向抽象編程,面向接口編程
第三部分:數據在內存中的存儲形式
2.1 三碼的表示方式
計算機的二進制在內存中的存儲形式:補碼,且因CPU架構等不同採用了大小端存儲在內存中,關於大小端大家自行閱讀相關文章,至於有什麼用,目前我能告訴你的是:
當我們設計底層編程及對數據存儲和通訊時,我們可以頭腦清醒.
正數的原碼、反碼、補碼都是就是原碼;提示,因為計算機採用補碼,所以技術人腦子裏面應該是補碼,多轉幾圈沒有必要.
負數的反碼=符號位不變,其他位取反;
負數的補碼=反碼+1;
[+1]原 = 0000 0001
[-1]原 = 1000 0001
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
[+1] = [00000001]原 = [00000001]反 = [00000001]補
[-1] = [10000001]原 = [11111110]反 = [11111111]補
2.1 為什麼計算機內採用補碼
原因如下:
1.原碼不能表示減法: 1 – 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2
2.反碼出現+0,-0:
1 – 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0
3.所以出現補碼
PS:所以作為技術人,先記住你的數據在內存中是補碼
注意:有一個行規,最大的負數的補碼用1000…00進行表示
所以:類似於int的取值範圍用(2^-31 –>2^31-1)進行表示 (中間有一個0)
先寫道這裡,下次繼續。