2014-04-24 81 views
0

我需要將我從外部API獲得的數據提供給多個用戶請求。我想知道在這種情況下使用什麼策略。輪詢服務器爲多個用戶請求服務

例如:

  • 用戶1發送對數據 「A」 與數據=>服務器開始輪詢響應請求 「A」
  • 用戶2發送對數據 「A」=>服務器開始輪詢請求與數據響應「A」
  • 用戶3發送對數據「B」的數據「B」

然後,對於服務器側=>服務器開始輪詢應答請求:

    從用戶數據「A」
  • 接收的請求1 =>檢查數據「A」已輪詢:
    • 如果是:開始輪詢數據「A」
    • 如果沒有:開始輪詢數據「 A「從外部API並開始輪詢到用戶1
  • 數據
  • 接收的請求‘A’從用戶2 =>檢查數據‘A’已輪詢:
    • 如果是:開始輪詢數據」 A「
    • 如果否:從外部API開始輪詢數據「A」,並開始輪詢到用戶2
  • 從用戶數據「B」
  • 接收的請求3 =>檢查數據「B」已輪詢:
    • 如果是:啓動輪詢數據「B」
    • 如果沒有:從外部API開始查詢數據「A」,並開始輪詢用戶3

當然,我希望做的那是什麼因爲User1和User2請求相同的da ta,服務器將不會向API提出兩倍的請求。我不知道該怎麼做。

另外,對API的請求必須輪詢,例如當用戶發出請求並且至少有一個用戶仍然連接時,每10或30秒。

關於技術,我將不得不使用NodeJS來完成。然後我想通過socket.io而不是ajax調用來完成所有這些。

請有人能解釋一個系統,可以在Node中做到這一點?

回答

0

聽起來好像您希望服務器緩存A,以便如果其他用戶請求它,服務器可以快速發送存儲在內存中的A

Node.js的代碼將是這樣的:

var cachedData; 

socket.on('requestDataA',function(data){ 
    var date = new Date().getTime(); 
    //check and see if cachedData is expired 

    if(data >=cachedData.expireDate){ 
     cachedData=null; 
    } 

    if(!cachedData){ 
     pollServerToGetA(function(A){ 
      cachedData=A; 
      socket.emit('dataA',cachedData); 
     }); 
    }else{ 
     socket.emit('dataA',cacheData); 
    } 
}); 
+0

謝謝你,我做了一個小測試,它提供了其他用戶的緩存數據。但是我沒有日期/過期日期的事情做了所有這些。你能解釋一下嗎?這是否意味着我必須設置緩存到期?如果即我每隔30秒輪詢一次,那麼我的緩存應該每45秒過期一次? –

+0

@BobbyShark我只是假設'A'會經常改變每一個,和一定的時間後,'A'將需要更新,以便用戶隨時獲得最新的數據,而不是舊的副本。 「A」將過期的日期將是'expireDate'。如果'date'超過了'expireDate',這意味着內容應該從服務器中提取。您應該儘可能少地輪詢服務器,同時仍然確保您獲得最新版本的'A' – Houseman