Итерация по всем элементам в SimpleDB

Допустим, у меня есть домен AWS SimpleDB с примерно 3 миллионами элементов, каждый элемент имеет атрибут «foo» со значением некоторого произвольного целого числа (которое, конечно, фактически хранится в SimpleDB в виде строки, но давайте проигнорируем преобразование в и с настоящего момента). Я хотел бы увеличивать значение foo для каждого элемента каждые 60 секунд, пока оно не достигнет максимального значения (максимальное значение не то же самое для каждого элемента, максимальное значение элемента сохраняется как другое значение атрибута в элементе), а затем сбросить foo до нуля : читать, увеличивать, оценивать, сохранять.

Возможен ли такой подход в SimpleDB с учетом большого количества элементов и жесткого ограничения в 60 секунд? У кого-нибудь есть подход, чтобы сделать эту работу?


person karlo kilayko    schedule 31.03.2010    source источник


Ответы (2)


Вы можете это сделать, но это неосуществимо. Вы можете получить только 100–300 PUT в секунду для одного домена. Вы можете читать до 1000 элементов в секунду, поэтому запись будет узким местом.

Чтобы быть консервативным, допустим, 100 операций хранилища в секунду для каждого домена. Вам понадобится 500 доменов, чтобы обеспечить пропускную способность, достаточную для хранения всех 3 миллионов каждую минуту. По умолчанию вы получаете только 100, так что вам придется попросить больше.

И это было бы дорого. Запись с небольшим количеством атрибутов стоит около 3 долларов на миллион, а чтение - около 1,30 доллара на миллион. Это примерно 13 долларов за минуту.

Единственное, что я действительно могу предложить, - это объединить 3 миллиона элементов в меньшее количество элементов. Если бы существовал способ поместить 50 «элементов» в каждый реальный элемент, вы могли бы сделать это с 10 доменами по цене около 15,50 долларов в час. Но я бы все равно не назвал это возможным, поскольку вы можете получить кластер из 10 экземпляров сервера EC2 с очень большим процессором и высокой производительностью за 6,80 долларов в час.

person Mocky    schedule 01.04.2010
comment
Ого, я даже не думал о стоимости! Спасибо, что подняли этот вопрос - мой клиент наверняка бы меня вытащил и четвертовал;) - person karlo kilayko; 05.04.2010

Почему бы не сгенерировать значение во время чтения из надежных часов? Я придумываю несколько имен:

  • Touch_time - значение эпохи (в секундах с 1970 г.), когда элемент был инициализирован нулем.
  • Max_age - количество минут, в течение которых время приближается.
  • Current_time - Текущее значение эпохи.

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

(current_time - touch_time)% (max_age * 60)

Предполагая, что max_age меняется относительно нечасто, и все доверяют touch_time и current_time с точностью до минуты, и для этого нужен NTP.

person Jeremy Wadhams    schedule 15.01.2013