Хобрук: Ваш путь к мастерству в программировании

Что рекомендуется для работы с необработанными ключами DynamoDB batchGetItem

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

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

Я думаю, что BatchPutItem достаточно прост для реализации. Если я получаю необработанные элементы, я просто использую экспоненциальную повторную попытку, и элементы в конечном итоге будут сохранены. Я делаю что-то вроде этого:

(...)
BatchWriteItemOutcome outcome = dynamoDB.batchWriteItem(new TableWriteItems(tableName).withItemsToPut(items));
processUnprocessed(outcome, 0);
(...)

а также

private void processUnprocessed(BatchWriteItemOutcome outcome, int retryNumber) {

    if (MapUtils.isEmpty(outcome.getUnprocessedItems())) {
        return;
    }

    if (retryNumber > maxRetries) {
        log.error(Joiner.on(" ").join("Unable to process", outcome.getUnprocessedItems().size(), "items after", retryNumber, "tries"));
        return;
    }

    long retryTime = (long)Math.pow(retryFactor, retryNumber);
    log.info("Exceeded provisioning throughput. Retrying in " + retryTime);

    try {
        Thread.sleep(retryTime);
    } catch (InterruptedException e) {
        log.error(e.getMessage());
    }

    processUnprocessed(dynamoDB.batchWriteItemUnprocessed(outcome.getUnprocessedItems()), ++retryNumber);
}

Поскольку асинхронные фоновые задачи заполняют БД, это работает нормально.

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

Есть ли у кого-нибудь предложения о правильном способе (я бы согласился на приличный способ) справиться с этим? Я неправильно подхожу к проблеме?

Я использую Amazon JavaSDK кстати.


Ответы:


1

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

В итоге я поместил логику повтора на клиенте только для GetBatchItem, чтобы сразу показать результаты, которые можно было получить. Мой внутренний код на 100% свободен от какой-либо логики повторных попыток для необработанных элементов.

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

{
  "items": [{
     "myPartitionKey": "whatever",
     "mySortKey": "whocares",
     "item": "myitem"
   }, (...)],
   "unprocessedKeys": [{
     "pKey": "unprocessed1"
     "sKey": "blah"
   }, (...)]
}

Затем мой клиент ReactJs должен частично обновить пользовательский интерфейс на основе успешно полученных данных и снова вызвать ту же службу, только с отсутствующими ключами, с некоторым экспоненциальным отставанием.

30.01.2017
Новые материалы

Решения DBA Metrix
DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

Начало работы с Блум
Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

Создание кнопочного меню с использованием HTML, CSS и JavaScript
Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

Внедрите OAuth в свои веб-приложения для повышения безопасности
OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

Классы в JavaScript
class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

Как свинг-трейдеры могут использовать ИИ для больших выигрышей
По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

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