2017-08-09 40 views
0

我有兩個休息API。我使用Spring Boot和MongoDB。當兩個REST端點讀取相同的數據時處理延遲問題

首先,客戶端調用將記錄插入到mongo集合中的api1。 然後幾秒鐘後,api2嘗試讀取插入記錄並執行一些過程。

但有時候會出現這樣的情況,當api2嘗試讀取記錄時,由於api1的延遲而沒有插入集合。

在這種情況下,api2無法執行此過程。

我可以想到的一個選項,當api2讀取記錄時,如果它仍然沒有插入到mongo中,請將睡眠時間睡幾秒鐘並喚醒它(可以做幾次直到記錄存在)

我還有其他選擇嗎?

更新: 這兩個API是獨立的。流程就像在完成上傳視頻時調用api1並插入帶有refid和流程完成的媒體。然後,應用程序在視頻轉碼完成後(通常在30秒左右之後)用refid接收從外部視頻處理系統到api2的回叫,然後api2對插入的媒體進行一些更新。有一個邊緣的情況下,對於非常小的視頻外部視頻系統的行動很快,並給出回調,那時我的應用程序仍然插入媒體到mongo

+0

爲什麼不使用事件系統?把你的數據放到一個代理中,然後由一個監聽器處理,這個監聽器會處理和存儲數據到DB – wargre

+0

@wargre那麼這兩個API是獨立的。流程就像在完成上傳視頻時調用api1並插入帶有refid和流程完成的媒體。然後,應用程序在視頻轉碼完成後(通常在30秒左右之後)用refid接收從外部視頻處理系統到api2的回叫,然後api2對插入的媒體進行一些更新。有一個邊緣情況,對於非常小尺寸的視頻,外部視頻系統動作迅速,並提供回調,那時我的應用程序仍然將媒體插入到mongo中。 – Harshana

+0

@Harshana,聽起來有點太複雜了......我還是會用api1去調用api2,一旦它完成,或者api1發佈事件,然後想要(在你的情況下是api2)註冊這個事件並且需要行動。 –

回答

1

我建議你的api1一旦完成調用api2和傳遞它插入的id。這樣api2永遠不會過早運行。另一種方法是使用api1放置消息的隊列,並且api2使用該消息並對其進行處理(信任給在他的評論中提到它的@warge用戶)

+0

我對@warge添加了評論。請看看 – Harshana

0

從您的用例中,您沒有太多的選擇。

乾淨的方法是在上傳時創建文檔,以便api1和api2將被更新,並且不會有「找不到」異常。