Google Datastore очень медленно работает с PHP AppEngine - PullRequest
1 голос
/ 17 марта 2019

Я получаю доступ к хранилищу данных Google Cloud из моего экземпляра PHP App Engine, используя официальную библиотеку google-cloud-php .

Я постоянно вижу свыше 0,35задержка в секундах на запрос .Даже для простых запросов с менее чем 100 объектами в хранилище данных.

Моему веб-приложению необходимо выполнять около 4 последовательных запросов к хранилищу данных на запрос, что делает хранилище данных совершенно непригодным (постоянная задержка 1,5–3 секунды на загрузку страницы)

Я что-то упустил?


Вот как я могу подключиться к хранилищу данных:

        // Same issue even without 'authCache' (a memcached wrapper).
        $authCache = new DatastoreAuthCache();
        $datastore = new DatastoreClient([
            'projectId' => AppIdentityService::getApplicationId(),
            'authCache' => $authCache
        ]);
        Datastore::$ds = $datastore;

ЗдесьВот два примера моих запросов:

    // Lookup by keys.
    $ds = Datastore::get();
    $queryResults = $ds->lookupBatch($keys);
    $rows = keyValue($queryResults, "found");

    // Query by fields.
    $query = $ds->query()
        ->kind(self::EntityName)
        ->filter('owner', '=', $a)
        ->filter('target', '=', $b)
        ->limit(1)
        ->keysOnly();

    $results = $ds->runQuery($query);
    foreach ($results as $entity) {
        return $entity;
    }

Можно ли ожидать такого уровня задержки?Я могу кэшировать некоторые результаты, но не все, поэтому я надеюсь, что это проблема с моей стороны.

Вот что я уже пытался улучшить задержку:

  • Добавлен обработчик 'authCache' для кэширования токенов API хранилища данных (без последствий)

  • Подтвержденные хранилище данных и экземпляр ядра приложения находятся в одном регионе

  • Подтверждено, что index.yaml настроен правильно

  • Подтверждено, что задержка вызвана вызовами хранилища данных, а не бизнес-логикой

  • Другие базы данных базы данныхработают нормально (облачный SQL-сервер возвращает <0,1 секунды)Эмулятор локального хранилища данных также возвращается через <0,01 секунды. </p>

Что я могу сделать, чтобы увеличить эту задержку?

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Я не уверен, что это квалифицируется как ответ, но я постараюсь помочь вам отладить его с помощью драйвера стека.

Посмотрите журналы в облачной консоли - https://console.cloud.google.com/logs/viewer

Ищите медленный обработчик.

gae_log_message

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

Это будет выглядеть примерно так:

stack_driver_tracing

0 голосов
/ 24 марта 2019

Самым большим узким местом является установление соединения с хранилищем данных (это может занять до 200 мс, в этом помогает кеш аутентификации). К сожалению, это плохая новость для php, потому что мы не можем установить постоянное соединение. Клиент Datastore должен переподключаться при каждом запросе.

Это становится еще сложнее при попытке оптимизировать, потому что он сильно зависит от ленивой загрузки. Лучше всего использовать повторно один и тот же экземпляр клиента хранилища данных для всех запросов.

Ограничение количества фильтров ускоряет запросы и вместо этого извлекает большие фрагменты данных, которые затем могут быть отфильтрованы локально. С использованием чего-то вроде redis, которое также может использоваться в качестве кэша данных.

Пакетное обновление, полученное службой cron, также может помочь в более быстром освобождении запроса. Уведомления могут быть помещены в веб-сокет или получены при последующих запросах.

Вы не упомянули об этом, поэтому не ясно, используете ли вы gRPC , DatastoreClient будет использовать grpc по умолчанию, если модуль установлен, в противном случае он возвращается к REST, что значительно медленнее по сравнению.

Чтобы проверить, установлена ​​ли у вас grpc:

php -m|grep grpc

Единственный другой совет, который я могу придумать, это индексы, но это поможет только с большими наборами данных. Вам также следует попробовать провести тестирование в другом центре обработки данных, возможно, он перегружен.

...