Подтвердить что ты не робот

Надежность атомных счетчиков в DynamoDB

Я рассматривал возможность использования Amazon DynamoDB в своем приложении, и у меня есть вопрос относительно его атомных счетчиков надежность.

Я создаю распределенное приложение, которое должно одновременно и последовательно, увеличивать/уменьшать счетчик, хранящийся в атрибуте Dynamo. Мне было интересно, насколько надежный атомный счетчик "Динамо" находится в тяжелой параллельной среде, где уровень concurrency чрезвычайно высок (скажем, например, средняя скорость 20-кратных одновременных ударов - чтобы получить эту идею, это будет почти 52 приращения/сокращения в месяц в месяц).

Счетчик должен быть супернадежным и никогда не пропускать удар. Кто-нибудь тестировал DynamoDB в таких критических средах?

Спасибо

4b9b3361

Ответ 1

DynamoDB получает свойства масштабирования, разделяя ключи между несколькими серверами. Это похоже на то, как масштабируются другие распределенные базы данных, такие как Cassandra и HBase. В то время как вы можете увеличить пропускную способность на DynamoDB, которая просто перемещает ваши данные на несколько серверов, и теперь каждый сервер может обрабатывать общее количество одновременных подключений/количество серверов. Посмотрите на их FAQ для объяснения того, как достичь максимальной пропускной способности:

В: Всегда ли я смогу достичь своего уровня пропускной способности?

Amazon DynamoDB предполагает относительно случайный доступ ко всем первичным ключам. Вы должны настроить модель данных так, чтобы ваши запросы приводили к довольно равномерному распределению трафика по первичным ключам. Если у вас очень неравномерный или искаженный шаблон доступа, вы не сможете достичь своего уровня подготовленной пропускной способности.

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

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

Это означает, что наличие одного ключа, который увеличивается напрямую, не будет масштабироваться, поскольку этот ключ должен находиться на одном сервере. Существуют и другие способы решения этой проблемы, например, при агрегации памяти с инкрементом сброса в DynamoDB (хотя это может привести к проблемам с надежностью) или счетчиком с разделением на сегменты, где приращения распределяются по нескольким ключам и считываются путем вытягивания всех ключей из сегментированного счетчик (http://whynosql.com/scaling-distributed-counters/).

Ответ 2

В дополнение к ответу gigq о масштабируемости, атомные приращения DynamoDBs не являются идемпотентными и, следовательно, не надежны: если соединение происходит после выдачи запроса UpdateItem ADD, у вас нет способа узнать, было ли добавлено добавлено или нет, поэтому вы не знаете, следует ли повторять попытку или нет.

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

Ответ 3

если вы собираетесь написать единственный динамо-ключ db, вы будете страдать от проблем с горячими разделами. Горячая проблема раздела начинается около 300 TPS на индекс. Таким образом, если у вас есть 5 индексов в таблице, вы можете увидеть проблему с горячими разделами около 300/5 ~ 60 TPS.

В противном случае динамо-база данных может масштабироваться до 10-40K TPS, в зависимости от вашего варианта использования.