秒懂,阿裏校招Java面試

程序媛黛玉 2021-09-18 06:42:38 阅读数:221

java

3)如果DB執行成功,回複MQ服務器,將狀態為COMMIT_MESSAGE;如果DB執行失敗,回複MQ服務器,將狀態改為ROLLBACK_MESSAGE。注意此過程有可能失敗。

4)MQ內部提供一個名為“事務狀態服務”的服務,此服務會檢查事務消息的狀態,如果發現消息未COMMIT,則通過Producer啟動時注册的TransactionCheckListener來回調業務系統,業務系統在checkLocalTransactionState方法中檢查DB事務狀態,如果成功,則回複COMMIT_MESSAGE,否則回複ROLLBACK_MESSAGE。

說明:

上面以DB為例,其實此處可以是任何業務或者數據源。

以上SEND_OK、COMMIT_MESSAGE、ROLLBACK_MESSAGE均是client jar提供的狀態,在MQ服務器內部是一個數字。

TransactionCheckListener 是在消息的commit或者rollback消息丟失的情况下才會回調(上圖中灰色部分)。這種消息丟失只存在於斷網或者rocketmq集群掛了的情况下。當rocketmq集群掛了,如果采用异步刷盤,存在1s內數據丟失風險,异步刷盤場景下保障事務沒有意義。所以如果要核心業務用Rocketmq解决分布式事務問題,建議選擇同步刷盤模式。

2. 多系統之間數據一致性(多方事務)

秒懂,阿裏校招Java面試_Java

當需要保證多方(超過2方)的分布式一致性,上面的兩方事務一致性(通過Rocketmq的事務性消息解决)已經無法支持。這個時候需要引入TCC模式思想(Try-Confirm-Cancel,不清楚的自行百度)。

交易系統和其他系統之間保持最終一致性的解决方案

以上圖交易系統為例:

1)交易系統創建訂單(往DB插入一條記錄),同時發送訂單創建消息。通過RocketMq事務性消息保證一致性

2)接著執行完成訂單所需的同步核心RPC服務(非核心的系統通過監聽MQ消息自行處理,處理結果不會影響交易狀態)。執行成功更改訂單狀態,同時發送MQ消息。

3)交易系統接受自己發送的訂單創建消息,通過定時調度系統創建延時回滾任務(或者使用RocketMq的重試功能,設置第二次發送時間為定時任務的延遲創建時間。在非消息堵塞的情况下,消息第一次到達延遲為1ms左右,這時可能RPC還未執行完,訂單狀態還未設置為完成,第二次消費時間可以指定)。延遲任務先通過查詢訂單狀態判斷訂單是否完成,完成則不創建回滾任務,否則創建。 PS:多個RPC可以創建一個回滾任務,通過一個消費組接受一次消息就可以;也可以通過創建多個消費組,一個消息消費多次,每次消費創建一個RPC的回滾任務。 回滾任務失敗,通過MQ的重發來重試。

以上是交易系統和其他系統之間保持最終一致性的解决方案。

3.案例分析

1) 單機環境下的事務示意圖

如下為A給B轉賬的例子。

步驟

動作

1

鎖定A的賬戶

2

鎖定B的賬戶

3

檢查A賬戶是否有1元

4

A的賬戶扣减1元

5

給B的賬戶加1元

6

解鎖B的賬戶

7

解鎖A的賬戶

以上過程在代碼層面甚至可以簡化到在一個事物中執行兩條sql語句。

2) 分布式環境下事務

和單機事務不同,A、B賬戶可能不在同一個DB中,此時無法像在單機情况下使用事物來實現。此時可以通過一下方式實現,將轉賬操作分成兩個操作。

a) A賬戶

步驟

動作

1

鎖定A的賬戶

2

檢查A賬戶是否有1元

3

A的賬戶扣减1元

4

解鎖A的賬戶

b) MQ消息
A賬戶數據發生變化時,發送MQ消息,MQ服務器將消息推送給轉賬系統,轉賬系統來給B賬號加錢。

c) B賬戶

步驟

動作

1

鎖定B的賬戶

2

給B的賬戶加1元

3

解鎖B的賬戶

四、 順序消息

1. 順序消息缺陷

發送順序消息無法利用集群Fail Over特性消費順序消息的並行度依賴於隊列數量隊列熱點問題,個別隊列由於哈希不均導致消息過多,消費速度跟不上,產生消息堆積問題遇到消息失敗的消息,無法跳過,當前隊列消費暫停。

2. 原理

produce在發送消息的時候,把消息發到同一個隊列(queue)中,消費者注册消息監聽器為MessageListenerOrderly,這樣就可以保證消費端只有一個線程去消費消息。

注意:把消息發到同一個隊列(queue),不是同一個topic,默認情况下一個topic包括4個queue

3. 擴展

可以通過實現發送消息的對列選擇器方法,實現部分順序消息。

舉例:比如一個數據庫通過MQ來同步,只需要保證每個錶的數據是同步的就可以。解析binlog,將錶名作為對列選擇器的參數,這樣就可以保證每個錶的數據到同一個對列裏面,從而保證錶數據的順序消費

寫在最後

作為一名即將求職的程序員,面對一個可能跟近些年非常不同的 2019 年,你的就業機會和風口會出現在哪裏?在這種新環境下,工作應該選擇大廠還是小公司?已有幾年工作經驗的老兵,又應該如何保持和提昇自身競爭力,轉被動為主動?

就目前大環境來看,跳槽成功的難度比往年高很多。一個明顯的感受:今年的面試,無論一面還是二面,都很考驗Java程序員的技術功底。

最近我整理了一份複習用的面試題及面試高頻的考點題及技術點梳理成一份“Java經典面試問題(含答案解析).pdf和一份網上搜集的“Java程序員面試筆試真題庫.pdf”(實際上比預期多花了不少精力),包含分布式架構、高可擴展、高性能、高並發、Jvm性能調優、Spring,MyBatis,Nginx源碼分析,Redis,ActiveMQ、Mycat、Netty、Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、Nginx等多個知識點高級進階幹貨!

 CodeChina開源項目:【一線大廠Java面試題解析+核心總結學習筆記+最新講解視頻】

由於篇幅有限,為了方便大家觀看,這裏以圖片的形式給大家展示部分的目錄和答案截圖!
秒懂,阿裏校招Java面試_後端_02

Java經典面試問題(含答案解析)

秒懂,阿裏校招Java面試_程序員_03

阿裏巴巴技術筆試心得

秒懂,阿裏校招Java面試_程序員_04

版权声明:本文为[程序媛黛玉]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/09/20210918064237899q.html