https://blog.csdn.net/Be_Pretty_Better/article/details/82732908
1.分布式session問題:因為在分布式系統中,服務器集群,同一服務通常會放在幾台不同的服務器中,當瀏覽器第一次發來請求或原session已經失效時,會在服務器端創建session,並將sessionId放在響應頭中返回瀏覽器保存在cookie。當瀏覽器第二次訪問時,會帶着sessionId在服務器中查找session,雖然兩次訪問的網址相同,但是請求可能打到兩個不同的tomcat上,這樣第二次請求找不到之前的session。這個問題有以下5種解決方法:
使用數據庫進行session共享
使用redis進行session,k,v分別是sessionId,session,該方法已經集成在springboot中,在redis配置類上加@EnableRedisHttpSession
使用token加session,token和session都是臨時且唯一的,redis的k,v分別是token,session
使用tomcat自帶的session同步工具,但是效果不好有延時
在網關層做ip hash操作,確保相同ip的請求可以打到相同的tocmat
2.分布式跨域問題:前端頁面的ajax請求在訪問當前頁面所在的系統的服務接口時,不會發生任何問題,但是在訪問系統的頁面時,可以將請求成功發出去,也可以成功返回,但瀏覽器不會允許展示,這個問題有4種解決辦法:
在響應頭中加“access-control-allow-origin”
用nginx或zuul反向代理,請求全都打到反向代理服務器,在通過反向代理服務器發請求,並返回給ajax,在瀏覽器看來都是同一個系統
用jsonp,將ajax的type設置jsonp,但是jsonp只能支持get請求
ajax打到本系統的某接口,在通過這個接口封裝httpclient或其他rpc框架發請求
3.分布式任務調度:系統中都會有定時任務,當同一服務被部署到多台不同服務器后,同一定時任務就會被被執行多次,比如定時進行redis備份,那么redis就會被備份多份,這顯然是不對的。
通過使用xxl-job調度中心進行統一調度,保證同一時間相同任務只有一個被執行。
4.分步式事物:一個方法A改了自己的數據庫,成功后,又通過rpc發請求給另一個服務B改B的數據庫,也成功,返回true,結果網斷了,A沒收到B的響應,超時之后,A數據庫回滾,B不動,這樣就違反一致性。
用lcn框架解決,lcn是國人開發,核心思想是“不生產事物,只做本地事物搬運工”,采用2pc協議,也就是當兩個數據庫都操作完成並成功后,都會給lcn發信號,這時lcn在同一commit,否則lcn統一rollback
5.分布式冪等性:例如表單重提交問題,應該提交多次只有一次起作用,在傳統系統中,多次提交會打到統一接口,可以再接口內部進行請求去重,但是在分布式系統中,多次提交可能打到不同服務器上,不能再按照之前的方法去重
解決方法:用aop做請求攔截,在前置通知中,判斷過來的請求頭中是否有token,如果有放行,如果沒有,采用uuid+時間戳的方式,基於分布式鎖生成全局唯一token,加到請求頭中,在將token存放到redis,放行。請求到達環繞通知,首先判斷請求頭中的
token在redis能否查到,如果能,刪除redis的token,執行請求接口。如果redis中沒有對應的token,說明請求是第二次或多次調用,攔截。
6.分布式鎖:當多個線程同時對一個變量進行讀寫操作,就會產生線程安全問題,但是傳統的synchronized對其他系統的線程是不可見的,所以需要一個對所有服務所有線程都可見的鎖。
三中解決方法:基於數據庫,基於redission,基於zookeeper。在zookeeper約定好的路徑下建臨時節點,同一時間只有一個線程能建立成功,並且在刪除之前都不能創建相同路徑的節點,定義watch可監聽節點的刪除操作,刪除后其他節點能及時得到通知
而不用輪巡的嘗試創建鎖。在這提一下java的一個基礎知識,synchronized和lock的區別,lock有tryLock方法,可以嘗試創建鎖,並拿到返回值,lock能夠知道當前有沒有鎖,並進行處理,而synchronized在不能加鎖的時候阻塞住,直到能加鎖為止。zookeeper
分布式鎖類似lock,在創建臨時節點的時候,創建成功和失敗都會有返回值。
redission方式:redission和ReentantLock是唯二的兩個實現了lock接口的類,reentantlock是重入鎖,redission是分布式鎖,用法和lock相同,是基於redis實現的。
分布式系統常見問題總結
https://blog.csdn.net/moranzi1/article/details/78572219