面試題1

sjqsjq發表於2018-12-12

—恢復內容開始—

1.++i 先計算後輸出
2.arraycopy(a,2,b,2,2) 從a陣列第二位複製兩位替換掉b陣列第二位後兩位
3.java獨特特點,平臺無關性。
4..java檔案編譯成.class檔案
5.讀取圖片檔案可使用
6.linkedhashset會保留順序,treeset會自動排序。
7.java變數名不能是數字,不能是關鍵字。
8.private表示私有,只能在本類中使用。
9.物件需要跨網路傳輸,需要實現Serializable介面
10.生命抽象方法不可寫大括號。
11.count+=i 表示count=i+count
12.spring boot框架,其實他不算是一個框架,他算是整合了多個框架。他擁有自己的pom.xml和配置檔案,通過配置檔案或YML實現了對SSM或者其他框架的整合,通過一個application的main方法和註解啟動spring boot。他的使用場景非常廣泛,因為他整合多個框架,所以廣泛應用在各種專案開發和分散式專案的搭建。一般是使用IDEA建立spring boot專案,然後勾選需要的maven依賴。遇到的坑:在建立完成後,無法啟動spring boot專案。
13.select sum(列名) from 表名 where //求綜合
select avg(列名) from 表名 where //求平均數
select count(1) from 表名 where //次數
select 列名 from 表名 where 列名> < //對比
優化資料庫方法:
1.避免在子句中使用!=或<>判斷,所以拆分語句
2.新增索引。
3.避免全表查詢

14.java中執行緒實現方式:
1.classA繼承thread,並重寫run方法,new A.start(),啟動執行緒
2.classA實現Runnable介面,並覆蓋run方法,new thread(new A()).start()0,啟動執行緒。
15.i=12;
i+=i-=i*=i (結果為-120)
16.反射就是執行中的程式檢查自己和軟體執行環境的能力,它可以根據他發現的進行改變。通俗的講就是反射可以在執行時根據指定的類名獲得類的資訊。
invoke()方法就是呼叫method類代表的方法,可以實現動態呼叫。
17.linux系統中,Rm-r /mnt/tmp所代表的是刪除資料夾中所有檔案
18.elasticSearch和solr類似,建立索引,全文檢索的一個開源框架
19.在java中,物件的序列化可以通過實現兩種介面來實現,若實現的是Serializable介面,則所有的序列化將會自動進行,若實現的是Externalizable介面,則沒有任何東西可以自動序列化,需要在writeExternal方法中進行手工指定所要序列化的變數,這與是否被transient修飾無關。
20.對資料進行枷鎖,程式先通過acquire獲取鎖來對資料排他訪問,然後對資料進行一系列的操作最後釋放鎖。
21.解決叢集環境下session共享問題,有下面四種方案:(1).粘性session,每次都將同一使用者的所有請求轉發至同一臺伺服器上,使用者與伺服器繫結。(2).伺服器session,每次session發生變化時,就廣播給所有叢集中的伺服器,使所有伺服器上的session相同.(3).session共享,快取session,使用redis,memcached。(4).session持久化,將session儲存到資料庫中,向運算元據一樣操作session。

22.被final修飾的類無法被繼承,被final修飾的方法無法被重寫。被final修飾的值為常量。
final關鍵字提高了效能,保證安全。使用final關鍵字,jvm會對方法變數及類進行優化。
23.stringbuffer和stringbuilder的區別:他們兩個方法功能完全等價,buffer中方法採用了synchronized關鍵字進行修飾,因此執行緒安全。同理builder執行緒非安全。 單執行緒程式下,builder效率更快,因為不需要加鎖
24. contructors 建構函式 applied 應用
25. 構造方法不能被static、final、synchronized、abstract、native修飾,但可以被public,private,protected修飾。
26.error是系統中的錯誤,程式設計師不能改變和處理,實在程式編譯救贖先錯誤,僅靠程式本身無法恢復和預防,遇到這樣的問題,建議終止程式。
而exception是可以處理的異常,可以捕獲可能恢復。遇到這類問題儘可能處理異常,是程式恢復
27.GET請求=資料庫select
PUT請求=資料庫update
POST請求=資料庫insert
delete請求=資料庫delete
28.抽象類和介面的區別,一個是繼承,一個是實現。抽象方法有public修飾,介面預設是public不可以修飾。抽象類可定義構造方法,也可以有抽象方法和具體方法。介面完全抽象無構造方法。extends繼承抽象類,implements實現介面。
29.方法的重寫和過載是java多型性的不同表現。
override(重寫)特點:(1).子類方法名稱,引數型別必須要和父類完全匹配,才能重寫。(2).子類的方法返回值必須和父類相同,可以擴大不可縮小。(3).子類方法丟擲異常,只能是父類丟擲異常的子異常。(4).被private、final等關鍵字修飾不能被重寫。(5)不是抽象方法不能被abstract修飾。
overload(過載)特點:(1).再使用過載時只能通過不同的引數樣式。(2).方法異常型別和數目不會對過載造成影響.(3).不能通過訪問許可權、返回型別、丟擲異常進行過載。

30.dependency injection=依賴注入
實現依賴注入的不同方法:建構函式注入,設值注入。
31.annotation=註解
@Aspect 指定一個類為切面類
@Before 前置通知:目標方法之前執行
@AfterReturning 返回後通知:執行方法結束前執行
@Around 環繞通知:環繞目標方法執行
@AfterThrowing 異常通知:出現異常執行
@After 後置通知:目標方法之後執行
配置檔案中新增<aop:aspectj-autoproxy/>元素,啟用對於@AspectJ註解的支援
@Conmponent 加入IOC容器

32.當使用|時,若前面的表示式為真時,程式會繼續執行後面的表示式,然後再得到true結果。
||時,若前面的表示式結果為真,則程式不會再執行後面的表示式,直接得出TRUE的結果。

33.switch可作用於char,byte,short,int和他們對應的包裝類。可作用於string型別,列舉型別。不可作用於long,double,float,boolean型別和他們的包裝類。
34. hashmap執行緒非安全,允許有null的鍵和值,效率較高,方法不是Synchronize的要提供外同步。有containsvalue和containskey方法。hashmap是java1.2引進的map interface的一個實現。是hashtable的輕量級實現。
hashtable,執行緒安全,不允許有null的鍵和值。效率稍低,方法是Synchronize的,有contains方法,hashtable繼承於Dictionary類。hashtable比hashmap老
35.spring的好處:
一.輕量級框架
二.控制反轉,通過控制反轉實現鬆耦合
三.面向切面AOP,把應用業務邏輯和系統分開
四.容器,spring包含並管理應用中物件的生命週期和配置
五.MVC框架,強大的web框架
六.事務管理,spring提供持續的事務管理介面,可以擴充套件到上至本地下至全域性的事務管理。
七.異常處理,spring提供方便的API將具體相關的異常處理,轉化為一致的unchecked異常

36.spring生命週期:
bean建立,由beanfactory讀取bean定義檔案,並聲稱各個例項
setter注入,執行bean的屬性依賴注入
BeanFactoryAware的seBeanName(),如果實現該介面,則執行setbeanname方法
BeanFactoryAwaredesetBeanFactory(),如果有關聯pricessor,則在bean初始化之前都會執行這個例項的processBeforeInitialization()方法
DisposableBean的destroy(),在容器關閉時,可以在bean定義檔案中使用”destory-method”定義的方法

37.如果使用ApplicationContextAware介面,則執行其setApplicationContext()方法,然後再進行BeanPostProcessors的processBeforeInitialiization()
實際上,ApplicationContext除了向BeanFactory那樣維護容器外,還提供更加豐富的框架功能,如Bean的訊息,時間處理機制等。

38.JSON開源庫類:1.使用Jackson 2.Google-Gson類庫
3.JSON-lib類庫 4.Flexjson類庫
5.Json-io類庫 6.Genson類庫
7.JSONIJ類庫

39.git命令列:
初始化資料夾=git init
建立本地分支dev=git branch dev
檢視本地分支=git branch
切換分支master=git checkout master

40.maven命令打包war包:命令進入專案包pom.xml下,命令列輸入: mvn package

41.JVM記憶體劃分:java棧,本地方法棧,程式計數器,堆,方法區

42.jvm中堆空間可以分為三個區,新生代,老生代,永久代
新生代刻劃分為三個區,Eden區,兩個倖存區。在jvm執行時,可以通過配置引數來改變整個JVM堆的配置比例。配置有:jvm執行時堆的大小,新生代堆空間大小,永久代大小和其他

43.JVM執行時資料區:
1.PC暫存器:用於儲存每個執行緒下一步將執行的JVM之令。PC指當前指令的地址。JVM用PC來追蹤指令執行的位置,PC實際上是指向方法區的一個記憶體地址。
2.jvm棧:棧是執行緒私有的,每個執行緒建立的同時都會建立jvm棧,棧中存放的是當前區域性基本型別的變數,部分的返回結果以及StackFrame,非基本型別的物件在棧上僅存放一個指向堆上的地址。
3.堆:它是jvm來儲存物件例項以及陣列值的區域,可以作為java中所有通過new建立的物件的記憶體都在此分配,heap中的物件的記憶體需要等待GC進行回收。
4.方法區域:這裡存放了所載入的類的資訊,類中的靜態變數,類中定義為final的變數、類中的field資訊、類中的方法資訊,開發人員在程式中通過class物件中的get,isinterface等方法來獲取資訊,資料全部來源於方法區,同時方法區也是全劇共享,在異地你條件下會被GC,方法區需要使用記憶體超過允許大小,會丟擲outofmemory的錯誤資訊
5.執行時常量池:存放的是類中的固定常量資訊,方法和field的引用資訊等。其空間從方法區分配。
6.本地方法棧:jvm採用本地方法堆疊來支援native方法,此區域用於儲存每個native方法呼叫的狀態。

44.JVM-GC:將記憶體中不再被使用的物件進行回收,GC中用於回收的方法叫收集器,由於GC需要消耗一些資源和時間,在java對物件的生命收起進行分析後,按照新生代、舊生代的方式來對物件進行收集,儘可能縮短GC對應用造成的暫停。

45.JVM優化原則:儘量減少YoungGC,儘量減少FullGC。
優化方法:一、程式碼角度,縮短物件生命期,尤其是大物件。二、JVM引數角度,優化JVM引數以減少YGC/FGC次數,可替換收集器。
解決youngGC問題:把用Arraylist儲存資訊體採用hashmap,map中的key是uudi,value是訊息本體。這樣可以大大增加併發效能。 採用AtomicInteger來儲存當前map中訊息內容的大小。 當map中的訊息體總大小到達閾值後,將當前map中所有key取出,然後將map中的資料封裝到一條訊息中,將當前map中的資訊體大小置為0,然後for迴圈刪除已成功傳送的key。

46.記憶體洩漏以及解決方法:
系統崩潰前的一些現象:*垃圾回收時間變長,fullGC時間變長。*fullgc次數變多 *年老代的記憶體越來越大斌且每次fullgc年老代記憶體沒有釋放
經過以上三點系統會無響應,逐漸達到OutOfMemory臨界值

 

—恢復內容結束—

1.++i 先計算後輸出
2.arraycopy(a,2,b,2,2) 從a陣列第二位複製兩位替換掉b陣列第二位後兩位
3.java獨特特點,平臺無關性。
4..java檔案編譯成.class檔案
5.讀取圖片檔案可使用
6.linkedhashset會保留順序,treeset會自動排序。
7.java變數名不能是數字,不能是關鍵字。
8.private表示私有,只能在本類中使用。
9.物件需要跨網路傳輸,需要實現Serializable介面
10.生命抽象方法不可寫大括號。
11.count+=i 表示count=i+count
12.spring boot框架,其實他不算是一個框架,他算是整合了多個框架。他擁有自己的pom.xml和配置檔案,通過配置檔案或YML實現了對SSM或者其他框架的整合,通過一個application的main方法和註解啟動spring boot。他的使用場景非常廣泛,因為他整合多個框架,所以廣泛應用在各種專案開發和分散式專案的搭建。一般是使用IDEA建立spring boot專案,然後勾選需要的maven依賴。遇到的坑:在建立完成後,無法啟動spring boot專案。
13.select sum(列名) from 表名 where //求綜合
select avg(列名) from 表名 where //求平均數
select count(1) from 表名 where //次數
select 列名 from 表名 where 列名> < //對比
優化資料庫方法:
1.避免在子句中使用!=或<>判斷,所以拆分語句
2.新增索引。
3.避免全表查詢

14.java中執行緒實現方式:
1.classA繼承thread,並重寫run方法,new A.start(),啟動執行緒
2.classA實現Runnable介面,並覆蓋run方法,new thread(new A()).start()0,啟動執行緒。
15.i=12;
i+=i-=i*=i (結果為-120)
16.反射就是執行中的程式檢查自己和軟體執行環境的能力,它可以根據他發現的進行改變。通俗的講就是反射可以在執行時根據指定的類名獲得類的資訊。
invoke()方法就是呼叫method類代表的方法,可以實現動態呼叫。
17.linux系統中,Rm-r /mnt/tmp所代表的是刪除資料夾中所有檔案
18.elasticSearch和solr類似,建立索引,全文檢索的一個開源框架
19.在java中,物件的序列化可以通過實現兩種介面來實現,若實現的是Serializable介面,則所有的序列化將會自動進行,若實現的是Externalizable介面,則沒有任何東西可以自動序列化,需要在writeExternal方法中進行手工指定所要序列化的變數,這與是否被transient修飾無關。
20.對資料進行枷鎖,程式先通過acquire獲取鎖來對資料排他訪問,然後對資料進行一系列的操作最後釋放鎖。
21.解決叢集環境下session共享問題,有下面四種方案:(1).粘性session,每次都將同一使用者的所有請求轉發至同一臺伺服器上,使用者與伺服器繫結。(2).伺服器session,每次session發生變化時,就廣播給所有叢集中的伺服器,使所有伺服器上的session相同.(3).session共享,快取session,使用redis,memcached。(4).session持久化,將session儲存到資料庫中,向運算元據一樣操作session。

22.被final修飾的類無法被繼承,被final修飾的方法無法被重寫。被final修飾的值為常量。
final關鍵字提高了效能,保證安全。使用final關鍵字,jvm會對方法變數及類進行優化。
23.stringbuffer和stringbuilder的區別:他們兩個方法功能完全等價,buffer中方法採用了synchronized關鍵字進行修飾,因此執行緒安全。同理builder執行緒非安全。 單執行緒程式下,builder效率更快,因為不需要加鎖
24. contructors 建構函式 applied 應用
25. 構造方法不能被static、final、synchronized、abstract、native修飾,但可以被public,private,protected修飾。
26.error是系統中的錯誤,程式設計師不能改變和處理,實在程式編譯救贖先錯誤,僅靠程式本身無法恢復和預防,遇到這樣的問題,建議終止程式。
而exception是可以處理的異常,可以捕獲可能恢復。遇到這類問題儘可能處理異常,是程式恢復
27.GET請求=資料庫select
PUT請求=資料庫update
POST請求=資料庫insert
delete請求=資料庫delete
28.抽象類和介面的區別,一個是繼承,一個是實現。抽象方法有public修飾,介面預設是public不可以修飾。抽象類可定義構造方法,也可以有抽象方法和具體方法。介面完全抽象無構造方法。extends繼承抽象類,implements實現介面。
29.方法的重寫和過載是java多型性的不同表現。
override(重寫)特點:(1).子類方法名稱,引數型別必須要和父類完全匹配,才能重寫。(2).子類的方法返回值必須和父類相同,可以擴大不可縮小。(3).子類方法丟擲異常,只能是父類丟擲異常的子異常。(4).被private、final等關鍵字修飾不能被重寫。(5)不是抽象方法不能被abstract修飾。
overload(過載)特點:(1).再使用過載時只能通過不同的引數樣式。(2).方法異常型別和數目不會對過載造成影響.(3).不能通過訪問許可權、返回型別、丟擲異常進行過載。

30.dependency injection=依賴注入
實現依賴注入的不同方法:建構函式注入,設值注入。
31.annotation=註解
@Aspect 指定一個類為切面類
@Before 前置通知:目標方法之前執行
@AfterReturning 返回後通知:執行方法結束前執行
@Around 環繞通知:環繞目標方法執行
@AfterThrowing 異常通知:出現異常執行
@After 後置通知:目標方法之後執行
配置檔案中新增<aop:aspectj-autoproxy/>元素,啟用對於@AspectJ註解的支援
@Conmponent 加入IOC容器

32.當使用|時,若前面的表示式為真時,程式會繼續執行後面的表示式,然後再得到true結果。
||時,若前面的表示式結果為真,則程式不會再執行後面的表示式,直接得出TRUE的結果。

33.switch可作用於char,byte,short,int和他們對應的包裝類。可作用於string型別,列舉型別。不可作用於long,double,float,boolean型別和他們的包裝類。
34. hashmap執行緒非安全,允許有null的鍵和值,效率較高,方法不是Synchronize的要提供外同步。有containsvalue和containskey方法。hashmap是java1.2引進的map interface的一個實現。是hashtable的輕量級實現。
hashtable,執行緒安全,不允許有null的鍵和值。效率稍低,方法是Synchronize的,有contains方法,hashtable繼承於Dictionary類。hashtable比hashmap老
35.spring的好處:
一.輕量級框架
二.控制反轉,通過控制反轉實現鬆耦合
三.面向切面AOP,把應用業務邏輯和系統分開
四.容器,spring包含並管理應用中物件的生命週期和配置
五.MVC框架,強大的web框架
六.事務管理,spring提供持續的事務管理介面,可以擴充套件到上至本地下至全域性的事務管理。
七.異常處理,spring提供方便的API將具體相關的異常處理,轉化為一致的unchecked異常

36.spring生命週期:
bean建立,由beanfactory讀取bean定義檔案,並聲稱各個例項
setter注入,執行bean的屬性依賴注入
BeanFactoryAware的seBeanName(),如果實現該介面,則執行setbeanname方法
BeanFactoryAwaredesetBeanFactory(),如果有關聯pricessor,則在bean初始化之前都會執行這個例項的processBeforeInitialization()方法
DisposableBean的destroy(),在容器關閉時,可以在bean定義檔案中使用”destory-method”定義的方法

37.如果使用ApplicationContextAware介面,則執行其setApplicationContext()方法,然後再進行BeanPostProcessors的processBeforeInitialiization()
實際上,ApplicationContext除了向BeanFactory那樣維護容器外,還提供更加豐富的框架功能,如Bean的訊息,時間處理機制等。

38.JSON開源庫類:1.使用Jackson 2.Google-Gson類庫
3.JSON-lib類庫 4.Flexjson類庫
5.Json-io類庫 6.Genson類庫
7.JSONIJ類庫

39.git命令列:
初始化資料夾=git init
建立本地分支dev=git branch dev
檢視本地分支=git branch
切換分支master=git checkout master

40.maven命令打包war包:命令進入專案包pom.xml下,命令列輸入: mvn package

41.JVM記憶體劃分:java棧,本地方法棧,程式計數器,堆,方法區

42.jvm中堆空間可以分為三個區,新生代,老生代,永久代
新生代刻劃分為三個區,Eden區,兩個倖存區。在jvm執行時,可以通過配置引數來改變整個JVM堆的配置比例。配置有:jvm執行時堆的大小,新生代堆空間大小,永久代大小和其他

43.JVM執行時資料區:
1.PC暫存器:用於儲存每個執行緒下一步將執行的JVM之令。PC指當前指令的地址。JVM用PC來追蹤指令執行的位置,PC實際上是指向方法區的一個記憶體地址。
2.jvm棧:棧是執行緒私有的,每個執行緒建立的同時都會建立jvm棧,棧中存放的是當前區域性基本型別的變數,部分的返回結果以及StackFrame,非基本型別的物件在棧上僅存放一個指向堆上的地址。
3.堆:它是jvm來儲存物件例項以及陣列值的區域,可以作為java中所有通過new建立的物件的記憶體都在此分配,heap中的物件的記憶體需要等待GC進行回收。
4.方法區域:這裡存放了所載入的類的資訊,類中的靜態變數,類中定義為final的變數、類中的field資訊、類中的方法資訊,開發人員在程式中通過class物件中的get,isinterface等方法來獲取資訊,資料全部來源於方法區,同時方法區也是全劇共享,在異地你條件下會被GC,方法區需要使用記憶體超過允許大小,會丟擲outofmemory的錯誤資訊
5.執行時常量池:存放的是類中的固定常量資訊,方法和field的引用資訊等。其空間從方法區分配。
6.本地方法棧:jvm採用本地方法堆疊來支援native方法,此區域用於儲存每個native方法呼叫的狀態。

44.JVM-GC:將記憶體中不再被使用的物件進行回收,GC中用於回收的方法叫收集器,由於GC需要消耗一些資源和時間,在java對物件的生命收起進行分析後,按照新生代、舊生代的方式來對物件進行收集,儘可能縮短GC對應用造成的暫停。

45.JVM優化原則:儘量減少YoungGC,儘量減少FullGC。
優化方法:一、程式碼角度,縮短物件生命期,尤其是大物件。二、JVM引數角度,優化JVM引數以減少YGC/FGC次數,可替換收集器。
解決youngGC問題:把用Arraylist儲存資訊體採用hashmap,map中的key是uudi,value是訊息本體。這樣可以大大增加併發效能。 採用AtomicInteger來儲存當前map中訊息內容的大小。 當map中的訊息體總大小到達閾值後,將當前map中所有key取出,然後將map中的資料封裝到一條訊息中,將當前map中的資訊體大小置為0,然後for迴圈刪除已成功傳送的key。

46.記憶體洩漏以及解決方法:
系統崩潰前的一些現象:*垃圾回收時間變長,fullGC時間變長。*fullgc次數變多 *年老代的記憶體越來越大斌且每次fullgc年老代記憶體沒有釋放
經過以上三點系統會無響應,逐漸達到OutOfMemory臨界值

 

linux命令列:
ls 檢視目錄,檢視檔案許可權
pwd 檢視當前工作目錄
mkdir 建立資料夾
rm 刪除命令
mv 移動檔案或資料夾
cat命令 顯示整個檔案,建立一個檔案,將幾個合併一個

git命令列:
add 新增
commit 提交資訊
log 檢視日誌
push 更新到github上
status 對應資料夾中新增新有項

 

47.代理模式:
一、靜態代理
優點:可以做到在符合開閉原則的情況下對目標物件進行功能擴充套件。
缺點:我們得為每一個服務都建立代理類,工作量大,不易管理。同時介面一旦發生變化,代理類也得相應修改。
二、動態代理
在動態代理中我們不需要再手動建立代理類,我們只需要編寫一個動態處理器就可以。真正的代理物件由jdk再執行時為我們動態建立。
優點:相較於靜態代理,我們大大減少了開發任務,也減少了對業務介面的依賴,降低了耦合。
缺點:無法擺脫僅支援interface代理的問題。
三、CGLIB代理
JDK實現動態代理需要實現類通過介面定義業務方法,對於沒有藉口的類。我們就要使用CGLIB了。CGLIB採用了底層位元組碼的技術,原理是通過位元組碼技術為一個類建立子類,並在子類中採用方法攔截技術攔截所有類方法的呼叫,瞬時織入橫切邏輯。但因為採用的是繼承,所以不能對final修飾的類進行代理。JDK動態代理與CGLIB動態代理都是spring aop的基礎
總結:CGLIB建立的動態代理物件比JDK建立的動態代理物件效能更高,但是CGLIB建立代理花費的時間比JDK多很多。所以對於代理物件,因為無需頻繁建立物件,用CGLIB合適,反之使用JDK方法要更為合適一些。同時由於CGLIB是採用動態建立子類的方法,對於final修飾的方法無法進行代理。

 

 

 

48.分散式事務
一、兩階段提交(2PC)
優點:儘量保證了資料的強一致性,適合對資料強一致性的要求高的

關鍵領域。
缺點:實現複雜,犧牲了可用性,對效能影響大。不適合高併發高性

能場景,如果分散式系統跨介面呼叫,目前沒有實現方案。
二、補償事務(TCC)
核心思想:針對每個操作,都要註冊一個與其對應的確認和補償操作

。三階段:try階段主要對業務系統做檢測及資源預留,confirm階段主

要是對業務系統做確認提交,try階段成功並開始執行confirm階段,默

認confirm階段不會出錯。cancel階段主要是在業務執行錯誤,需要回

滾的狀態下執行的業務取消,預留資源釋放。
優點:比2pc流程簡單,資料一致性相對較差。
缺點:在二三步中有可能失敗,所以需要實現過程中寫很多業務程式碼

,一些場景中,一些業務流程可能用TCC不太好定義處理。
三、本地訊息表
業界使用最多,核心思想是將分散式事務拆分成本低事務進行處理。
基本思路:資訊產生放,需要額外建一個訊息表,並記錄訊息傳送狀

態。訊息和業務資料要在一個事務裡提交,也就是說他們要在一個資料

庫中,然後訊息經過MQ傳送到消費方。如果失敗會重試傳送。
然後訊息消費方需要處理這個訊息,並完成自己的業務邏輯。此時如

果本低事務處理成功,表名已經處理成功,如果失敗,就嘗試重試執行

。如果都失敗,可以給生產方傳送一個業務補償資訊,通知生產方進行

回滾操作。
生產方和消費方定時掃描本低訊息表,把還沒處理完的訊息或者失敗

資訊再發一遍。如果有靠譜的自動到帳補償邏輯,這種方案還是很實用


優點:一種非常經典的實現,避免了分散式事務,實現了最終一致性


缺點:訊息表會耦合到業務系統中,如果沒有封裝好的解決方案,會

有很多雜活需要處理。
三、MQ事務訊息
四、sagas事務模型

相關文章