Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Heroku WebSocket推送数据库更新_Heroku_Architecture_Websocket_Redis_Playframework 2.2 - Fatal编程技术网

Heroku 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客户端的每个服务器 我的用例的不同之处在于,我有

web上大多数关于WebSocket的文章都是关于内存聊天的。
我感兴趣的是一种不那么即时的聊天,它是持久的,就像博客上的评论一样

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

当我使用Heroku来处理这个集群(由两个web dyno组成)时,我显然读到了旨在构建一个在所有客户端之间共享的聊天室的文章

它使用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)
    

    确切的实现实际上取决于您的环境,但这是一般的流程。

    但是这些新事件会永久存储在消息队列中吗?用户第二次连接时,是否会在启动侦听器后立即接收旧事件?这些老事件在第一次时是“新的”。我不知道你在问什么。如果您永久存储这些消息,那么是的,用户将收到它们,就像任何其他新用户一样。User1初始化websocket连接。正如您所写的,对Neo4j进行查询以检索所有当前数据。假设它返回MessageA和MessageB。然后,为了实时获取下一条消息,需要订阅Redis频道,以便获取未来的MessageC。User1断开连接,然后重新连接..该过程再次重新启动:MessageA、B和C从Neo4j检索,但Redis也会返回MessageC(因为之前一直保存在Redis中),导致MessageC重复。我错了吗?@Mik378这取决于你如何使用Redis。我假设您只想将其用于消息传递(请参阅),因此您只会收到新消息的通知。除非您专门将Redis用作保存消息的数据存储,否则您将不会收到旧消息。啊!!太棒了:)我还从来没有使用过Redis,所以我真的认为它主要是一个数据存储和一个“奖金”,一个消息。作为一个消息传递者当然会成功。非常感谢:)我要试试这个!当然,你的答案是正确的。