Стратегии сохранения Map Reduce для последующих запросов - PullRequest
1 голос
/ 26 октября 2010

Я использую Map Reduce с MongoDB. Упрощенный сценарий: есть пользователи, предметы и вещи. Предметы включают в себя любое количество вещей. Каждый пользователь может оценивать вещи. Карта уменьшения используется для расчета совокупного рейтинга для каждого пользователя по каждому элементу. Это сложная формула, использующая рейтинги для каждой вещи в элементе и время суток - это не то, что вы могли бы когда-либо индексировать, и, таким образом, сокращение карты - это идеальный подход к его вычислению.

Вопрос в том, чтобы: рассчитав результаты с помощью Map Reduce, какие стратегии используют люди для сохранения этих коллекций результатов для каждого пользователя в своих базах данных NOSQL?

1) По требованию с автоматическим удалением: сохраняйте их в течение некоторого установленного периода времени, а затем удаляйте их; восстановить их по мере необходимости, когда пользователь делает новый запрос?

2) По требованию никогда не удаляйте: храните их неограниченное время. Когда пользователь отправляет запрос и коллекция истекает по дате его использования, создайте ее заново.

3) Запланировано: регулярный процесс для обновления всех коллекций результатов для всех пользователей?

4) Другое?

1 Ответ

1 голос
/ 27 октября 2010

Лучшая стратегия зависит от характера вашей работы по сокращению карты.

Если вы используете отдельный вызов по уменьшению карты для каждого отдельного пользователя , я бы пошел спервая или вторая стратегия.Преимущество второй стратегии над первой заключается в том, что у вас всегда есть готовый результат.Поэтому, когда пользователь делает запрос, а результат устарел, вы все равно можете представить старый результат пользователю, одновременно запустив новый map-Reduce в фоновом режиме, чтобы сгенерировать новый результат для следующих запросов.Это имеет следующие преимущества:

  • Пользователю не нужно ждать завершения сокращения карты, что важно, если сокращение карты может занять некоторое время.Исключением является, конечно, самый первый вызов с уменьшением карты;на данный момент недоступен старый результат.
  • Вы автоматически запускаете map-Reduction только для активных пользователей, уменьшая нагрузку на базу данных.

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

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

Если пользователь может видеть только свои собственные оценки, я выбрал бы стратегию один или два или включил бы отметку времени lastActivity в профили пользователей и запустил приложение.общепринятая запланированная карта - сокращение задания для активного подмножества пользователей (стратегия 3).Если пользователь может видеть рейтинги других пользователей, я бы также выбрал стратегию 3, поскольку это значительно снижает сложность приложения.

...