2010-03-31 2 views
2

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

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

ответ

1

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

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

Также было бы дорого. Записи с небольшим количеством атрибутов составляют около 3 долларов США за миллион, а их чтение составляет около 1,30 доллара США за миллион. Это около 13 долларов за минуту.

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

+0

Ах, да, я даже не рассматривал проблемы с расходами! Спасибо, что принесли это - мой клиент, вероятно, заставил бы меня нарисовать и расквартировать;) –

0

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

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

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

(CURRENT_TIME - touch_time)% (MAX_AGE * 60)

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

Смежные вопросы