postgresql - 如何处理服务器崩溃时依赖于 WebSocket 的数据?

标签 postgresql websocket socket.io

我正在使用 postgres 数据库来维护房间列表和连接到每个房间的用户。
用户可以随时进入房间,但关闭浏览器时应离开房间。
一个好的事件流应该是

User enters room (user's room var is set) -> ... -> User disconnects and server notices (user's room var is unset)


但如果发生这种情况怎么办?

User enters room (user's room var is set) -> ... -> Server crashes or shuts down for updates -> User disconnects and server doesn't notice (user's room var is still set) -> Server is back on


在最后一种情况下,数据库状态已经损坏。处理这样的事情的最佳方法是什么?谢谢

最佳答案

我们把答案分成2个方面:
用户方面:
无论手头使用哪种语言,您都应该使用 Socket 事件/异常处理来了解断开连接事件。
如果服务器崩溃,您的用户将遇到突然的套接字断开/连接关闭/ session 终止,具体取决于您使用的框架。 TCP 套接字也有 keepalive ( SO_KEEPALIVE ) 正是为此(您通常可以从高级协议(protocol)控制这些(或类似)设置。
因此,在这种情况下,您需要做的就是在用户端运行维护代码(在您描述的情况下取消设置变量)
服务器方面:
这里有点棘手。您基本上要寻找的是短暂的状态管理,这意味着能够对突然的服务/服务器终止(服务器崩溃导致损坏/不干净的状态)使用react,并在它们之后进行清理
为此,存在 Zookeeper 或 Consul 等技术。我个人推荐 Zookeeper,因为我过去曾多次在它的基础上构建过类似的解决方案。
例如,使用 zookeeper,当您的服务器启动时,它可以创建一个 EPHEMERAL节点。该节点将在服务器启动后创建,并且只要服务器处于事件状态并连接到 Zookeeper 集群,该节点就会一直存在。如果服务器意外崩溃,则删除此节点。
然后,您可以拥有一个单独的应用程序/脚本来监听该 zk 节点/路径上的事件。如果它突然被删除,您可以在数据库上运行一个清理例程。
这种方法当然支持多个应用程序实例 - 您可以监听路径下的事件,并使用其下的不同节点注册所有服务器实例。删除的节点可以包含特定于实例的标识符,您可以使用这些标识符从数据库中清除特定的实例状态。
将清理/维护任务转移到单独的组件上也是一个明智的选择
(注意 ZooKeeper 在处理连接/状态事件时需要特别注意)
Some additional Zookeeper reading material
最后的想法:
当然,可以根据问题中未提出的特定需求对答案进行微调。
在构建复杂的、有状态的解决方案时,我个人的目标是处理解决方案所有端的崩溃,尽可能地“安全”

关于postgresql - 如何处理服务器崩溃时依赖于 WebSocket 的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69193473/

相关文章:

javascript - 将 socket.io-client 与 webpack 一起使用时未定义全局

python - 使用 LIKE 子句的 Psycopg2 SQL 注入(inject)安全性

sql - 类似 Twitter 的帖子时间轴的数据库结构和查询

javascript - 当用户与 Node.js 服务器断开连接时删除数组项

php - 暂停恢复客户端-服务器文件上传

javascript - C# UWP 中的发射格式

node.js - 如何将坐标从 node.js 服务器发送到 leaflet.js 客户端

postgresql - Docker 上的 Postgres。如何创建数据库和用户?

sql - 使用模式匹配字符的 postgresql 替换函数

node.js - 在azure上socket.io传输是 'polling'而不是 'websocket'