周志明出的新書——《鳳凰架構》。強烈推薦
地址: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...