2015-09-12 111 views
1

我正在開發一個聊天應用程序,並使用socket.io/node。基本上我想出了以下策略:在客戶端之間發送消息socket.io

  1. 發送來自客戶端的消息,然後由套接字服務器接收,然後發送給接收客戶端。在後臺上,如果用戶希望看到他以前的對話,則將它存儲到數據庫中的消息中以供稍後檢索。

這種方法的優點,用戶獲取信息幾乎是瞬間,因爲我們不能等待做數據庫操作完成,但CON是,如果DB操作失敗,正是客戶端刷新其頁面以獲取消息時,它不會得到該消息。

  1. 從客戶端發送消息到服務器,然後服務器將其存儲在數據庫中,然後只發送給接收客戶端。

利弊的是,我們要確保這條消息將接收到只有在其存儲在數據庫客戶端。 con是它將無法接近實時,因爲我們將在減緩消息傳遞之間進行數據庫操作。

  1. 向客戶端發送消息,然後將消息存儲在緩存層(例如redis)中,然後立即將其發送給接收客戶端。在後臺保持從redis獲取記錄並更新數據庫。如果客戶端刷新頁面,我們首先查看數據庫,然後查看redis層。

專業人員是我們使通信更快,並確保消息按需呈現正確。與上述實現相比,這是相當複雜的,我想知道是否有更簡單的方法來實現這一點?

我的問題是,如果你正在構建一個嚴格的聊天應用程序,確保兩者 - 更快的通信和數據持久性是什麼方式。像facebook,whatsapp等應用程序一樣的應用程序有什麼策略?我並不是在尋找確切的例子,但幾點提示會有所幫助。

謝謝。

回答

2

我會選擇號碼2.我一直在做我自己在節點聊天應用程序,我發現這是最好的選擇。在數據庫中保存需要幾毫秒,其中包括在數據庫中寫入0.x毫秒和通信中幾毫秒的延遲(https://blog.serverdensity.com/mongodb-benchmarks/)。

所以我會認爲這種方法是實時的。這樣做的好處在於,如果失敗,無論出於何種原因,都可以向發件人顯示失敗的消息。

Facebook,WhatsApp和許多其他大型消息應用程序都基於XMPP(jabber),它是一個非常非常大的即時消息傳遞協議,並且所有內容都有關於如何執行操作的很好的文檔,但它基於XML,所以你仍然需要解析所有的東西,但幸運的是,有很好的庫可以處理xmpp。所以如果你想採用通用的方式,那麼你可以使用XMPP,但是這個領域的大多數大牌手都沒有遵循所有的標準,因爲它沒有我們今天使用的所有功能。

如果你想我可以給你私下存取,我會自己動手做我自己的版本,其實我已經做了一些東西(類似於鬆弛)。

所以要結束這個,2號是要走的路(對我來說)。 XMPP很酷,但也帶來了很多複雜性。

相關問題