2016-10-04 4 views
7

У меня есть приложение стиля tinder, которое позволяет пользователям оценивать события. После того, как пользователь оценивает событие, выполняется повторное задание фона, которое переписывает другие события на основе отзывов пользователей.Rails & Heroku: Сколько мне нужно рабочих/диносов

Это фоновое задание занимает около 10 секунд, и оно работает примерно 20 раз в минуту на пользователя.

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

Я смущен насчет Dynos, resque pool и redis соединений. Может ли кто-нибудь помочь мне понять разницу? Есть ли способ рассчитать это?

+0

Почему работа выполняется 20 раз в минуту на пользователя? Почему не только запуск, когда пользователь оценивает событие? – toddmetheny

+0

Это именно то, что он делает, пользователь «оценивает» 20 событий в минуту, прокручивая их («нравится» или «не нравится») –

ответ

4

Не уверен, что вы задаете правильный вопрос. Ваш реальный вопрос: «Как я могу получить лучшую производительность?» Не "сколько динов?" Просто добавление динозавров не обязательно даст вам лучшую производительность. Больше динов дает вам больше памяти ... поэтому, если ваше приложение работает медленно, потому что у вас заканчивается доступная память (т. Е. Вы работаете на swap), то более динамичными могут быть ответы. Если эти задания занимают 10 секунд для запуска, хотя ... память, вероятно, не является вашей реальной проблемой. Если вы хотите отслеживать использование вашей памяти, посмотрите инструмент визуализации, такой как New Relic.

Существует множество подходов к решению вашей проблемы. Но я бы начал с кода, который вы написали. Проводка некоторого кода на SO может помочь понять, почему эта работа занимает 10 секунд (отправьте код!). 10 секунд - это долгое время. Поэтому оптимизация запросов внутри этой работы почти наверняка поможет.

Другой кусок низко висящих фруктов ... переключитесь с resque на sidekiq для ваших фоновых работ. Действительно прост в использовании. Вы будете использовать меньше памяти и должны увидеть мгновенный удар производительности.

+1

Я собираюсь опубликовать еще один вопрос о SO с более подробной информацией. Благодаря! –

+0

Вот более подробный ответ на вопрос: http://stackoverflow.com/questions/40115387/rails-heroku-and-resque-long-running-background-job-optimization/40115470#40115470 –

0

Dynos: Это индивидуальные виртуальные/физические серверы. Подумайте, что они такие же, как и экземпляры EC2.

Redis Соединения: Индивидуальные соединения с экземпляром Redis.

Resque Pool: драгоценный камень, который позволяет запускать рабочих одновременно на одном и том же экземпляре dyno/instance.

+0

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

+0

Исправьте, что вам нужно увеличить количество динамиков на этом рабочем месте, если задания выполняются. Вам также необходимо убедиться, что у вас есть экземпляр redis, который может обрабатывать количество ваших работников. –

0

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

С точки зрения определения количества рабочих, которые вам понадобятся, вам нужно будет выполнить число пробегов в минуту (20) раз, сколько секунд потребуется, чтобы выполнить (10) раз число пользователей (10) , Это даст вам количество секунд в минуту, которое потребуется для работы на одного работника. 20 * 10 * 10 = 2000. Разделите это на 60 и у вас есть количество минут в минуту, 33.3. Поэтому, если у вас было 34 рабочих, и эти цифры были последовательными, они должны были быть в состоянии справиться с вещами.

Таким образом, вы не должны находиться в положении, когда вам нужно запустить 36 или более динамиков для всего 10 одновременных пользователей для алгоритма ранжирования. Это будет очень дорого.

Оптимизируйте свой алгоритм, попробуйте добавить больше кеширования и дайте Sidekiq попробовать. По моему опыту, Sidekiq может обрабатывать очередь в 10 раз быстрее, чем Resque. Это зависит от того, что делает ваша работа, и как вы используете каждый инструмент, но это стоит проверить. См. Sidekiq vs Resque.

+0

Спасибо, я посмотрю. –

0

Переопределение других событий - плохая идея.

Вы должны учитывать столбцы total_points и average_points для таблицы событий, и пусть ряды будут определяться по порядку по запросам. Как это.

class Event 
    has_many :feedbacks 

    scope :rank_by_total, -> { order(:total_points) } 
    scope :rank_by_average, -> { order(:average_points) } 
end 

class Feedback 
    belongs_to :event 
    after_create :update_points 

    def update_points 
     total = event.feedbacks.sum(:points) 
     avg = event.feedbacks.average(:points) 
     event.update(total_points: total, average_points: avg) 
    end 
end 

Так, Сколько рабочих/динамометрические стенды вам нужно?

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

+0

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

+0

Так что моя идея: Event has_many event_rankings и event_ranking принадлежит пользователю. Таким образом, каждый пользователь имеет свой собственный рейтинг событий ... –

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