Как минимизировать записи в хранилище данных, инициированные библиотекой mapreduce?

У меня есть 3 части этого вопроса:

У меня есть приложение, в котором пользователи создают объекты, которые другие пользователи могут обновлять в течение 5 минут. Через 5 минут время ожидания объектов истекает, и они становятся недействительными. Я храню объекты как объекты. Чтобы сделать тайм-аут, у меня есть задание cron, которое запускается раз в минуту, чтобы очистить просроченные объекты.

Большую часть времени сейчас у меня нет активных объектов. В этом случае обработчик mapreduce проверяет полученную сущность и ничего не делает, если она не активна, не записывает. Однако моя бесплатная квота на запись в хранилище данных заканчивается из-за вызовов mapreduce примерно через 7 часов. По моим приблизительным оценкам, просто запуск mapreduce вызывает около 120 операций записи/вызова. (Грубая математика, 60 вызовов/час * 7 часов = 420 вызовов, лимит 50 тыс. операций/420 вызовов ~ 120 операций записи/вызов)

Вопрос 1. Кто-нибудь может проверить, что один лишь запуск триггеров mapreduce вызывает около 120 операций записи в хранилище данных?

Чтобы обойти это, я проверяю хранилище данных перед запуском mapreduce:

def cronhandler():
    count = model.all(keys_only=True).count(limit=1000) 
    if count:
        shards = (count / 100) + 1;
        from mapreduce import control
        control.start_map("Timeout open objects",
                      "expire.maphandler",
                      "expire.OpenOrderInputReader",
                      {'entity_kind' : 'model'},
                      shard_count=shards)
    return HttpResponse()

Вопрос 2. Является ли это лучшим способом избежать операций записи в хранилище данных, вызванных mapreduce? Есть ли лучший способ настроить mapreduce, чтобы избежать посторонних записей? Я думал, что потенциально это возможно с лучшим пользовательским InputReader

Вопрос 3. Я предполагаю, что увеличение количества сегментов приводит к увеличению числа посторонних операций записи в хранилище данных из бухгалтерии mapreduce. Является ли ограничение осколков ожидаемым количеством объектов, которое мне нужно написать, надлежащим образом?


person dragonx    schedule 22.02.2012    source источник


Ответы (3)


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

person rbanffy    schedule 24.02.2012
comment
Memcache должен быть последовательным. Однако проблема заключается в том, что memcache не дает никаких гарантий, поэтому допустимые объекты потенциально могут просто исчезнуть из memcache, если они не сохранены в хранилище данных. - person dragonx; 26.02.2012

Это не совсем отвечает на ваш вопрос, но не могли бы вы уменьшить частоту работы cron?

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

Например:

import datetime

now = datetime.datetime.now(created_at)
five_minutes_ago = now - datetime.timedelta(minutes=5)
q = model.all()
q.filter('create_at >=', five_minutes_ago)

Или, если вы не хотите использовать фильтр неравенства, вы можете использовать == на основе пятиминутных блоков.

Затем вы запускаете свой cron каждый час или около того, чтобы очистить неактивные модели.

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

person Kyle Finley    schedule 02.03.2012
comment
Спасибо Кайл. Мне также необходимо своевременно уведомить создателей о том, что их объекты больше недействительны. Это отличное предложение, я буду иметь его в виду для будущей работы, но на этот раз оно не работает для меня. - person dragonx; 07.03.2012

Я предполагаю, что то, что я сделал, это лучший способ делать что-то. Похоже, API Mapreduce использует хранилище данных для отслеживания запущенных заданий и синхронизации рабочих процессов. По умолчанию API использует 8 рабочих процессов. Сокращение числа рабочих уменьшает количество операций записи в хранилище данных, но также снижает производительность времени стены.

person dragonx    schedule 15.03.2012