spring cloud feign 調用服務脫鉤(異步)處理

最近兩天在最近在一堆冗餘代碼裏面抽出短信和email模塊做單獨服務,遇到一個感覺比較有意思的問題。下面給大家羅列一下基本西信息

1.環境 win10  i5-3230M RAM12G mysql遠程數據庫

2.技術採用spring cloud feign 負載 hystrix做熔斷處理

3.暫時無接入MQ做解耦

一、原先技術架構是一步到位。結構如下圖:

上圖可以看出用戶一個請求的TTL時間爲800ms

然後我實測了一下 500個請求   
預計執行時間 :400ms + 400ms * 500 = 200400ms

實際執行時間:(203554ms-400ms)/501次 = 405.497006ms 

上面結果可以看出實際結果和執行結果幾乎差不多,並沒有什麼出入的地方。

結論:一共執行了501次請求TTL 時間 203秒,三分二十三秒,QPS2.5。

二、下面我做了脫鉤,技術結構如下:

上圖可以看出用戶一個請求的TTL時間爲406ms

 

 

然後我實測了一下 500個請求   
預計執行時間 :400ms + 6ms * 500 = 3400ms

實際執行時間:(3351ms-400ms)/500次 = 5.902ms 

上面結果也可以看出實際結果和執行結果幾乎差不多

結論:一共執行了500次請求TTL 時間 3.35秒,三分二十三秒,QPS149.2,相對而已對比第一次執行時間從203秒壓縮到3秒多一點點 這效率的提升達到將近67倍效率的提升,如果只從第一個結構來看可以想象以後如果我們後面在掛其他服務,TTL耗時只會成倍數疊加。這是一件很可怕的事情。
 

三、有意思的地方
      因爲我們還沒有用MQ,所以我只能利用異步來做脫鉤的處理,可是我在spring 官網沒看到feign有異步支持的任何信息,只能從自己想想辦法或者網上找找資料

方案一:
            設置hystrix 超時時間爲10000ms ,自動熔斷髮出的請求已達到異步脫鉤的操作,缺點不夠優雅,是個很暴力的解決方案,而且你要保證在設置的超時範圍內,調用着的請求能否被接收方收到(感覺這點很不靠譜)。

方案二(未完善):

           利用rxjava 進行擴展(前提是提供對外api(Single、Completable) ),看了一下,確實是可行的,當然是在前提的情況下,坐等大佬完善。

方案三:

           利用註解@Async,直接放在被調用者的方法上,也可以利用返回參數FutureTask來做一些回調從處理,總的來很已經達到目的的要求了。
           PS:其實一開始我想放在feign上面的,在調用者那裏做脫鉤處理,結果方法不可行,小夥伴們可以試試。如果可以 麻煩下面留言告訴我一聲,3Q.

 

            

      

 

 

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