网络上关于 WebSockets 的大部分文章都是关于内存聊天的。
我对不太即时的聊天很感兴趣,它是持久的,就像博客帖子的评论一样。
我有一个由两台服务器组成的集群来处理客户端请求。
我想知道将数据库更新推送到相应客户端的最佳策略是什么。
当我使用 Heroku 来处理这个集群(2 个网络测功机)时,我显然阅读了 this tutorial旨在建立一个在所有客户之间共享的聊天室。
它使用 Redis 来集中接收消息;每个服务器监听新消息以通过 websocket 连接传播到 web 客户端。
我的用例不同之处在于我有一个 Neo4j 数据库,将任何客户端写入的每条消息保存到其中。
我的目标是从特定房间通知每个客户,客户刚刚保留了一条新消息/评论。
使用与上面链接的教程类似的架构,我如何才能只过滤新消息以传播给用户?有没有简单有效的方法告诉Redis:
”(WebSocket 说)当我的客户端启动 websocket 连接时,我注意查询所有持久消息并将它们发送给客户端,但是我希望你 (Redis) 向我提供所有新消息,我没有发送给客户,因此我将能够提供它们。”
如何防止 Redis 在每次建立 websocket 连接时发布整个对话?这会导致重复,因为数据库查询此时已经提供了现有内容。
最佳答案
这实际上是一个非常常见的场景,其中包含三个组件:
- 一个无状态网络服务器集群,与所有客户端保持开放连接(显然,负载在集群之间平衡)
- 持久的主数据存储 - Neo4j 在您的案例中
- 用于跨 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/