heroku - WebSocket 推送数据库更新

标签 heroku architecture websocket redis playframework-2.2

网络上关于 WebSockets 的大部分文章都是关于内存聊天的。
我对不太即时的聊天很感兴趣,它是持久的,就像博客帖子的评论一样。

我有一个由两台服务器组成的集群来处理客户端请求。
我想知道将数据库更新推送到相应客户端的最佳策略是什么。

当我使用 Heroku 来处理这个集群(2 个网络测功机)时,我显然阅读了 this tutorial旨在建立一个在所有客户之间共享的聊天室。

它使用 Redis 来集中接收消息;每个服务器监听新消息以通过 websocket 连接传播到 web 客户端。

我的用例不同之处在于我有一个 Neo4j 数据库,将任何客户端写入的每条消息保存到其中。
我的目标是从特定房间通知每个客户,客户刚刚保留了一条新消息/评论。

使用与上面链接的教程类似的架构,我如何才能只过滤新消息以传播给用户?有没有简单有效的方法告诉Redis:

”(WebSocket 说)当我的客户端启动 websocket 连接时,我注意查询所有持久消息并将它们发送给客户端,但是我希望你 (Redis) 向我提供所有新消息,我没有发送给客户,因此我将能够提供它们。”

如何防止 Redis 在每次建立 websocket 连接时发布整个对话?这会导致重复,因为数据库查询此时已经提供了现有内容。

最佳答案

这实际上是一个非常常见的场景,其中包含三个组件:

  1. 一个无状态网络服务器集群,与所有客户端保持开放连接(显然,负载在集群之间平衡)
  2. 持久的主数据存储 - Neo4j 在您的案例中
  3. 用于跨 channel (因此跨服务器集群)广播消息的消息传递/队列后端 - Redis

您的要求是让新客户接收最近消息的初始提要,以及实时接收任何后续消息。所有这些都在您的连接处理程序中实现。

本质上,这就是您的(伪)代码的样子:

class ConnectionHandler:

    redis = redis.get_connection()

    def on_init():
        self.send("hello, here are all the recent messages")
        recent_msgs = fetch_msgs_from_neo4j()
        self.send(recent_msgs)
        redis.add_listener(on_msg)
        self.send("now listening on new messages")

    def on_msg(msg):
        self.send("new message: ")
        self.send(msg)

具体的实现确实取决于您的环境,但这是一般的流程。

关于heroku - WebSocket 推送数据库更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23242890/

相关文章:

c# - 用户登录逻辑属于哪里?三层应用

node.js - WebSockets - 连接后在 ws/wss 之间切换?

javascript - 将 evt.data 从 websocket 转换为 jSON 字符串或 Javascript 中的纯字符串

ruby-on-rails-4 - Ruby on Rails 4 Heroku 应用程序在上传大尺寸视频时崩溃

mysql - Heroku 部署失败 MySQL rake 中止同一文件

html - 可组合和/或可插入的网站架构

c# - 对 2 个实体的操作 - 如何以及在哪里设计?

javascript - 是否可以在接收时识别网络套接字请求?

ruby-on-rails - Heroku 上的 Delayed_Job 显示 "Forbidden"错误

heroku - 在 Golang 应用程序中使用 Heroku Scheduler 附加组件