1. 程式人生 > >使用Redis來處理負載均衡場景下非同步轉同步的方法

使用Redis來處理負載均衡場景下非同步轉同步的方法

使用Redis來處理負載均衡場景下非同步轉同步的一種方法

背景

對一個由Java編寫的提供HTTP介面服務的程式進行改造以支援負載均衡,特別是提高整個系統的可用性。該服務有一個HTTP介面,收到請求後,內部會去非同步請求第三方,第三方通過HTTP回撥把結果返回,而該介面需要同步返回結果,即內部做了一個非同步轉同步的過程。對如何實現非同步轉同步,可以自行搜尋 Java非同步轉同步。

我們有一個Key來標記同一個請求和返回。該Key可以從第三方回撥的引數中生成,但是卻不能從該服務介面的引數中生成,需要該服務再去做一些資料庫查詢操作。所以如果用nginx等來做負載均衡,並不能比較簡單把第三方回撥的請求和該服務的介面請求分發到同一個後臺服務介面上,是本次改造要解決的難點。

方法

  • 用Redis做訊息佇列和快取,每個服務程式監聽不同的Topic;
  • 服務收到請求時,把Key快取到Redis中,該Key對應的value即為自己的Topic;
  • 服務收到回撥時,可先檢查Key是不是自己處理的, – 如果是,清除Redis快取,並自行處理後續流程,同步響應原始請求; – 如果不是,通過Key在Redis中查到的Topic,並把回撥訊息發到該Topic。如果查不到,可列印日誌丟棄; – 服務收到Redis訊息,清除Redis快取,並處理訊息響應原始請求;

快取需要配置超時時間,防止程式異常導致新增的Key不會被清除。

總結

可以看到該方案可以滿足負載均衡分散式部署的需求,但是對於效能的提升是1+1<2的,不過能夠極大的提升了系統的可用性,個人覺得還是可取的。