最近兩天在最近在一堆冗餘代碼裏面抽出短信和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.