Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.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
Clojure中的可扩展聊天服务器。存在问题和消息到达b/w重新连接_Clojure_Websocket_Chat_Long Polling_Http Kit - Fatal编程技术网

Clojure中的可扩展聊天服务器。存在问题和消息到达b/w重新连接

Clojure中的可扩展聊天服务器。存在问题和消息到达b/w重新连接,clojure,websocket,chat,long-polling,http-kit,Clojure,Websocket,Chat,Long Polling,Http Kit,我正在尝试在Clojure中构建一个可伸缩的聊天服务器。我使用http工具包、compojure和redis pub/sub在不同节点之间进行通信(扇出方法)。服务器将使用WebSocket与客户端服务器进行连接,并返回到长轮询。一个用户可以有多个连接来聊天,浏览器中的每个选项卡都有一个连接,所有连接都应向用户发送消息 因此,基本上,当用户连接时,我将通道存储在原子中,并使用随机uuid作为 {:userid1 [{:socketuuid "random uuid#1 for uerid1" :

我正在尝试在Clojure中构建一个可伸缩的聊天服务器。我使用http工具包、compojure和redis pub/sub在不同节点之间进行通信(扇出方法)。服务器将使用WebSocket与客户端服务器进行连接,并返回到长轮询。一个用户可以有多个连接来聊天,浏览器中的每个选项卡都有一个连接,所有连接都应向用户发送消息

因此,基本上,当用户连接时,我将通道存储在原子中,并使用随机uuid作为

{:userid1 [{:socketuuid "random uuid#1 for uerid1" :socket "channel#1 for userid1"}
          {:socketuuid "random uuid#2" :socket "channel#2"}]
:userid2 [{:socketuuid "random uuid#1 for userid2" :socket "channel#1 for userid2}]}
消息被发布到WebSocket和长轮询通道的公共路由,消息结构如下所示

{:from "userid1" :to "userid2" :message "message content"}
服务器为:from和:to用户ID查找atom中的所有通道,并将消息发送到相应用户的连接通道,还通过redis服务器发布消息,其中连接的节点查找存储在自己atom中的通道,并将消息传递给相应用户

所以我遇到的问题是,如何正确地实现存在。基本上,http kit会在通道断开连接时向您发送状态。状态可以是“服务器关闭”或“客户端关闭”,而我可以处理服务器断开连接(客户端将自动重新连接),但当从客户端断开连接时,我遇到了问题,例如,用户导航到另一个页面,几秒钟后就会连接。当客户端断开连接时,如何确定用户已脱机。此外,我还担心长轮询模式下的消息到达b/w重新连接(我的长轮询超时为30秒)

另外,请为上述架构提供一个良好的呈现机制。谢谢

如果您需要更多信息,请发表评论。谢谢

编辑#1:

你能推荐一个关于在聊天服务器中实现状态的好教程/材料吗?我似乎找不到任何关于它的内容

我的当前解决方案->我当前正在维护一个全局计数和一个特定用户ID的已连接通道的最后连接时间戳,当用户断开连接时,计数会减少,并执行一个超时10秒,该超时将检查用户是否重新连接(即最后一个连接的戳记为10秒,计数仍然为零),如果不是,则表示用户已脱机,您是否推荐此解决方案,如果不是,原因是什么,或者欢迎任何改进或更好的方法。
另外请注意,我正在使用http工具包中的计时器/计划任务,这些超时是否会对性能产生显著影响?

客户端有两种不同的情况

  • 长轮询。我看不出这是个什么问题,如果客户端窗口关闭,将不再有轮询。少一个客户端请求数据
  • WebSocket。协议中有一个close方法可用。如果您正确实现了它,客户端应该发送一个通知。请参阅此处:例如

  • 这回答了您的问题吗?

    谢谢您的回答。是的,您的回答简化了问题。请查看编辑后的问题以了解后续问题。谢谢。我无法对性能或最佳做法发表评论,我所做的只是实现了您刚才描述的内容。但是,我刚刚看到了一则公告:这可能是我们我想这对你来说很有意义。也许它有一个通用的“客户端断开连接”方法用于长轮询和websocket连接。