У нас есть API NodeJS, размещенный в Google Kubernetes Engine, и мы хотели бы начать запись событий в BigQuery.
Я вижу три разных способа сделать это:
- Вставить каждое событие непосредственно в BigQuery с помощью Node BigQuery SDK в API (как описано здесь в разделе "Примеры потоковой вставки": https://cloud.google.com/bigquery/streaming-data-into-bigquery или здесь: https://github.com/googleapis/nodejs-bigquery/blob/7d7ead644e1b9fe8428462958dbc9625fe6c99c8/samples/tables.js#L367)
- Публиковать каждое событие в облачной пабе/подтеке, а затем писать конвейер потока данных для потоковой передачи в BigQuery (в Java или Python только это кажется), например здесь https://blog.doit-intl.com/replacing-mixpanel-with-bigquery-dataflow-and-kubernetes-b5f844710674 или здесь https://github.com/bomboradata/pubsub-to-bigquery
- Публиковать каждое событие в теме Pub/Sub из API, но вместо Dataflow используйте настраиваемый рабочий процесс, который подписывается на тему Pub/Sub с одной стороны и передает в BQ другой, Как здесь: https://github.com/GoogleCloudPlatform/kubernetes-bigquery-python/blob/master/pubsub/pubsub-pipe-image/pubsub-to-bigquery.py или здесь: https://github.com/mchon89/Google_PubSub_BigQuery/blob/master/pubsub_to_bigquery.py
В этом конкретном случае использования нам не нужно делать никаких преобразований и просто отправлять события прямо в нужный формат. Но позже мы можем использовать другие варианты использования, где нам нужно синхронизировать таблицы из нашего основного хранилища данных (MySQL) в BQ для аналитики, так что, возможно, начиная с Dataflow сразу стоит того?
Несколько вопросов:
- Вариант 1 (отправка одного события прямо в BQ) кажется простым, если у вас нет каких-либо преобразований. Это так же быстро и надежно, как и публикация в Паб/Под тема? Я в основном обеспокоен задержкой и обработка ошибок/дублирования (https://cloud.google.com/bigquery/troubleshooting-errors#streaming). Может быть, это лучше сделать в отдельном процессе?
- Для варианта 2 существуют ли какие-либо "пресеты" потока данных, которые не требуют, чтобы вы писали пользовательский код, когда все, что вам нужно, - это читать с Pub/Sub + надежно в BQ без каких-либо преобразований (возможно, только дедупликация/обработка ошибок )
- Существуют ли какие-либо недостатки в отношении простого пользовательского рабочего (опция 3), который читает из Pub/Sub, а затем передает в BQ и выполняет ли все обработку/повторную обработку ошибок и т.д.?