gpt4 book ai didi

clojure - Clojure 中的可扩展聊天服务器。存在和消息到达黑白重新连接的问题

转载 作者:行者123 更新时间:2023-12-01 23:59:32 26 4
gpt4 key购买 nike

我正尝试在 Clojure 中构建一个可扩展的聊天服务器。我正在使用 http-kit、compojure 和 redis pub/sub 在不同节点之间进行通信(扇出方法)。服务器将使用 websockets 连接 b/w 客户端-服务器,并回退到长轮询。单个用户可以有多个连接来聊天,浏览器中的每个选项卡都有一个连接,消息应该传送到所有连接。

所以基本上当用户连接时,我将 channel 存储在一个具有随机 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}]}

消息被发布到 websockets 和长轮询 channel 的公共(public)路由,消息结构如下所示

{:from "userid1" :to "userid2" :message "message content"}

服务器为 :from 和 :to 用户 ID 找到 atom 中的所有 channel ,并将消息发送到各个用户的已连接 channel ,它还通过连接节点查找 channel 的 Redis 服务器发布消息存储在他们自己的原子中,并将消息传递给各自的用户。

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

另外请为上述架构建议一个好的存在机制。谢谢。

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

编辑#1:

你能推荐一个关于在聊天服务器中实现状态的好的教程/ Material 吗,我似乎在上面找不到任何东西。

我当前的解决方案 -> 我目前正在为特定用户标识的已连接 channel 维护一个全局计数和上次连接时间戳,当用户断开连接时,计数会减少,并实现 10 秒的超时,这将检查是否用户再次重新连接(即上次连接的标记为 10 秒,计数仍为零),如果没有,则据说用户已离线,您会推荐此解决方案吗?如果不是,为什么,或任何改进或更好的方法受到赞赏。另请注意,我在 http-kit 中使用计时器/计划任务,这些超时是否会对性能产生重大影响?

最佳答案

客户端有两种不同的情况。

  1. 长轮询。我看不出这是怎么回事,如果客户端窗口关闭,将不再有轮询。少一个要求数据的客户。
  2. 网络套接字。协议(protocol)中有一个 close 方法可用。如果您正确实现,客户端应该发送通知。看这里:Closing WebSocket correctly (HTML5, Javascript)例如。

这是否回答了您的问题?

关于clojure - Clojure 中的可扩展聊天服务器。存在和消息到达黑白重新连接的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22147317/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com