Каков наилучший способ синхронизировать большое количество небольших данных между приложением Mac и Интернетом? - PullRequest
4 голосов
/ 26 февраля 2012

Я рассматриваю MongoDB прямо сейчас.Именно поэтому цель ясна: вот что должно произойти: в моем приложении Finch (подробности по finchformac.com) у меня есть тысячи и тысячи записей в день для каждого пользователя того окна, которое они открыли, во время его открытия,время, когда они закрыли его, и тег, если они выбирают один для него.Мне нужно, чтобы эти данные были сохранены в онлайн-хранилище, чтобы они могли синхронизироваться с другими компьютерами Mac и т. Д. Мне также нужно иметь возможность рисовать диаграммы из своих данных в Интернете, что означает, что некоторые сложные запросы затрагивают сотни тысяч записей.

Прямо сейчас я попытался использовать Ruby / Rails / Mongoid с парсером JSON на стороне приложения, отправляя данные с шагом 10 000 записей за раз, данные обрабатываются в другие коллекции с помощью фонового задания mapreduce.Но все это, кажется, блокирует и в конечном итоге слишком медленно.Какие рекомендации (если кто-нибудь) есть, как это сделать?

1 Ответ

1 голос
/ 12 марта 2012

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

Проблемы (как я понимаю):

  1. У вас есть приложение, которое собирает данные.Вам просто нужно хранить эти данные где-то локально, пока они не будут синхронизированы с сервером.
  2. Вы получили данные на сервер, и теперь вам нужно поместить их в базу данных достаточно быстро, чтобы они неНе замедляйтесь.
  3. Вы должны сообщить об этих данных, и это звучит сложно и сложно.

Вы, вероятно, хотите написать это как своего рода API, для простоты(и так как у вас есть множество свободных циклов обработки на клиентах), вы захотите, чтобы эти куски данных обрабатывались на стороне клиента в JSON и могли быть импортированы в базу данных.Когда у вас есть JSON, вам не нужен Mongoid (вы просто добавляете JSON в базу данных напрямую).Кроме того, вам, вероятно, не нужны рельсы, поскольку вы просто создаете простой API, поэтому придерживайтесь только Rack или Sinatra (возможно, используя что-то вроде Grape ).

Теперь вам нужно решитьВ целом вопрос «кажется, все это блокирует и в конечном итоге слишком медленный».Мы уже удалили Mongoid (поэтому не нужно конвертировать из JSON -> Ruby Objects -> JSON) и Rails.Прежде чем приступить к выполнению MapReduce для этих данных, необходимо убедиться, что они загружаются в базу данных достаточно быстро.Скорее всего, вам следует спроектировать все это так, чтобы ваш MapReduce поддерживал вашу функциональность отчетов.Для синхронизации данных вам не нужно ничего делать, кроме как передавать JSON.Если ваши данные не записываются в вашу БД достаточно быстро, вам следует рассмотреть вопрос Sharding вашего набора данных .Вероятно, это будет сделано с использованием некоторого пользовательского ключа, но вы знаете свою схему данных лучше, чем я.Вам необходимо выбрать ключ шардирования, чтобы при одновременной синхронизации нескольких пользователей они могли использовать разные серверы.

После того, как вы решите проблемы 1 и 2, вам нужно будет работать над своими отчетами.Вероятно, это поддерживается вашими функциями MapReduce в Mongo.Мой первый комментарий к этой части, чтобы убедиться, что вы используете хотя бы Mongo 2.0. В этом выпуске 10gen ускорился MapReduce (мои тесты показывают, что он значительно быстрее, чем 1.8).Кроме этого, вы можете добиться дальнейшего увеличения, используя Sharding и направляя операции чтения на Вторичные серверы в вашем наборе Replica (вы используете набор Replica?).Если это все еще не работает, рассмотрите возможность структурирования вашей схемы для поддержки ваших функций отчетности.Это позволяет вам использовать больше циклов на ваших клиентах, чтобы выполнять работу, а не загружать ваши серверы.Но эту оптимизацию следует оставить до тех пор, пока вы не докажете, что обычные подходы не будут работать.

Я надеюсь, что стена текста в некоторой степени поможет.Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...