我正在使用 Firebase 创建这个聊天应用程序。我想创建一个系统,每个安装了聊天应用程序的设备都负责传递聊天消息。
即使设备没有发送消息,它也会在发送聊天消息的工作人员池中发挥作用。
现在对于普通的聊天应用程序,创建聊天消息的设备可以使用例如OneSignal轻松发送消息。
在我的情况下,用户可以与抽象的事物聊天,并且可以有很多人在收听新的聊天消息。一个正在发送,1000+ 正在收听。
这就是问题所在。如果一个设备负责通知 1000 多个其他设备,它的负载可能会非常沉重。我在想所有其他设备都可以帮助交付,
所以我正在尝试这个 Firebase 数据库通知条目:
{
"NOTIFICATIONS" : {
"-Kg4_cnR9T8Efx77rL2n" : {
"targetId" : "-KfpVVenyQccKqAxxrvE",
"text1" : "There´s a message for you",
"text2" : "Pluto",
"text3" : "",
"time" : 1490447404504,
"type" : "chatMessage"
},
"-Kg4_eWQFZndhztPqSTp" : {
"targetId" : "-KfpWz7ZWBAa_8pLM7tI",
"text1" : "There´s a message for you",
"text2" : "Saturnus",
"text3" : "",
"time" : 1490447411536,
"type" : "chatMessage"
}
}
}
当一个设备正在创建一条消息时,它会发布这条新消息NOTIFICATIONS
,所有正在收听的设备都会接收到该消息。
现在,由于所有设备都在监听NOTIFICATIONS
并且会抓住一个NOTIFICATIONS
并发送聊天消息,targetId
因此问题显然会出现在所有其他注册的设备上。
这里是TARGET_VISITORS
。这是注册新聊天消息的用户。
{
"TARGET_VISITORS" : {
"-KfpVVenyQccKqAxxrvE" : {
"HnhLyXRxUINmlltK3jdsfxx2QBYiQ53" : {
"notify" : true,
"time" : 1490300590623,
"userFirebaseId" : "HnhLyXRxUINmlltK3jdsfxx2QBYiQ53"
}
},
"-KfpWz7ZWBAa_8pLM7tI" : {
"HnhLrryXUINmlltK3jdsfxx2QBYi3455" : {
"notify" : true,
"time" : 1490300581677,
"userFirebaseId" : "HnhLrryXUINmlltK3jdsfxx2QBYi3455"
}
}
我可以为此 使用 Firebase事务吗?
就像一个设备拿起一个NOTIFICATIONS
然后可能得到 10 个TARGET_VISITORS
(可能有 1000 个以上),并且在一个 Firebase 事务中锁定TARGET_VISITORS
以执行他的 userFirebaseId 或OneSignal PlayerId 上的聊天消息传递。
之后,TARGET_VISITORS
可以保存NOTIFICATIONS
id 并防止收到重复的消息。
也许创建一个访客锁定规则,例如:
"TARGET_VISITORS_LOCK": {
".read": "auth != null",
"$FirebaseId": {
// This need to be a final entity.
// we can write as long as old data or new data does not exist.
// In other words, we can write if we're deleting or creating data, but not updating data.
".write": "!data.exists() || !newData.exists() && auth != null"
}
},
updateChildren
然后在上运行数据扇出TARGET_VISITORS_LOCK
,如果失败,则意味着其他设备正在运行updateChildren
,并将通知发送到单个设备。如果设备处于离线状态,她会怎样?
工人池中的许多设备可以NOTIFICATIONS
尝试发送相同的设备,他们会争吵TARGET_VISITORS
,可以这么说
然后是知道何时删除NOTIFICATIONS
条目的问题,当所有人TARGET_VISITORS
都得到通知时将其删除:) 是的,这很有趣 :)
在这一点上,这都是理论上的,我正在阅读战利品,所以希望对此有所了解?