Как доставлять сообщения атомарно при использовании Firebase без серверной логики

Я создаю это приложение для чата с использованием 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 идентификатор и тем самым предотвращая получение дубликатов сообщений.

Возможно создание правила блокировки посетителя, например:

  "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"
          }    
    }, 

А затем запустите Data Fan Out updateChildren на TARGET_VISITORS_LOCK, если это не удается, это означает, что какое-то другое устройство работает updateChildren передо мной и отправка уведомления на одно устройство. Что будет с ней, если устройство будет работать в автономном режиме?

Многие устройства в пуле работников могут иметь одинаковые NOTIFICATIONS попытаться отправить, и они будут бороться за TARGET_VISITORS, так сказать

Тогда возникает проблема, чтобы узнать, когда удалить NOTIFICATIONS вход, удали его когда все TARGET_VISITORS были уведомлены:) Да, это довольно весело:)

Это все теоретически на данный момент, и я читаю лут, так надеясь получить некоторую информацию об этом?

0 ответов

Другие вопросы по тегам