Не получая обновления документов при отключении от сети и переподключении в Firestore Java admin SDK - PullRequest
0 голосов
/ 15 ноября 2018

Я настраиваю наблюдение за запросом в Firestore на моем локальном ПК, используя Java Admin SDK.Если сеть отключается и повторно подключается, то обновления больше не принимаются на моей локальной машине.Я заметил, что если переподключение сети происходит в течение короткого интервала (<2 - 3 минуты), то это нормально.Но если это дольше, то эта проблема возникает.Кроме того, об ошибках / исключениях не сообщается в обратном вызове Listener, чтобы я мог снова настроить отслеживание обновлений.Мой компьютер не защищен прокси, поэтому он не может быть проблемой с прокси. </p>

Пожалуйста, помогите мне отладить эту проблему.

Редактировать:

Похоже, это ошибка вSDK.Я включил журналы SDK и попробовал следующие эксперименты:

  • Сценарий 1:

    1. Следите за обновлениями запросов
    2. Клиент устанавливает GRPCсоединение с сервером.
    3. Похоже, что сервер отправляет клиенту подтверждение активности (?) каждую минуту, но не поддерживает его с клиента на сервер
    4. Отключение сети
    5. Повторное подключение в течение минуты, соединение с запросом все еще активно, и обновления документов приходят, как и ожидалось
    6. Отключение от сети
    7. Повторное подключение через 5 минут
    8. Здесь я предполагаю, что серверсбросил бы соединение GRPC с его конца, так как оно не может связаться с клиентом, но SDK не знает об этом.Он все еще ожидает отправки сервером подтверждения активности.
    9. Обновления документов на стороне клиента не принимаются (как и ожидалось)
    10. Выполните новый запрос и проследите за его обновлениями.
    11. SDK пытается отправить запрос через то же соединение GRPC, которое было установлено ранее, понимает, что соединение закрыто, открывает новое соединение GRPC.Теперь обновления документов начинают поступать для обоих запросов.
  • Сценарий 2:

    1. Следите за обновлениями запросов
    2. Отключитесеть в течение примерно 5 минут
    3. Выполните новый запрос до повторного подключения к сети.
    4. SDK пытается отправить запрос через то же самое соединение GRPC, которое было установлено ранее, понимает, что соединение закрыто,открывает новое соединение GRPC.Даже это не удается, но попытка подключения повторяется каждую минуту.
    5. Повторно подключите сеть.
    6. Попытка подключения SDK успешно завершена, и начинают поступать обновления для обоих запросов.

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

GRPC keepalive должен быть включен, чтобы клиент мог отправлять keepalive на сервер и обнаруживать любые соединения, которые закрыты со стороны сервера. Это можно сделать, указав TransportChannelProvider в FirestoreOptions при инициализации FirebaseApp. Фрагмент кода приведен ниже:

InstantiatingGrpcChannelProvider channelProvider =
    InstantiatingGrpcChannelProvider.newBuilder()
        .setKeepAliveTime(Duration.ofSeconds(60L))
        .setKeepAliveTimeout(Duration.ofMinutes(5L))
        .build();

FirestoreOptions firestoreOptions = FirestoreOptions.newBuilder()
    .setChannelProvider(channelProvider).build();

FirebaseOptions options = new FirebaseOptions.Builder()
    .setCredentials(credentials).setFirestoreOptions(firestoreOptions)
    .setConnectTimeout(5000).setReadTimeout(5000).build();
FirebaseApp firebaseApp = FirebaseApp.initializeApp(options);

Firestore firestore = FirestoreClient.getFirestore(firebaseApp);
0 голосов
/ 15 ноября 2018

Когда вы слушаете изменения в базе данных Cloud Firestore и у вас есть некоторые сетевые отключения, к сожалению, вы ничего не можете сделать.У вас нет никакого контроля над тем, как Firebase Firestore SDK управляет своими соединениями.

Причина, по которой попытки повторяются не так быстро, как вы ожидаете, заключается в том, что код, выполняющий попытки, выводит так называемый алгоритм экспоненциального отката .Это означает, что этот код предотвращает все повторные попытки, которые могут произойти на устройстве пользователя, так быстро в пользу производительности.Слишком много попыток может также повлиять на пользователя, потребляя слишком много пропускной способности его тарифного плана.

В заключение, это означает, что может потребоваться некоторое время, чтобы восстановить соединение, и вы должны быть терпеливы об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...