Гарантируют ли прослушиватели событий, что все данные, когда-либо записанные в путь, в конечном итоге будут доставлены клиенту? Например, если у меня есть игровой клиент, который отправляет ходы по одному и тому же пути один за другим, будет ли слушающий клиент получать все обновления? Что произойдет в этой ситуации: клиент A отправляет ход 1 в game1/user1/move_data, который слушает клиент B; Затем клиент A немедленно отправляет другой ход, обновляя значение в game1/user1/move_data. Будет ли гарантированно слушающий клиент получать все отправленные ходы?
В настоящее время у меня есть система, которая создает новый путь для каждого хода, а затем я вызываю отдельных слушателей при каждом ходе, когда каждый клиент достигает этого хода в своем состоянии. Это не кажется эффективным, если клиент A получает самое последнее перемещение, которое сделал клиент B, а затем клиент A начинает прослушивать путь, которого еще не существует.
Приведенные ниже цитаты взяты из этой ссылки: https://firebase.google.com/docs/database/admin/retrieve-data
«Событие value используется для чтения статического снимка содержимого по заданному пути к базе данных, поскольку они существовали во время события чтения. Оно запускается один раз с начальными данными и снова каждый раз при изменении данных. Обратный вызов события передается снимок, содержащий все данные в этом месте, включая дочерние данные. В приведенном выше примере кода значение возвращает все записи блога в вашем приложении. Каждый раз, когда добавляется новая запись блога, функция обратного вызова возвращает все записи. "
Часть о том, как они существовали во время события чтения, заставляет меня думать, что если слушатель находится на пути, то клиент в конечном итоге получит все значения, когда-либо находившиеся на этом пути.
Есть также эта строка из раздела гарантий, которую я изо всех сил пытаюсь расшифровать:
«События значения всегда запускаются последними и гарантированно содержат обновления любых других событий, которые произошли до того, как был сделан этот снимок».
Я работаю с языком, который не имеет SDK на основе Google, и задаю этот вопрос, чтобы я мог дополнительно оценить пригодность Firebases для моего использования.
попробуйте этот код, чтобы получить значение обновления из базы данных firebase: -
mFirebaseInstance = FirebaseDatabase.getInstance();
mFirebaseDatabase = mFirebaseInstance.getReference();
mFirebaseDatabase.child("new_title").setValue("Realtime Database");
mFirebaseDatabase.child("new_title").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String appTitle = dataSnapshot.getValue().toString();
Log.e("Hey", appTitle);
title.setText(appTitle);
}
@Override
public void onCancelled(DatabaseError error) {
// Failed to read value
Log.e("Hey", "Failed to read app title value.", error.toException());
}
});
База данных Firebase Realtime выполняет синхронизация состояния. Если клиент прослушивает данные в каком-либо месте, он получит состояние этих данных. Если в данных есть изменения, он получит последнее состояние этих данных.
...if I have a game client that pushes moves to the same path one after the other will the listening client receive all updates?
Если есть несколько обновлений, прежде чем сервер Firebase сможет отправить состояние слушателю, он может пропустить некоторые промежуточные значения. Таким образом, нет никакой гарантии, что ваш клиент увидит каждое изменение состояния, есть только гарантия, что в конечном итоге он увидит самое последнее состояние.
Если вы хотите убедиться, что все клиенты (могут) видеть все изменения состояния, вы должны сами сохранять изменения состояния в базе данных.
Я провел несколько тестов, и похоже, что все обновления получены на клиенте. Я не публикую ответ, потому что я не знаю, почему это так. То же самое, если соединение потеряно? Передает ли Google предыдущее значение перед обновлением другому работнику, если кто-то прослушивает этот путь или несколько клиентов прослушивают этот путь, и они отключаются?