2015-06-28 32 views
1

我有一個使用firebase和node.js的聊天應用程序,通過在監控firebase存在的child_added和child_deleted事件的服務器上運行單個輔助線程來跟蹤狀態頻道,並相應地更新我們的狀態數據庫表。如何使用新的firebase隊列構建狀態系統

我的問題是 - 現在火力隊列存在https://www.firebase.com/blog/2015-05-15-introducing-firebase-queue.html

我可以使用隊列來代替,我已經在服務器上運行以監測存在和child_added事件的工作線程?看看當前的例子 - 它看起來像我會創建一個客戶端隊列的引用,然後設置斷開連接並連接事件從客戶端推入隊列?不過,我希望更安全一些,不要太依賴客戶。我還希望讓隊列通過將事件歸檔到第三方日誌記錄服務來處理事件 - 憑據或細節我不想公開給客戶端。

這是否意味着我仍然需要一個服務器端工作進程 - 如果有的話,這個用例的firebase隊列有什麼好處?

回答

4

Firebase隊列不是託管解決方案 - 您仍然需要在自己的服務器上運行它。

在單個偵聽器進程上使用隊列的主要優點是能夠爲相同任務運行多個工作人員,因此沒有單點故障。使用隊列可以知道工作進程是同步的,因此只有一個工作人員會在任何時間點處理任務,並且如果工人在處理過程中死亡或需要很長時間,另一個工作人員將再次撿起一次該任務已超時。

聽起來好像您正在嘗試爲存在創建某種審計線索,但目前無法直接從服務器報告存在 - 您需要在某個時刻依靠客戶端。您的安全規則可以強制執行write是否爲數據庫中特定位置的布爾值,但是在編寫時它們無法強制客戶端處於任何特定狀態。另外請注意,有沒有pushchildByAutoId相當於onDisconnect處理程序,所以要推到一個隊列,你不得不做這樣的事情:

var ref = new Firebase(…); 
var disconnectTask = {}; 
var pushId = ref.push().key(); // This just generates the ID and does no network traffic 
disconnectTask[pushId] = { /* populate with task data here */ }; 
ref.onDisconnect().update(disconnectTask); 

注意推ID將生成的客戶端發送的操作之前到服務器,因此任務在添加到隊列時不一定按順序排列。