使用 ActionCable 可靠地实现在线状态

Reliably implement presence status with ActionCable

我已经使用 ActionCable 实现了聊天功能。我现在正在尝试根据 README 中用户外观的实现来实现存在状态。

本文档提及以下声明:

The #subscribed callback is invoked when, as we'll show below, a client-side subscription is initiated. In this case, we take that opportunity to say "the current user has indeed appeared". That appear/disappear API could be backed by Redis or a database or whatever else.

我可以在我的数据库中实现在线属性,并在应用程序收到 appear/disappear 通知时更新它。但是我不能保证这个属性的可靠性。例如,如果服务器出现故障,它可能会变得不同步。

我怎样才能以可靠的方式实现它?

放在一个Redis结构中,在一定时间内过期(使用TTL)。如果您将它存储在某处无限长的时间(如数据库),它可能会不同步。您可能会争辩说您可以在应用程序启动时将所有用户存在设置为 false,但这只会在您 运行 多个服务器或工作人员之前有效。当用户连接时:每隔几分钟将此用户的存在值插入 Redis。还处理连接关闭事件以从 Redis 中删除用户状态,以实现比几分钟更高的准确性。