1

我正在使用 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可以保存NOTIFICATIONSid 并防止收到重复的消息。

也许创建一个访客锁定规则,例如:

  "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都得到通知时将其删除:) 是的,这很有趣 :)

在这一点上,这都是理论上的,我正在阅读战利品,所以希望对此有所了解?

4

0 回答 0