网络上大多数关于WebSockets的文章都是关于内存聊天的
我对那种不那么即时的聊天感兴趣,这种聊天是持久的,就像博客文章的评论。
我有一个由两个服务器组成的集群来处理客户端请求
我想知道处理将数据库更新推送到相应客户端的最佳策略是什么。
当我使用Heroku来处理这个集群(由2个网络dynos组成)时,我显然阅读了本教程,旨在构建一个在所有客户端之间共享的聊天室。
它使用Redis来集中即将到来的消息;每个服务器都在侦听通过websocket连接传播到web客户端的新消息。
我的用例不同之处在于,我有一个Neo4j数据库,将任何客户端编写的每条消息都保存在其中
我的目标是通知来自特定房间的每个客户,新的消息/评论刚刚被客户持久化。
使用类似于上面链接的教程的体系结构,我如何只过滤新消息来传播给用户?有没有一种简单有效的方法告诉Redis:
"(WebSocket说)当我的客户端启动WebSocket连接时,我会仔细查询所有保留的消息并将其发送给客户端,但我希望您(Redis)向我提供我没有发送给客户端的所有新消息,以便我能够提供它们。"
如何防止Redis在每次连接websocket时发布整个会话?这将导致重复,因为数据库查询目前已经提供了现有内容。
这实际上是一个非常常见的场景,其中有三个组件:
- 一个无状态web服务器集群,用于维护与所有客户端的开放连接(显然,整个集群的负载平衡)
- 持久的主数据存储-Neo4j
- 消息传递/排队后端,用于跨通道(从而跨服务器集群)广播消息-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)
确切的实现实际上取决于您的环境,但这是一般的流程。