Как доставлять сообщения атомарно при использовании 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
были уведомлены:) Да, это довольно весело:)
Это все теоретически на данный момент, и я читаю лут, так надеясь получить некоторую информацию об этом?