Heroku WebSocket推送数据库更新
web上大多数关于WebSocket的文章都是关于内存聊天的。Heroku WebSocket推送数据库更新,heroku,architecture,websocket,redis,playframework-2.2,Heroku,Architecture,Websocket,Redis,Playframework 2.2,web上大多数关于WebSocket的文章都是关于内存聊天的。 我感兴趣的是一种不那么即时的聊天,它是持久的,就像博客上的评论一样 我有一个由两台服务器组成的集群来处理客户端请求。 我想知道处理将数据库更新推送到相应客户机的最佳策略是什么 当我使用Heroku来处理这个集群(由两个web dyno组成)时,我显然读到了旨在构建一个在所有客户端之间共享的聊天室的文章 它使用Redis来集中发送的消息;侦听新消息以通过websocket连接传播到web客户端的每个服务器 我的用例的不同之处在于,我有
我感兴趣的是一种不那么即时的聊天,它是持久的,就像博客上的评论一样 我有一个由两台服务器组成的集群来处理客户端请求。
我想知道处理将数据库更新推送到相应客户机的最佳策略是什么 当我使用Heroku来处理这个集群(由两个web dyno组成)时,我显然读到了旨在构建一个在所有客户端之间共享的聊天室的文章 它使用Redis来集中发送的消息;侦听新消息以通过websocket连接传播到web客户端的每个服务器 我的用例的不同之处在于,我有一个Neo4j数据库,将任何客户端编写的每条消息都保存在其中。
我的目标是通知特定房间中的每个客户机,客户机刚刚保存了一条新消息/注释 使用类似于上面链接的教程的体系结构,我如何只过滤要传播给用户的新消息?有没有一种简单有效的方法告诉Redis: “(WebSocket说)当我的客户端启动WebSocket连接时,我会小心地查询所有持久化的消息并将它们发送给客户端,但是我希望您(Redis)向我提供我没有发送给客户端的所有新消息,以便我能够提供它们。”
如何防止Redis在每次建立websocket连接时发布整个对话?这将导致重复,因为数据库查询目前已经提供了现有内容。这实际上是一个非常常见的场景,其中有三个组件:
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)
确切的实现实际上取决于您的环境,但这是一般的流程。但是这些新事件会永久存储在消息队列中吗?用户第二次连接时,是否会在启动侦听器后立即接收旧事件?这些老事件在第一次时是“新的”。我不知道你在问什么。如果您永久存储这些消息,那么是的,用户将收到它们,就像任何其他新用户一样。User1初始化websocket连接。正如您所写的,对Neo4j进行查询以检索所有当前数据。假设它返回MessageA和MessageB。然后,为了实时获取下一条消息,需要订阅Redis频道,以便获取未来的MessageC。User1断开连接,然后重新连接..该过程再次重新启动:MessageA、B和C从Neo4j检索,但Redis也会返回MessageC(因为之前一直保存在Redis中),导致MessageC重复。我错了吗?@Mik378这取决于你如何使用Redis。我假设您只想将其用于消息传递(请参阅),因此您只会收到新消息的通知。除非您专门将Redis用作保存消息的数据存储,否则您将不会收到旧消息。啊!!太棒了:)我还从来没有使用过Redis,所以我真的认为它主要是一个数据存储和一个“奖金”,一个消息。作为一个消息传递者当然会成功。非常感谢:)我要试试这个!当然,你的答案是正确的。