#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