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

NoSQL: получение последних значений из таблиц DynamoDB/Azure Table Storage

У меня есть небольшая проблема, которая нуждается в некоторых предложениях:

  • Допустим, у нас есть несколько сотен таблиц данных с несколькими десятками миллионов строк.
  • Таблицы данных - это метка времени (ключ) - значение
  • Таблицы данных записываются один раз в секунду

Последняя запись каждой таблицы должна быть быстро доступной и, скорее всего, будет запрашиваться наиболее (сортировать как "следить за данными в реальном времени" ). С отсутствием "Last()" или аналогичного, я думал о создании другой таблицы "LatestValues", где последняя запись каждой таблицы данных обновляется для более быстрого поиска. Это, однако, добавит дополнительное обновление для каждой операции записи. Кроме того, большая часть трафика будет сосредоточена на этой таблице (хорошая/плохая?). Есть ли лучшее решение для этого или я чего-то не хватает?

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

Я в первую очередь смотрю на DynamoDB и Azure Table Storage, но мне также интересно, как BigTable справляется с этим.

4b9b3361

Ответ 1

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

В двух словах вы можете получить последний элемент, используя Query(hash_key=..., ScanIndexForward=True, limit=1)

Но это предполагает, что у вас есть range_key_defined.

С Scan у вас нет такого параметра, как ScanIndexForward=false, и в любом случае вы не можете полагаться на заказ, поскольку данные распространяются по разделам, а запрос Scan затем балансируется по нагрузке.

Чтобы достичь цели с помощью DynamoDB, вы можете "разбить" свою временную метку следующим образом:

  • hash_key: дата
  • range_key: время или полная метка времени, как вы предпочитаете

Затем вы можете использовать "трюк" Query + Limit=1 + ScanIndexForward=false

Ответ 2

В общем, вы, вероятно, просто хотите изменить временную метку, поэтому она уменьшается со временем, оставляя самую новую строку сверху.

Здесь в блоге, в котором рассказывается, как это сделать с хранилищем Windows Azure: http://blog.smarx.com/posts/using-numbers-as-keys-in-windows-azure.

UPDATE

Я использую DynamoDB для одного проекта, но очень упрощенно, поэтому у меня мало опыта. Тем не менее, http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/QueryAndScan.html подсказывает мне, что вы можете просто указать ScanIndexForward=false и Limit=1, чтобы получить последний элемент.