包含存储的Pubnub聊天应用程序

时间:2015-06-16 12:55:34

标签: parse-platform push-notification chat real-time pubnub

我正在寻找与Pubnub开发聊天应用程序,我想确保发送的所有聊天消息都存储在数据库中,并且还希望在聊天中发送消息。

我发现我可以使用Parse和pubnub来提供存储选项,但我不确定如何以聊天中发送的消息和图像存储在数据库中的方式设置这两个选项。

之前有人用pubnub和parse做过这个吗?有没有其他简单的选项可用于pubnub而不是使用解析?

1 个答案:

答案 0 :(得分:3)

Sutha,

除非您谈论的是有限数量的最终用户,否则您所寻求的并不是一个简单的解决方案。所以我不会说没有" easy"解决方案,但有解决方案。

原因是您的服务器需要监听(订阅)每个活动的聊天频道并将发送的消息存储到您的数据库中。想象一下,你的应用程序可以扩展到100万用户(甚至不需要那么大,但是这个数字应该可以帮助你意识到如何在几个服务器实例以非重叠方式监听通道的情况下进行扩展重叠,但使用服务器队列实现和重复删除消息)。

那就是说,是的,有PubNub客户已经实施了这样的解决方案 - 顺便说一下,Parse并不是实现这一目标的关键。

实现此目的有三个基本选项:

  1. 实施一个解决方案,允许服务器的许多实例在它们变为活动状态时订阅所有频道,并在消息进入时存储它们。有很多细节可以实现这一点,所以如果你如果没有达到这个目的,那么你不太可能去。

  2. 有一种方法可以使用PubNub Presence webhooks监控所有处于活动或非活动状态的频道(在按键上启用Presence)。您可以使用此列表来保存服务器用于从按需(非完全实时)方式提取历史记录(在密钥上启用Storage & Playback)的所有通道的列表。

  3. 对于每个活动或非活动的通道,您的服务器将通过REST调用(以及您在服务器上实现的端点 - 在这种情况下为您的Parse服务器)接收这些事件:

    • 频道有效:录制"开始聊天"你的Parse db中的timetoken
    • 频道无效:记录"结束聊天"你的Parse db中的timetoken
    • 非活动事件是一个进程的启动,该进程使用您为该频道录制的开始/结束时间段来从PubNub获取频道的历史记录:pubnub.history({channel: channelName, start:startTT, end:endTT})
    • 您需要iterate on this history致电,直到收到< 100条消息(100条是您一次可以检索的最大消息数)
    • 当您检索这些消息时,您将把它们保存到Parse db

    添加了新的Presence Webhooks We now have webhooks for all presence events: join, leave, timeout, state-change

    1. 最后,您可以在每次pubnub.publish调用成功时将每条消息保存到Parse db。我不是Parse专家,几乎不知道它的所有功能,但我相信他们有一些或存储本地然后同步到云数据库选项(如同产品时的StackMob),但即使没有,你将把msg保存到Parse cloud db直接。
    2. 在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。 :)