实时pubsub通过websockets与历史聊天

时间:2015-09-16 07:19:27

标签: javascript nginx websocket redis chat

我有兴趣创建Disqus对其评论系统所做的工作:http://highscalability.com/blog/2014/5/7/update-on-disqus-its-still-about-realtime-but-go-demolishes.html

基础设施中最令人印象深刻的部分是Nginx推送流模块:

  

仍在5台Nginx机器上运行。

     

使用NginxPushStream,它支持EventSource,WebSocket,Long   轮询和永远的iframe。

     

所有用户都已连接到这些计算机。

     

在正常的一天,每台机器看到3200个连接/秒,100万个   连接,150K包/ s TX和130K包/ s RX,150 mbits / s TX   和80 mbits / s RC,端到端延迟<15ms(比...更快)   Javascript可以发表评论)

     

首先出现资源耗尽的许多问题。配置   为Nginx和OS提供帮助缓解问题,   调整它们以处理具有许多连接移动的场景   数据

显然这个Nginx模块不支持数据存储。只有 push_stream_store_messages 指令支持的内存机制,但as author said

  

存储邮件的主要目标是将邮件传递给   邮件发布时处于脱机状态的订阅者。

很明显,Disqus不会直接向Nginx发布消息,而是通过Go后端设法在Redis中存储消息,然后通过内部POST发布到Nginx,从而保留订阅者。

在我们使用推送流模块获取新消息之前,是否有人有过在页面加载时通过Redis获取消息历史记录的经验?您是否必须一次性推送旧邮件历史记录或以纯HTML格式呈现,然后将pubsub用于加载页面后出现的新邮件?

逻辑需要尽可能地解耦。我不打算在用户和Nginx之间引入阻止机制来进行实时消息通信。这会是一个很好的解决方案吗?

  1. 客户端从网页(通过websockets)推送消息
  2. Ajax请求直接推送流位置和Ajax完全回调它请求后端在Redis中存储消息(在另一个方向它被后端锁定)
  3. 用户刷新后,页面后端将获取Redis列表并显示历史记录
  4. 用户可以查看历史记录并发布新消息
  5. 只需要开发2个后端请求:接受消息并在Redis中存储,获取数据并在页面加载时显示。最好是需要轻型非阻塞后端,如Lua module甚至是Redis的HTTP接口,称为Webdis

    我想从架构的角度了解智能人对该机制的看法,没有预期的代码示例。

0 个答案:

没有答案