Реализация уведомлений в Rails - PullRequest
18 голосов
/ 21 июля 2011

В моем приложении я хочу уведомить пользователя, когда он / она упоминается в комментарии или посте.
Дескриптор пользователя - @user_name, похож на Facebook .
Таблица базы данных для упоминаний выглядит так:

Mention
  mentioned_by: user_id (foreign key)
  user_mentioned: user_id (foreign key)
  comment_id: (foreign key)
  post_id: (foreign key)

Хотя я не могу найти способ реализовать это. Как это делают Facebook / Twitter?

Я решил использовать ActiveRecord callbacks/ Observer design pattern, и всякий раз, когда новый комментарий / запись сохраняется в базе данных, я могу просмотреть содержимое записи / комментария, найти любые упоминания и затем выполнить уведомления. по мере необходимости.

У меня такое ощущение, что есть некоторые недостающие фрагменты, и я не понимаю это правильно.
Это лучший способ сделать это?

Ответы [ 6 ]

27 голосов
/ 13 августа 2011

Facebook и Twitter не являются средними приложениями Rails.Это компании.Технология, которая ими управляет, распространяется и в основном на заказ, особенно в случае с Facebook.

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

http://www.quora.com/What-is-Facebooks-architecture

Архитектура Facebook

http://www.infoq.com/news/2009/06/Twitter-Architecture

http://engineering.twitter.com/2010/10/twitters-new-search-architecture.html

Много больше сочногоподробности в Quora.


К сожалению, ничто из этого не приближает вас к вашей цели.Я думаю, что наиболее реалистичной вещью для вас, чтобы начать с woud, будет просто подключить сервис, такой как Pusher , чтобы отправлять сообщения клиентам, не беспокоясь об этом, используйте ActiveRecord Observer добавить уведомления в фоновую очередь , где работники фактически отправляют эти уведомления в Pusher.Это рабочий день или меньше, и он должен хорошо масштабироваться до 10 000 уведомлений в день.Как только у вас начнутся проблемы с производительностью, уговорите Observer и Pusher на что-то вроде Goliath, которое может обрабатывать обе задачи локально.

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

Надеюсь, это поможет вам в правильном направлении.:)

3 голосов
/ 21 июля 2011

Вы можете использовать обратные вызовы ActiveRecord при сохранении записи (например, before_save, after_save или before_create, after_create), чтобы просматривать содержимое комментариев, находить и создавать все упоминаемые модели и сохранять их в БД.

2 голосов
/ 30 июля 2011

Tumblr использует систему очередей Redis (например, Resque), которую я считаю для обработки тома.

Сделайте обратный вызов (как вы упомянули) и передайте его Resque.(Недавно были опубликованы Railscasts )

2 голосов
/ 30 июля 2011

Я на самом деле заинтересован в конкретном ответе на это сам.Я не знаю, как это делают Facebook и Twitter, но из общих поисков я знаю, что гем действует-как-taggable-on может выполнить свою работу.Проверьте https://github.com/mbleigh/acts-as-taggable-on.

Кроме того, этот вопрос по stackoverflow может также предоставить вам некоторую информацию: Реализация хештега в стиле twitter на рельсах

Удачи.Я призываю вас попытаться привлечь больше внимания к этому вопросу и получить более твердый ответ, чем я сказал.:]

1 голос
/ 29 сентября 2014

Я знаю, что этот вопрос устарел, но недавно я выпустил гем MentionSystem для rubygems.org, который позволяет создавать упоминания между объектами упоминания и упоминателями, а также позволяет обнаруживать упоминания в стайлере facebook / twitter, такие как @ username1 и #hashtag вЧтобы создать упоминания.

Самоцвет размещен на github: https://github.com/pmviva/mention_system

Допустим, у вас есть сообщение, в котором могут упоминаться пользователи в форме @ username.

у вас есть класс

class Post < ActiveRecord::Base
  act_as_mentioner
end

и

class User < ActiveRecord::Base
  act_as_mentionee
end

Затем вы определяете пользовательский процессор упоминаний:

class PostMentionProcessor < MentionSystem::MentionProcessor
  def extract_mentioner_content(post)
    return post.content
  end

  def find_mentionees_by_handles(*handles)
    User.where(username: handles)
  end
end

Затем в вашем контроллере Posts создайте действие, которое у вас есть:

def create
  @post = Post.new(params[:post])
  if @post.save
    m = PostMentionProcessor.new
    m.add_after_callback Proc.new { |post, user| UserMailer.notify_mention(post, user) }
    m.process_mentions(post)
  end

  respond_with @post
end

Если в вашем сообщении содержится @ user1, @ user2 и @ user3, упомянутый процессор проанализирует user1, user2, user3, найдет пользователей с именем пользователя [user1, user2, user3], а затемсоздайте упоминания в базе данных, после каждого упоминания будет выполняться обратный вызов after, который в примере отправит электронное письмо с уведомлением об упоминании между постом и пользователем.

1 голос
/ 13 августа 2011

Единого рекомендуемого подхода для этого не существует. На более высоком уровне вы можете посмотреть ' Программирование Comet ', Polling и WebSockets [HTML5] и затем выбрать правильную комбинацию. Есть несколько отличных реализаций для управления push-уведомлениями в рельсах. Orbited, Juggernaut, PusherApp, Faye и т. Д. Вам нужно будет покопаться, чтобы выяснить, кто из них использует веб-сокеты и использовать опцию возврата к флэш-памяти для полной поддержки.

Фэй также предоставляет конфигурацию Node.js, но я не уверен насчет других.

Ориентировочно шаги будут выглядеть примерно так:

  1. Сохранить содержимое - поставить его в очередь на анализатор
  2. Разобрать содержимое, чтобы найти вовлеченных пользователей - используйте Nokogiri или эквивалентный.
  3. Комета / Опросите его для вовлеченных пользователей в current_session как отдельный процесс, если вы смотрите на подход, подобный Twitter.
  4. // Делать другие вещи с записью Post
  5. Push-уведомления для вовлеченных пользователей и destroy (), когда они выходят в сеть позже

    Надеюсь, это даст какое-то направление.

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