2015-06-16 206 views
2

我期待與Pubnub開發一個聊天應用程序,我希望確保發送的所有聊天消息都存儲在數據庫中,並且還希望在聊天中發送消息。Pubnub聊天應用程序與存儲

我發現我可以使用Parse和pubnub來提供存儲選項,但我不知道如何設置這兩個聊天中發送的消息和圖像存儲在數據庫中的方式。

任何人都已經使用pubnub和parse來完成此操作嗎?是否有任何其他簡單的選項可用於使用pubnub而不是使用解析?

+1

Sutha,我不能說有任何「簡單」的解決方案,但解析可能會使這一點更容易。而且我們確實有客戶在不使用Parse的情況下做到這一點,但解決方案並非微不足道。我們會盡快回復一些指導。 –

+1

好的,我會等待你的迴應。我面臨的主要問題是保存通過聊天消息發送的數據和圖像。圖像將被上傳到服務器,鏈接將被髮送,但必須將這些信息存儲在消息中。 – Sutha

回答

3

Sutha,

你所求,除非你正在談論的最終用戶的數量有限,不是一個簡單的解決方案。所以我不會說沒有「簡單」的解決方案,但有解決方案。

原因是您的服務器需要監聽(訂閱)每個活動的聊天通道並將正在發送的消息存儲到數據庫中。想象一下,您的應用可以擴展到100萬用戶(甚至不需要那麼大,但是這個數字應該可以幫助您瞭解在多個服務器實例以非重疊方式或重疊方式監聽頻道的情況下,但使用服務器隊列實現和重複消息)。

也就是說,有的PubNub客戶已經實現了這樣的解決方案 - 順便說一下,解析不是實現這一點的關鍵。

你必須執行這一三種基本選擇:

  1. 實施一個解決方案,讓您的服務器的許多情況下訂閱所有通道,因爲他們變得活躍和存儲消息,因爲他們進來。有很多細節可以做到這一點,所以如果你不這樣做,那麼這不太可能在你想去的地方。

  2. 有一種方法可以監控所有通過PubNub Presence WebHooks啓用或禁用的通道(在您的密鑰上啓用Presence)。您可以使用它來保留您的服務器用來按需(不完全實時)按鈕提取歷史記錄(在您的密鑰上啓用Storage & Playback)的所有通道的列表。

對於進入每個通道活躍或不活躍,你的服務器將收到通過REST調用這些事件(和端點您在服務器上執行 - 在這種情況下,你的解析服務器):

  • 通道激活:記錄「開始聊天」 timetoken在您解析分貝
  • 通道不活動:記錄「結束聊天」 timetoken在您解析分貝
  • 無效事件是使用啓動過程中的開球/結束timetokens你記錄爲那個頻道得到hist從從PubNub通道ORY:pubnub.history({channel: channelName, start:startTT, end:endTT})
  • 你需要iterate on this history呼叫,直到收到< 100消息(100消息的最大數量,你可以同時檢索)
  • 爲您檢索這些信息,你會救他們您解析分貝

新進駐網絡掛接已添加: We now have webhooks for all presence events: join, leave, timeout, state-change

  1. 最後,您可以保存每封郵件,以解析每個pubnub.publish調用成功的數據庫。我不是Parse的專家,幾乎不知道它的所有功能,但我相信他們有一些排序或存儲本地然後同步到雲數據庫選項(如StackMob,當它是一個產品),但即使沒有,你會將msg保存到Parse直接雲數據庫。

在您的JavaScript客戶端(瀏覽器)中,代碼看起來像這樣(不完整,可能是錯誤,弄清楚或請求PubNub支持以獲取詳細信息)。

var pubnub = PUBNUB({ 
    publish_key : your_pub_key, 
    subscribe_key : your_sub_key 
}); 

var msg = ... // get the message form your UI text box or whatever 

pubnub.publish({ 
    // this is some variable you set up when you enter a chat room 
    channel: chat_channel, 
    message: msg 
    callback: function(event){ 
     // DISCLAIMER: code pulled from [Parse example][4] 
     // but there are some object creation details 
     // left out here and msg object is not 
     // fully fleshed out in this sample code 

     var ChatMessage = Parse.Object.extend("ChatMessage"); 
     var chatMsg = new ChatMessage(); 
     chatMsg.set("message", msg); 
     chatMsg.set("user", uuid); 
     chatMsg.set("channel", chat_channel); 
     chatMsg.set("timetoken", event[2]); 
     // this ChatMessage object can be 
     // whatever you want it to be 
     chatMsg.save(); 
    } 
    error: function (error) { 
     // Handle error here, like retry until success, for example 
     console.log(JSON.stringify(error)); 
    } 

}); 

你甚至可以只存儲整組的發佈(在通話的兩端)的基礎上的時間間隔,數發佈或總數據的大小,但要小心,因爲無論是用戶可以退出聊天和瀏覽器沒有通知,你將無法保存。所以每發佈保存可能是最好的做法,如果有點吵。

我希望你找到這些技術之一作爲開始正確方向的一種手段。有些細節遺漏了,所以我希望你會有跟進問題。

只是一些其他鏈接,可能會有所幫助:

我們有一個PubNub Parse SDK,太。 :)

+1

此外,您應該只使用PubNub API發佈指向上傳圖像的路徑(或url),並將實際圖像(可能在base64中)單獨存儲在Parse中。 –

+1

謝謝你們,它真的很有幫助。只有一個問題,關於通道活動和非活動REST API調用,是否有任何方法可以從最後一個活動會話之後的通道獲取僅新消息? – Sutha

+0

圖像路徑上的好點@girlie_mac(例如,使用Amazon S3進行圖像存儲)。 Sutha,是的,你只需要保持上次活動會話的時間記錄,並使用該timetoken作爲結束參數(不是你可能假設的開始參數)來調用歷史記錄。讓我知道如果這清除了。 –