Лучшая стратегия для использования больших объемов данных стороннего API с использованием AWS? - PullRequest
2 голосов
/ 17 июня 2020

Я относительно новичок в AWS и работаю над стратегиями, которые наилучшим образом отвечают конкретным c бизнес-требованиям разрабатываемой нами услуги.

Среди наших проблем:

  1. Нам нужно получить очень большой набор данных (сотни тысяч записей) из стороннего API, который доставляет записи с разбивкой на страницы в максимальных группах по 50;
  2. Нам нужно назначить два уникальных , внутренние ключи для каждой из импортированных записей;
  3. Нам необходимо обновить импортированные записи, выполняя регулярные запланированные вызовы для обновленных и новых записей; и
  4. Со временем мы будем добавлять записи из дополнительных источников - и нам нужно будет согласовать (сопоставить, дублировать) данные из нескольких источников.

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

  1. Выполнение вызовов API в рекурсивной лямбда-функции (из-за разбивки на страницы);
  2. Сохранение результатов вызова в Корзина S3 в виде одного или нескольких файлов json;
  3. Вытягивание данных S3 в нереляционную БД.

Однако здесь у нас есть некоторые проблемы:

  • Учитывая, что начальный импорт займет несколько часов, время ожидания лямбды составляет 15 минут (жесткое ограничение);
  • Как лучше всего назначать наши собственные уникальные ключи входящим данным (в идеале один ключ должен быть сгенерирован путем приема входящих данных и их переформатирования в соответствии с нашими потребностями); и
  • Какова наилучшая стратегия обновления этих записей обновленной информацией из источника или третьей стороны?

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

Ответы [ 2 ]

3 голосов
/ 17 июня 2020

Несколько комментариев.

Нам нужно получить очень большой набор данных (сотни тысяч записей) из стороннего API, который доставляет записи с разбивкой на страницы в максимальных группах по 50;

Это означает около «тысячи» вызовов стороннего API. В другом месте вопроса вы упоминаете «несколько часов». Подходит ли эта нагрузка поставщику с этим API? Только одна вещь, о которой стоит подумать, если вы этого не сделали.

Выполнение вызовов API в рекурсивной лямбда-функции (из-за разбивки на страницы);

Be крайне осторожно с рекурсивными вызовами лямбда-функции, т. е. лямбда-функции, которая вызывает себя асинхронно. Может случиться так, что из-за ошибки Lambda никогда не перестанет вызывать себя, и тогда вы попадете в бесконечные циклы Lambda Calls и увеличиваете расходы ... Его можно остановить, но это PITA.

Сохранение результатов вызова в корзине S3 в виде одного или нескольких файлов json;

Если вы хотите использовать S3, я бы, вероятно, предложил сохранить данные объединены в меньшее количество файлов. Вы не упомянули размер каждой части данных, но тонны крошечных файлов не идеальны для S3. С другой стороны, только один гиганти c (например, большие десятки или сотни ГБ или более) не идеален для последующей обработки (даже если S3 справится с этим без проблем).


Я бы посоветовал вам изучить две вещи:

  1. Шаговые функции.

Поскольку вы Чтобы иметь дело с разбивкой на страницы стороннего API, вы можете определить конечный автомат в Step Functions, который будет вызывать вашу лямбду за вас. Lambda сделает свое дело (загрузит кучу записей, сохранит их где-нибудь ) и вернет либо количество загруженных записей, либо количество ожидающих записей, что-то в этом роде. Затем конечный автомат пошаговых функций будет отвечать за logi c принятия решения о том, вызывать ли Download Lambda снова (возможно, даже с параметрами, основанными на значении, возвращенном предыдущим вызовом), или если это было сделано.

Таким образом, у вас есть хорошее разделение проблем: c Лямбда-функция супер, она просто поглощает материал; и вы разделяете logi разбиения на страницы c (и, возможно, даже logi «параллелизм» или «синхронизацию» c, если вас по какой-то причине просят «замедлить» ваши вызовы стороннего API). *

Kinesis Firehose

Kinesis Firehose - конвейер потоковой передачи данных. По сути, вы настраиваете поток пожарных шлангов, чтобы агрегировать записи для вас и сбрасывать их «где-то» (например, S3 является допустимой целью). Вы выбираете способ агрегирования (например, время, объем данных). И вы даже можете настроить Firehose для вызова лямбда-функции для преобразования каждой записи для вас перед хранением (здесь вы можете, например, добавить свои 2 уникальных идентификатора).

0 голосов
/ 17 июня 2020

Что касается импорта данных, вы можете создать al oop с помощью AWS Step Functions для последовательного извлечения данных. Взгляните на это сообщение в блоге: https://read.acloud.guru/processing-an-arbitrary-number-of-jobs-with-aws-step-functions-c185c2d2608

Два других ваших вопроса (назначение ключей и последующее обогащение и обновления) требуют большего контекста, и мир, вероятно, будет лучше, если они будут опубликованы как отдельные вопросы.

...