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