【问题标题】:PubNub or Pusher and storing data on my own serverPubNub 或 Pusher 并将数据存储在我自己的服务器上
【发布时间】:2013-11-18 08:42:51
【问题描述】:

我有一个移动应用程序,用户可以在其中通过聊天(仅限用户对用户,而不是聊天室)相互交谈。

今天,一切都是同步的。我们正在考虑将解决方案切换为更“实时”的解决方案,可能使用 PubNub 或 Pusher。

鉴于我们的服务器需要存储每条发送的消息,我们正在考虑最好的方法。

我们的想法:

  • 每个移动应用都会使用用户 ID 作为频道名称来创建频道。
  • 此通道将用于移动应用程序/服务器通信。

我的问题是关于服务器的,今天我们有一个 Nginx/PHP 后端。我们希望我们的服务器能够监听所有用户频道,因为我们需要将用户发送的消息存储在我们自己的服务器上。

对于用户到用户的通信,我们正在考虑在消息中创建我们自己的协议。例如。如果用户 111 想向用户 222 发送“hello”,他可以发布“to:222 hello”,这将由服务器检索。

服务器收到此命令后会将“from:111 hello”推送到自己的频道(即 222)。

我看到这种设计的问题是,我们的服务器需要打开与数据库中的用户总数一样多的频道。

我没有找到更好的方法。

【问题讨论】:

  • 可能是为在线用户开放渠道,并检查用户是否在场发布消息,然后您可以发送或存储消息到db,有很多处理方法。

标签: javascript node.js pusher pubnub


【解决方案1】:

PubNub 聊天与消息历史记录

好消息:您可以轻松编写一个聊天应用程序,为每个用户分配许多不同的频道,还可以使用 PubNub 的实时网络 - 全球分布式高可用性 - 存储服务保存消息历史记录。使用此服务,您可以从最近的数据中心有选择地将消息直接加载到移动/Web 客户端设备上,以获取过去的消息历史记录,而且您也可以使用存储检索 API 将消息加载到您自己的服务器中。让我们看看它如何与以下聊天应用一起使用:

Chat with History JavaScript 源代码

订阅您的 USER_ID 频道名称,以便接收来自其他用户的消息。还可以从以前的聊天中加载历史记录。

<script src="https://cdn.pubnub.com/pubnub.min.js"></script>
<script>(function(){

// INIT
var channel = 'USER_ID-123456';
var pubnub  = PUBNUB.init({
    subscribe_key : 'demo',
    publish_key   : 'demo'
});

// CHAT MESSAGE RECEIVER
function chat(message) {
    // process chat message here...
}

// LOAD HISTORICAL MESSAGES
pubnub.history({
    channel  : channel, // USER_ID Channel
    limit    : 50,      // Load Last 50 Messages
    callback : function(msgs) { pubnub.each( msgs[0], chat ) }
});

// PUBNUB REAL-TIME NETWORK HA-TCP STREAM CONNECTION
// FOR RECEIVING INCOMING CHAT MESSAGES
pubnub.subscribe({
    channel  : channel, // USER_ID Channel
    connect  : connect, // Connected - Ready to Receive Messages
    callback : chat     // Callback Processor
});

})();</script>

这是移动/网络客户端应用程序上的聊天应用程序的基础知识。现在,您可以轻松地向全球提供商加载/保存消息。接下来,您需要使用 PubNub REST 接口从 PHP 将这些消息加载到您的服务器上。

在 PHP 后端通过 REST API 加载存储的消息

您将使用 REST 接口根据需要从 PHP 后端服务器收集以前发布的消息。您实际上可能不需要此步骤,因为数据存储在 PubNub 的全球实时网络上,您的消息在该网络中被复制到许多地理区域以实现可靠性和高读/写性能。

PubNub 存储/历史 V2 REST API 文档 - https://gist.github.com/stephenlb/d53f4cc3a891c03b478e

REST 请求

http://pubsub.pubnub.com/v2/history/sub-key/demo/channel/my_channel?count=5

REST 响应

[["Pub1","Pub2","Pub3","Pub4","Pub5"],13406746729185766,13406746845892666]

您还可以使用 PubNub PHP SDK 来帮助解决一些复杂问题。您可以在此处找到 PubNub PHP SDK:https://github.com/pubnub/php 并使用此示例加载历史记录:

<?php
$pubnub = new Pubnub(
    "demo",  ## PUBLISH_KEY
    "demo",  ## SUBSCRIBE_KEY
    "",      ## SECRET_KEY
    false    ## SSL_ON?
);

$history_data = $pubnub->history(array(
    'channel' => $channel,
    'count'   => 100,
    'end'     => "13466530169226760"
));
?>

有关 PubNub 上的存储 REST API 的更多详细信息

请点击此链接以进一步深入了解 PubNub 存储 API:https://gist.github.com/stephenlb/d53f4cc3a891c03b478e - 本指南将帮助解答有关存储 REST API 的更多详细信息。

更多使用历史的完整 GUI 聊天客户端

以下是帮助您入门的群聊,它是使用 Bootstrap CSS 框架编写的 - https://github.com/pubnub/real-time-stocks/#simple-embedded-chat-application

【讨论】:

  • 非常感谢您的详细回复。关于我们自己服务器上的存储,我们实际上需要它,因为我们对它们进行了一些处理,这需要在本地完成。另一件事是我认为我已经读过 PubNub 在每个频道的存储历史记录方面有限制,并且在时间上也有限制。所以这意味着我们真的需要将它们存储在我们的服务器上。在那种情况下,我认为我们可以有一个常规的服务器端,它会定期从频道下载消息。你有什么想法?
  • 存储是无限的。您可以随时下载所有消息的转储。 gist.github.com/stephenlb/d53f4cc3a891c03b478e - 本指南将帮助解答有关存储 REST API 的更多详细信息。
  • @PubNub 下载所有消息转储的最简单方法是什么?
  • 嗨@DataGreed,您将需要编写一个循环,对频道中的所有消息进行分页。 gist.github.com/stephenlb/4f0aab24f1fc5cf250bef0d18f4322c4 请注意,您必须知道您的频道名称是什么。如果您不知道您的频道名称是什么,那么您将无法获取数据!稍后我们还将为此创建一个新方法。
  • @PubNub 谢谢。有没有图书馆?我记得那天写循环,因为分页机制是如何实现的,所以有点痛苦
【解决方案2】:

关于如何完成的建议,请尝试下一个操作:

  1. 在自己的频道上订阅客户
  2. 使用常量名称订阅某些特殊频道上的服务器
  3. 如果客户端 A 想要向客户端 B 发送消息,它应该将消息发送到服务器之前订阅的频道。也许您必须以特殊格式发送,以便识别发件人和收件人。
  4. 服务器解析来自客户端A的格式化消息,并将其发送到频道B订阅的频道。

所以基本上服务器只订阅一个频道并从中接收消息,解析并发送到收件人的频道(您不必订阅要发送消息的频道)。

【讨论】:

  • 感谢月光。听起来是个好主意。我想这是我们要尝试的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-13
  • 1970-01-01
  • 2012-03-20
  • 1970-01-01
  • 2018-01-31
  • 1970-01-01
相关资源
最近更新 更多