google-cloud-firestore - 使用存储桶恢复聊天室
问题描述
首先,我想补充一点,虽然这是一个 Firestore 问题,但我愿意听取有关集成额外 Google 服务的建议。
系统
我的应用程序中有一个聊天功能。由于可能有一个非常不错的规模,我决定限制一个聊天组。聊天组不是由用户创建的,应该使用某种递增索引自动创建(例如:room_1、room_2、...、room_n)。
每个聊天组的限制为最多 100 个用户。因此,如果我有 100k 在线用户,我希望有 1k 个组(又名 n=1000)。
问题
- 如何在登录后将用户分配到聊天组?(假设策略是先填满当前房间,因此标题中的“桶”)
- 由于用户可以在不按“退出”之类的情况下关闭应用程序,因此我需要系统知道进行调整
解决方案
您可以在房间文档中添加一个计数器并使用FieldValue.increment增加/减少它,这是 Javascript 中的一个使用示例:
//when a user enter the room
db.collection('chat_rooms').doc('room_1').update({
userCount: firebase.firestore.FieldValue.increment(1)
});
//when a user quits the room
db.collection('chat_rooms').doc('room_1').update({
userCount: firebase.firestore.FieldValue.increment(-1)
});
由于FieldValue.increment()
获得了计数器的当前值,因此您无需担心比赛条件,这很好,因为您希望拥有大量用户,因此会不断更新。
您可以将其包裹在房间柜台的检查中,如果房间超过您为房间设置的用户限制,则可以开始填充新房间。
对于您的第二个问题,需要更多信息,但假设您使用的是 android,您可以使用此社区答案onAppBackgrounded
中提供的示例中的函数来调用更新,如果应用程序处于后台或关闭状态,该更新会减少聊天室文档中的计数器由用户,作为“强迫”他离开房间的一部分。
推荐阅读
- python - Python - 我尝试用scrapy抓取项目,但是图像链接没有抓取
- python - 如何导航到新的 url 而无需在 selenium 中打开新窗口(python)
- python - 使用 selenium python 从搜索栏中选择第一个元素
- html - 调整屏幕大小时 HTML/CSS 元素移动
- python - PyCharm 没有在编辑器中显示未解决的引用
- android-studio - Android Studio 不再记得“生成签名包或 APK”中的密码 (4.1)
- pine-script - 交易视图 | strategy.exit() 有单独的出口
- swift - SwiftUI 工作表在第一次呈现时被关闭
- arrays - 在 Swift 中选择动态数组中的元素而不重复
- c++ - 为什么在条件 !isdigit 为假的 while 循环中仍会读取并输出字符串的第一个数字?