2015-06-16 161 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作为结束参数(不是你可能假设的开始参数)来调用历史记录。让我知道如果这清除了。 –