5

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

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

鉴于我们的服务器需要存储每条发送的消息,我们想知道最好的方法。

我们的想法:

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

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

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

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

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

我没有看到更好的方法来做到这一点。

4

2 回答 2

4

带有消息历史记录的 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

休息请求

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

于 2013-11-06T23:24:51.653 回答
3

作为有关如何完成的建议,请尝试下一件事:

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

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

于 2013-11-06T23:07:09.957 回答