Подтвердить что ты не робот

Внедрение уведомлений в Rails

В моем приложении я хочу уведомить пользователя, когда он упоминается в комментарии или сообщении.
Пользовательский дескриптор @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, и всякий раз, когда новый комментарий/сообщение сохраняется в базе данных, я могу просматривать содержимое сообщения/комментария и следить за любыми упоминаниями, а затем выполнять уведомления как требуется.

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

4b9b3361

Ответ 1

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 тыс. Уведомлений в день. После того, как у вас возникнут проблемы с производительностью, отбросьте Observer и Pusher для чего-то вроде Goliath, который может обрабатывать обе эти задачи локально.

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

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

Для этого нет единого рекомендованного подхода. На уровне uber вы можете посмотреть "" Программирование комет "," Опрос "и" WebSockets" [HTML5], а затем выбрать правильную комбинацию. Существует несколько отличных реализаций для управления push-уведомлениями в рельсах. Orbited, Juggernaut, PusherApp, Faye и т.д. Вам нужно будет глубоко изучить, какой из них использует сетевые сокеты и опция fall-back to flash для полной поддержки.

Faye также дает конфигурацию Node.js, но я не уверен в других.

Ориентировочно этапы выглядят примерно так:

  • Сохранить содержимое - очередь на парсер
  • Проанализируйте содержимое, чтобы узнать вовлеченных пользователей. Используйте Nokogiri или эквивалент.
  • Comet/Опросите его, чтобы вовлечь пользователей в current_session как отдельный процесс, если вы смотрите на подход Twitter.
  • //Делаем другие вещи с записью Post
  • Отправлять уведомления вовлеченным пользователям и уничтожать(), когда они выйдут позже.

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

Ответ 6

Я знаю, что этот вопрос устарел, но недавно я недавно выпустил GentonSync для 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

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

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], а затем создаст упоминания в базе данных, после каждого из упоминаний он выполнит обратный вызов после того, как в этом примере будет отправлено электронное письмо с уведомлением об упоминании сообщения и пользователя.