讀書筆記——鳳凰架構


周志明出的新書——《鳳凰架構》。強烈推薦

地址:http://icyfenix.cn/

讀書時,一些知識點簡略記錄一下。

 

========================================================================

事務

Local Transaction 單服務單數據源

為了保證數據庫原子性和持久性,就只能在崩潰后采取恢復的補救措施,這種數據恢復操作被稱為“崩潰恢復”Crash Recovery。
方式:

1.Commit Logging
首先將修改什么數據,數據位置,改成什么值等信息記錄到日志中(在文件末尾順序追加的方式記錄,最高效的寫入方式),在日志記錄全都安全落盤后,db再根據日志信息對數據庫數據進行修改,修改完成后,在日志中追加一條“結束記錄”。

2.Shadow Paging
原數據暫且不動,復制出來一份,在copy上進行數據修改。數據修改完成后,最后將指針從原數據指向copy,最后的指針變化,被認為是原子操作。
它比Commit logging更加簡單,但涉及隔離性和並發瑣時,它的事物並發能力有限,因此高性能數據庫中應用不多。

Commit Logging 存在一個巨大的先天缺陷:決不允許在事務提交之前就修改磁盤上的數據.

Write-Ahead Logging 提前寫入

Undo Log 回滾日志 注明修改了哪個位置的數據、從什么值改成什么值,等等
在事務回滾或者崩潰恢復時根據 Undo Log 對提前寫入的數據變動進行擦除
Redo Log 重做日志 此前記錄的用於崩潰恢復時重演數據變動的日志就相應被命名為 Redo Log


Global Transaction 單服務多數據源

JTA  Java Transaction API
XA 將事務提交拆分成為兩階段過程:准備階段,提交階段

分布式事務 多服務多數據源

CAP 定理(Consistency、Availability、Partition Tolerance Theorem)
三個特性最多只能同時滿足其中兩個

追求最終一致性的柔性事務:

可靠事件隊列
那順序就應該安排成最容易出錯的最先進行,即:賬號扣款 → 倉庫出庫 → 商家收款。
只許成功,不許失敗

TCC 事務
它是“Try-Confirm-Cancel”三個單詞的縮寫。
不考慮隔離性的話,有可能發生超售的問題。
如果業務需要隔離,那架構師通常就應該重點考慮 TCC 方案,該方案天生適合用於需要強隔離性的分布式事務中。在具體實現上,TCC 較為煩瑣,它是一種業務侵入式較強的事務方案,要求業務處理過程必須拆分為“預留業務資源”和“確認/釋放消費資源”兩個子過程。
好處:TCC 在業務執行時只操作預留資源,幾乎不會涉及鎖和資源的爭用,具有很高的性能潛力。
壞處:更高的開發成本和業務侵入性,意味着有更高的開發成本和更換事務實現方案的替換成本。

SAGA 事務
必須保證所有子事務都得以提交或者補償,但 SAGA 系統本身也有可能會崩潰,所以它必須設計成與數據庫類似的日志機制(被稱為 SAGA Log)以保證系統恢復后可以追蹤到子事務的執行情況,譬如執行至哪一步或者補償至哪一步了。另外,盡管補償操作通常比凍結/撤銷容易實現,但保證正向、反向恢復過程的能嚴謹地進行也需要花費不少的工夫,譬如通過服務編排、可靠事件隊列等方式完成,所以,SAGA 事務通常也不會直接靠裸編碼來實現

冪等性 讓消息帶上一個唯一的事務 ID

========================================================================

什么是 banner?

當你執行程序時,控制台中打印出來的圖形標志就是bannder。你將一個banner.txt放在 路徑(src/main/resources)下面,執行程序就可以了。

下面有一個編輯圖形的網站,挺有意思,大家可以嘗試自己的bannner:

 https://devops.datenkollektiv.de/banner.txt/index.html
type可以選擇 banner3

========================================================================

 什么是 StopWatch?

它是Spring提供的計時器,StopWatch對於秒、毫秒為單位方便計時的程序,尤其是單線程、順序執行程序的時間特性的統計輸出支持比較好。也就是說假如我們手里面有幾個在順序上前后執行的幾個任務,而且我們比較關心幾個任務分別執行的時間占用狀況,希望能夠形成一個不太復雜的日志輸出,StopWatch提供了這樣的功能。而且Spring的StopWatch基本上也就是僅僅為了這樣的功能而實現。

        ADemo05 demo = new ADemo05();
        StopWatch clock = new StopWatch();
        clock.start("bruce");
        System.out.println(demo.minPathSum(ss));
        clock.stop();
        
        System.out.println(clock.prettyPrint());

結果:

StopWatch '': running time = 708201 ns
---------------------------------------------
ns         %     Task name
---------------------------------------------
000708201  100%  bruce

界面效果還是很好的,省去手動打時間戳的麻煩了。

 

Stopwatch介紹摘自:

https://blog.csdn.net/ioe_gaoyong/article/details/22788789

========================================================================

 

to be continued...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM