Как реализовать конвейер данных с повторяющимися задачами?

#database #amazon-web-services #aws-lambda #cloud #data-pipeline

Вопрос:

Мне нужно настроить конвейер данных для приложения, которое я пытаюсь создать, но я не уверен, как это сделать.

У меня есть 2 сущности в базе данных: A и B, каждая сущность B принадлежит сущности A.

Каждую минуту я извлекаю много объектов B, но отсутствует одно поле (для каждого объекта B). Поэтому перед сохранением объектов B мне нужно вычислить это поле для каждого из них. Учитывая сущность B и соответствующую сущность A, мне нужны последние 20 сохраненных сущностей B (в базе данных, поэтому без отсутствующего поля), принадлежащих сущности A, для вычисления отсутствующего поля.

Псевдокод каждую минуту:

  • http-запрос на получение списка новых объектов B для сохранения.
  • Для каждой сущности B:
    • прочитайте сущность A сущности B (у сущностей B есть поле с идентификатором сущности, к которой они принадлежат)
    • получите последние 20 сохраненных объектов B из объекта A
    • вычислите отсутствующее поле и сохраните объект B

Порядок величины: 20 тыс. объектов A, 30 миллионов сохраненных объектов B и 1 тыс. новых объектов B каждую минуту (этот 1 тыс. объектов B относится примерно к 300 объектам A)

Вместо того, чтобы каждую минуту запрашивать базу данных, чтобы получить последние 20 сущностей B, сохраненных для каждой сущности A, найденной в списке извлеченных сущностей B, я подумал, что мог бы реализовать систему кэша, в которой хранятся последние 20 сохраненных сущностей B для каждой сущности A.

Итак, моей первой идеей было:

  • Реализуйте функцию AWS lambda с системой кэширования (https://dashbird.io/blog/leveraging-lambda-cache-for-serverless-cost-efficiency/) это делает всю логику, описанную каждую минуту.
  • Добавьте CRON, который каждую минуту вызывает функцию lambda.
  • Данные хранятся в базе данных sql (mysql) на AWS.

Поскольку мне впервые приходится настраивать конвейер данных, я не уверен, что моя первая идея хороша, и у меня есть несколько вопросов:

  • Как бы вы это реализовали ?
  • Является ли кэширование хорошей идеей ? Не лучше ли просто запросить базу данных ?
  • Является ли AWS хорошим выбором ?
    • У CRON есть ограничение в 1 минуту, так что я достигаю пределов CRON…
    • Структура кэша будет представлять собой словарь с ключом: идентификатор сущности (строка из 20 символов) значение: список из 20 чисел (20 тысяч сущностей, то есть 20 тысяч пар ключ-значение). Имеет ли смысл создавать такой кэш данных на основе функции AWS lambda ?
  • Вы советуете мне вместо этого использовать структуру конвейера данных или другую технологию ?

заранее благодарим вас за ваши отзывы 🙂

Ответ №1:

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

Насчет работы в cron с Лямбдой, да, почему бы и нет. Убедитесь, что вы знаете, как долго в среднем работает эта лямбда. Может быть дешевле и эффективнее, если для этого у вас есть специальный контейнер.

Не уверен, что все это действительно должно быть в конвейере данных, так как это довольно простая настройка.

Комментарии:

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