Подходят ли потоки DynamoDB для этого варианта использования?

У меня есть таблица DynamoDB, содержащая пары ключ-значение, которые будут прочитаны рядом приложений. При запуске каждое приложение будет читать всю таблицу и кэшировать ее в памяти.

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

Потоки DynamoDB изначально казались правильным подходом к решению проблемы. Я реализовал потребителя с помощью клиентской библиотеки Kinesis (KCL) в соответствии с рекомендациями AWS. Однако при его реализации я столкнулся с некоторыми проблемами, которые заставляют меня поверить, что я на ложном пути. Конкретно:

  • Когда я создаю нового потребителя с помощью KCL, он создает новую таблицу DynamoDB для управления арендой и контрольными точками, так что при перезапуске приложения KCL знает, какие записи были использованы, а какие нет. Это не то, что мне нужно для решения этой проблемы. Любые записи потока, которые создаются, когда приложение находится в автономном режиме, не имеют значения, поскольку вся таблица читается при запуске приложения.

  • Одновременно работают несколько экземпляров одного и того же приложения. Каждого из них нужно уведомлять об обновлениях таблиц. Чтобы реализовать это в KCL, мне нужно присвоить каждому из них уникальное имя приложения. В противном случае они будут использовать общую таблицу аренды, и только одно из приложений получит уведомление. Одна таблица для каждого экземпляра приложения кажется неправильной. Также мне понадобится что-нибудь для удаления неиспользуемых таблиц.

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

Я начинаю рассматривать другие решения, например:

  • Реализация лямбда-функции, которая запускается при обновлении таблицы. Функция отправляет уведомление в тему соцсети. Потребители создают подписки SQS по теме и получают уведомления через это. На мой взгляд, в этом решении слишком много движущихся частей.

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

Все решения, которые я рассмотрел до сих пор, имеют довольно существенные недостатки. Что мне не хватает?




Ответы (2)


Это зависит от того, как ваш KCL продвигает зависимые приложения, но я считаю, что путь SQS - правильный выбор.

  • Вы можете добавить предположительно бесконечное количество потребителей без ограничения.
  • Когда вы все же добавляете другое зависимое приложение, ему не потребуется изменять ваш KCL для отправки на него, новое приложение просто будет следить за очередью SQS.
  • Вы получаете возможность контролировать очередь при возникновении проблем.
  • Больше движущихся частей для настройки, но как только у вас установлена ​​Streams -> SNS -> SQS труба, она в основном пуленепробиваемая.

Просто мои 2 цента.

person John Jones    schedule 27.01.2017
comment
Спасибо за ответ. Вы, наверное, правы, поэтому я отметил ваш ответ как правильный. Однако многие движущиеся части все еще меня беспокоят. - person Henrik; 29.01.2017

В настоящее время AWS AppSync GraphQL API с подписками может быть самым простым подходом для поддержки этого типа приложений с наименьшее количество движущихся частей.

Каждый раз, когда одно из ваших приложений запускается, оно подключается к вашему AppSync GraphQL API с помощью структуры Amplify или < href = "https://github.com/awslabs/aws-mobile-appsync-sdk-js" rel = "nofollow noreferrer"> AppSync SDK и подписывается на обновления, которые его интересуют. Затем всякий раз, когда приложение обновляет информацию в таблице через ваш GraphQL API, все другие ваши приложения будут уведомлены об изменении вместе с соответствующими измененными данными.

AppSync хорошо интегрируется с DynamoDB прямо из коробки, позволяя создавать таблицы DynamoDB с соответствующими индексами вместе с GraphQL или генерировать GraphQL из существующих таблиц DynamoDB, если вы того пожелаете. Amplify может даже помочь вам автоматически сгенерировать AppSync GraphQL API на более высоком уровне со связанными таблицами DynamoDB, индексами, отношениями сущностей и т. Д. С возможностями поиска elasticsearch, используя их Преобразователи GraphQL.

person Roman Scher    schedule 27.06.2019