PubNub或Pusher,并将数据存储在我自己的服务器上
PubNub or Pusher and storing data on my own server
>我有一个移动应用程序,用户可以通过聊天(仅限用户对用户,而不是聊天室)相互交谈。
今天,一切都是同步的。我们正在考虑将解决方案切换到更"实时"的解决方案,也许使用 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
作为有关如何完成的建议,请尝试下一件事:
- 在客户自己的频道上订阅客户
- 在某个具有常量名称的特殊频道上订阅服务器
- 如果客户端 A 想要向客户端 B 发送消息,则应将其发送到之前订阅的服务器通道中。也许您必须以特殊格式发送它,这将允许识别发件人和收件人。
- 服务器解析来自客户端 A 的格式化消息,并将其发送到通道 B 订阅的通道中。
所以基本上服务器只在一个频道上订阅并从中接收消息,解析并发送到收件人的频道(您不必订阅要发送消息的频道)。
- 如何将 screen.width 值替换为我自己定义的值
- 具有自己数据源的可重用成员组件
- 需要创建一个函数,将我自己创建的范围对象转换为字符串
- 这个网页应该有一个柠檬掉落和弹跳,但我发现自己犯了错误,我找不到它们
- 为什么像angular这样的项目有自己版本的通用函数
- Grunt.js:我如何自己规范文件,就像Grunt那样
- 在 Javascript 中创建具有自己属性的对象数组
- 从 2 个得分最高的节点列表中获取 3 个节点(我自己设置的属性)
- 如何使用LinkedIn Javascript API作为我自己网站的登录名
- 跨源 - 带有来自自己域的图像的黑色纹理
- 我自己网站的内容管理系统
- 设计:为什么JavaScript有单独的Function和Object对象,以及为什么它们有自己单独的原型对象
- 组合已经具有自己属性的方法(使用原型属性)
- 在自己编写的Javascript日历中更改年份
- 使用嵌入自己网站的小工具从Soundcloud获取歌曲
- 我如何才能在Angular.js中自己定义的服务上获得拦截器的响应
- 我怎样才能调用与自己不同的Node.js脚本呢
- 我如何在我的网站上使用我自己定制的Sharethis图片和Sharethis插件
- 为什么我自己做的下拉列表不能在ie7中工作
- 只有当用户点击我的“;是”;我自己对话的链接