1

У меня почти 300 потоков, пытающихся получить доступ к одной таблице DynamoDB с очень низкой выделенной емкостью чтения/записи (5/сек). Таким образом, нагрузка явно слишком высокая, и я получаю ProvisionedThroughputExceededException от DynamoDBMapper. Вопрос такой: Как заставить DynamoDBMapper ждать + повторить попытку, а не сбой?Как предотвратить ProvisionedThroughputExceededException в DynamoDBMapper?

Я использую ExponentialBackoffStrategy на AmazonDynamoDBClient с большими задержками (100мс базы, 12 повторов, это дает: 100мс, 200ms, 400мс, ... 409600ms), но это просто не работает. Фактически, он не срабатывает немедленно. По the docs:

ProvisionedThroughputExceededException

Сообщения: Вы превысили максимально допустимые инициализированные пропускную для таблицы или для одного или нескольких глобальных вторичных индексов. Чтобы просмотреть показатели производительности для заданной пропускной способности и потребляемой производительности , откройте консоль Amazon CloudWatch.

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

Что я делаю неправильно?

Что означает «слишком большое, чтобы закончить»?

Спасибо!

В случае, если вам интересно, почему я использую 300 потоков, с низкой выделенной емкостью и может принимать длительное время отклика: обычно мы используем более высокие емкости, я просто не хочу, чтобы приложение терпило неудачу, если емкость низкая.

+0

5 req/sec для 300 потоков - это очень мало возможностей и независимо от того, сколько вы используете, будет много запросов в очереди повторных попыток, и нет документации, сколько запросов может быть в очереди повторных попыток, поэтому в вашем случае IMO очень часто пересекает это число, поэтому вы получаете это исключение немедленно, не для последнего запроса в очереди, а для старого запроса в очереди. Лучшим решением было бы увеличить выделенную пропускную способность до некоторого разумного числа, так как 5 слишком меньше для 300 потоков. –

+0

@AmitK: нет, я не понимаю, извините. С 300 потоками и задержкой 409600 мс на запрос в потоке вы получаете меньше 1 запроса в секунду (в среднем). И длина очереди повтора не может превышать количество потоков. Правильно? Или, может быть, это вызвано экспоненциальными коллизиями временного интервала резервного копирования. Должен ли я использовать рандомизированный джиттер? – STF

ответ

0

Хорошо, у меня было неправильное состояние повторной попытки. Затем вам также необходимо настроить максимальное количество попыток и, возможно, задержки (max, base).

Смежные вопросы