Как эффективно писать ~ 500 тыс. Документов каждый день в Firestore? - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть облачная функция в Python 3.7 для записи / обновления небольших документов в Firestore. У каждого документа есть user_id как Document_id и два поля: отметка времени и карта (словарь) с тремя объектами значения ключа, все они очень маленькие.

Это код, который я использую для write / update Firestore:

    doc_ref = db.collection(u'my_collection').document(user['user_id'])
    date_last_seen=datetime.combine(date_last_seen, datetime.min.time())
    doc_ref.set({u'map_field': map_value, u'date_last_seen': date_last_seen})

Моя цель - вызывать эту функцию один раз в день и записывать / обновлять ~ 500K документов. Я пробовал следующие тесты, для каждого из которых я включаю время выполнения:

Тест A : обработка вывода до 1000 документов. Не писать / обновлять Firestore -> ~ 2 секунды

Тест B : обработать вывод до 1000 документов. Запись / обновление Firestore -> ~ 1 мин 3 секунды

Тест C: обработка вывода до 5000 документов. Не писать / обновлять Firestore -> ~ 3 секунды

Тест D : обработать вывод до 5000 документов. Запись / обновление Firestore -> ~ 3 мин 12 секунд

Мой вывод здесь: запись / обновление Firestore занимает более 99% моего вычислительного времени.

Вопрос: Как эффективно писать / обновлять ~ 500 тыс. Документов каждый день?

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Невозможно назначить один курс действий, не зная подробностей о данных, которые вы на самом деле пытаетесь записать. Я настоятельно рекомендую вам прочитать документацию о рекомендациях для Firestore . Это даст вам представление о том, что вы можете сделать, чтобы избежать проблем с большими нагрузками при записи.

По сути, вы захотите избежать таких ситуаций, как описано в разделе do c:

* 1006. *

Высокая скорость чтения, записи и удаления в узком диапазоне документов

Избегайте высоких скоростей чтения или записи в лексикографически близких документах, иначе в приложении возникнут конфликтные ошибки. Эта проблема известна как «горячие точки», и ваше приложение может испытывать «горячие точки», если оно выполняет одно из следующих действий:

  • Создает новые документы с очень высокой скоростью и выделяет свои собственные монотонно увеличивающиеся идентификаторы.

  • Cloud Firestore распределяет идентификаторы документов, используя алгоритм разброса. Вы не должны сталкиваться с горячей точкой при записи, если создаете новые документы с использованием автоматических c идентификаторов документов.

  • Создает новые документы с высокой скоростью в коллекции с несколькими документами.

  • Создает новые документы с монотонно увеличивающимся полем, например отметкой времени, с очень высокой скоростью.

  • Удаляет документы в коллекции с высокой скоростью.

  • Запись в базу данных с очень высокой скоростью без постепенного увеличения трафика c.

Я не буду повторять все совет, что делать c. Что вам нужно знать, так это: из-за того, что Firestore создан для масштабного масштабирования, установлены ограничения на скорость записи данных в него. Тот факт, что вам нужно постепенно расширяться, вероятно, станет вашей главной проблемой, которую невозможно решить.

0 голосов
/ 27 апреля 2020

Я достиг своих потребностей с помощью пакетных запросов. Но согласно документации Firestore есть еще один более быстрый способ:

Примечание. Для массового ввода данных используйте серверную клиентскую библиотеку с распараллеленными отдельными записями. Пакетные записи работают лучше, чем сериализованные записи, но не лучше, чем параллельные записи. Вы должны использовать серверную клиентскую библиотеку для массовых операций с данными, а не мобильный / веб-SDK.

Я также рекомендую взглянуть на эту запись в stackoverflow с примерами в Node.js

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