Один клиент DynamoDB для каждой службы или один клиент DynamoDB для всех служб

#amazon-web-services #.net-core #amazon-dynamodb

#amazon-веб-сервисы #.net-core #amazon-dynamodb

Вопрос:

У меня есть веб-API .NET Core, который объединяет данные из нескольких таблиц в моем DynamoDB.

Существует 5 служб, которые считывают данные из связанной таблицы (например, служба поддержки клиентов, считывает данные из таблицы клиентов). У каждой службы есть свой собственный клиент DynamoDB, и службы выполняются одновременно.

У меня возникли некоторые проблемы при загрузке. В принципе, время от времени службе требуется намного больше времени для выполнения запроса dynamo. Обычно каждый запрос составляет <50 мс, но при одновременной загрузке некоторые запросы могут занимать до 1 секунды.

Я воспроизводю это с нагрузочным тестом 2000 запросов в течение 45 секунд (~ 44 запроса в секунду).

Мой вопрос в том, является ли это правильным дизайном при запросе нескольких таблиц? Или должен быть только один клиент DynamoDB, выполняющий все запросы? Я знаю, что клиент DynamoDB использует HttpClient под капотом. Будет ли это узким местом?

В качестве дополнительного примечания, соглашения об уровне обслуживания обычно составляют <100 мс.

Ответ №1:

Короткий ответ

Попробуйте использовать ThreadPool.SetMinThreads(100, 100) перед выполнением любых вызовов DynamoDB. В вашем случае один клиент на службу в порядке.

Длинный ответ

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

Однако официальный пакет DynamoDB SDK для .net имеет очень низкую производительность и управление потоками, что, скорее всего, вызывает у вас проблемы. Кроме того, существуют некоторые блокировки и операции синхронизации, которые DescribeTable в некоторых случаях могут привести к остановке потока. Вы можете попытаться «исправить» это, установив ThreadPool.SetMinThreads(100, 100) (вместо этого вы можете использовать другое достаточно большое значение 100 ). Подробнее об этой проблеме на github