PubNub或Pusher,并将数据存储在我自己的服务器上

PubNub or Pusher and storing data on my own server

本文关键字:我自己 自己的 服务器 存储 数据 Pusher PubNub      更新时间:2023-09-26

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

今天,一切都是同步的。我们正在考虑将解决方案切换到更"实时"的解决方案,也许使用 PubNub 或 Pusher。

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

我们的想法:

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

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

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

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

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

我没有看到更好的方法。

PubNub Chat with Message History

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

与历史聊天 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>

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

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

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

PubNub Storage/History V2 REST API Doc - https://gist.github.com/stephenlb/d53f4cc3a891c03b478e

休息请求

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

休息响应

[["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 Storage API: https://gist.github.com/stephenlb/d53f4cc3a891c03b478e - 本指南将帮助回答有关存储 REST API 的其他详细信息。

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

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

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

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

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