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