隨手記

1.不同服務之間的事務怎麼處理

事務補償機制:Service服務本身無狀態,事務鏈中的任何一個正向事務操作,都必須存在一個完全符合回滾規則的可逆事務。如果是一個完整的事務鏈,則必須事務鏈中的每一個業務服務或操作都有對應的可逆服務。考慮實現一個通用的事務管理器,實現事務鏈和事務上下文的管理。對於事務鏈上的任何一個服務正向和逆向操作均在事務管理和協同器上註冊,由事務管理器接管所有的事務補償和回滾操作。
基於消息的最終一致性:關鍵就是異步消息和消息持久化機制。
等冪操作:所有提供的業務服務,不管是正向還是逆向的業務服務,都必須要支持重試。因爲服務調用失敗這種異常必須考慮到,不能因爲服務的多次調用而導致業務數據的累計增加或減少。
是否可以補償:看實際場景,客戶是否可接受等。

比如你數據庫操作完成了,MQ連接不上怎麼辦?我們可以在操作數據庫的事務中,增加一個插入事件數據的任務,這個任務和主業務是同一個事務,保證一致性。另外起一個定時任務,從數據庫讀取插入的事件數據,轉化成消息發佈到消息隊列,發佈成功後刪除事件數據。

2.mq消息生產者生產速度遠遠大於消費速度的時候怎麼做?

緩存,降級,限流等。
緩存用於提升系統訪問速度和增大系統處理能力;降級一般當服務出現問題或者影響到核心流程的性能,需要暫時屏蔽掉一些功能,待高峯過去或問題解決後再重新打開。而對於稀缺資源的訪問,頻繁調用複雜查詢等需要大量計算資源的請求等,需要一種手段來限制這些場景下的併發量或請求量,此時需要使用的手段就是限流。
  限流的目的是通過對併發訪問、請求進行限速或者限制在一個時間窗口內的請求數量來保護系統。一旦達到限流上限,可以拒絕服務,也可以採取將請求放入緩存隊列等待等手段進行處理。
  一般高併發系統常見的限流有:限制併發總數(數據庫連接池,線程池)、限制瞬間併發數、顯示時間窗口內的平均速率,以及限制遠程接口調用速率,限制MQ消費速度等。限流的使用需要做好評估,否則有可能出現一些奇怪的問題,或者造成不好的用戶體驗。
鏈接:https://www.jianshu.com/p/41781605ed29
 限制接口訪問頻率、緩存隊列、增加實例的數量提高消費的並行數、批量方式消費 、優化消費者代碼

批量方式消費:置Consumer的consumerMessageBathMaxSize這個參數,默認是1,一次只消費一條消息

3.dubbo多服務負載均衡

 

4.幾個MQ區別、kafka

ss

5.mq消息有丟失與重複消費問題

 

 

6.分佈式架構嗎?有用分佈式事務

https://www.cnblogs.com/hafiz/p/9222973.html

7.zk選舉機制

https://blog.csdn.net/liuj2511981/article/details/42460069

https://www.cnblogs.com/ASPNET2008/p/6421571.html

 

8.逃逸技術、內存逃逸

https://www.jianshu.com/p/7418a4451974

逃逸分析是目前Java虛擬機中比較前沿的優化技術,它並不是直接優化代碼的手段,而是爲其他優化手段提供依據的分析技術。
逃逸分析的主要作用就是分析對象作用域。
  當一個對象在方法中被定義後,它可能被外部方法所引用,例如作爲調用參數傳遞到其他方法中,這種行爲就叫做 方法逃逸。甚至該對象還可能被外部線程訪問到,例如賦值被類變量或可以在其他線程中訪問的實例變量,稱爲 線程逃逸
  通過逃逸分析技術可以判斷一個對象不會逃逸到方法或者線程之外。根據這一特點,就可以讓這個對象在棧上分配內存,對象所佔用的內存空間就可以隨幀棧出棧而銷燬。在一般應用中,不會逃逸的局部對象所佔比例很大,如果能使用棧上分配,那麼大量的對象就會隨着方法的結束而自動銷燬了,垃圾收集系統的壓力就會小很多。
  除此之外,逃逸分析的作用還包括 標量替換同步消除 ;
   標量替換 指:若一個對象被證明不會被外部訪問,並且這個對象可以被拆解成若干個基本類型的形式,那麼當程序真正執行的時候可以不創建這個對象,而是採用直接創建它的若干個被這個方法所使用到的成員變量來代替,將對象拆分後,除了可以讓對象的成員變量在棧上分配和讀寫之外,還可以爲後續進一步的優化手段創造條件。
   同步消除 指:若一個變量被證明不會逃逸出線程,那麼這個變量的讀寫就肯定不會出現競爭的情況,那麼對這個變量實施的同步措施也就可以消除掉。
   說了逃逸分析的這些作用,那麼Java虛擬機是否有對對象做逃逸分析呢?

  答案是否。

  關於逃逸分析的論文在1999年就已經發表,但直到Sun JDK 1.6才實現了逃逸分析,而且直到現在這項優化尚未足夠成熟,仍有很大的改進餘地。不成熟的原因主要是不能保證逃逸分析的性能收益必定高於它的消耗。因爲逃逸分析本身就是一個高耗時的過程,假如分析的結果是沒有幾個不逃逸的對象,那麼這個分析所花費時候比優化所減少的時間更長,這是得不償失的。
  所以目前虛擬機只能採用不那麼準確,但時間壓力相對較小的算法來完成逃逸分析。還有一點是,基於逃逸分析的一些優化手段,如上面提到的“棧上分配”,由於HotSpot虛擬機目前的實現方式導致棧上分配實現起來比較複雜,因此在HotSpot中暫時還沒有做這項優化
事實上,在java虛擬機中,有一句話是這麼寫的:

The heap is the runtime data area from which memory for all class instances and arrays is allocated。
堆是所有的對象實例以及數組分配內存的運行時數據區域。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章