#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. спасибо за ваши отзывы, я не думал об использовании выделенного контейнера вместо лямбды и сравнении цен между этими двумя решениями, поэтому я это сделаю. А что касается кэша, я думаю, что попробую обойтись без него, как вы советуете (и добавлю его, если пойму, что это неэффективно). Еще раз спасибо вам.