在我的申请中,我想在评论或帖子中提及他/她时通知用户 .
用户句柄为 @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 回答
Tumblr使用Redis排队系统(如Resque)我相信处理音量 .
做一个回调(如你所提到的)并将其交给Resque . (有一个Railscasts about Resuqe recently)
Facebook和Twitter不是中型Rails应用程序 . 他们是公司 . 运行它们的技术是分布式的,主要是定制的,特别是在Facebook的情况下 .
您似乎正在 grab 的部分是他们如何确定以高性能和可扩展的方式通知的人 . 这就是狗屎变得真实的地方 . 你可以找到很多关于它们背后的架构的信息,当然有许多很棒的东西可以帮助你思考这些东西,但最终它们都不会成为你实现的任何应用程序 . 重建 .
http://www.quora.com/What-is-Facebooks-architecture
Facebook Architecture
http://www.infoq.com/news/2009/06/Twitter-Architecture
http://engineering.twitter.com/2010/10/twitters-new-search-architecture.html
Quora的细节更加丰富多彩 .
不幸的是,这一切都无法让您更接近目标 . 我认为对你来说最真实的事情就是简单地绑定像Pusher这样的服务来向客户发送消息而不用担心它,使用ActiveRecord Observer将通知添加到工作人员实际发送通知的background queue推送 . 这是一天或更少的工作,它应该可以很好地扩展到每天至少10k通知 . 一旦你开始遇到性能问题,抛弃Observer和Pusher就像Goliath这样可以在本地处理这两个工作的东西 .
最重要的是,了解大型和经验丰富的系统可以了解的内容,但主要是看看他们遇到了什么问题以及他们如何解决这些问题 . 这些方法在大家伙中并不相同,并且每种实现方式都会有所不同 .
希望这有助于指明你的方向 . :)
您可以在保存记录时使用ActiveRecord回调(如before_save,after_save或before_create,after_create)来浏览评论内容,查找并创建所有提及模型并将其保存到db .
我实际上对自己的具体答案感兴趣 . 我不知道Facebook和Twitter是如何做到这一点的,但我从一般搜索中知道,gem可以作为标记可以完成工作 . 看看https://github.com/mbleigh/acts-as-taggable-on .
此外,stackoverflow上的这个问题也可能为您提供一些信息:Implementing twitter-like hashtag on rails
祝好运 . 我鼓励你尝试更多地关注这个问题,并得到比我所说的更加坚实的答案 . :]
没有单一的推荐方法 . 在一个超级级别,你可能想要看看'Comet programming ', Polling and WebSockets [HTML5] and then choose the right combination. There are a couple of great implementations to manage push notifications in rails. Orbited, Juggernaut, PusherApp, Faye etc. You'我必须深入挖掘哪些'他们使用网络套接字&并且回退到闪存选项来处理完全支持 .
Faye也提供了Node.js配置,但我不确定其他人 .
暂时的步骤看起来像:
保存内容 - 将其排入解析器
解析内容以找出涉及的用户 - 使用Nokogiri或同等产品 .
Comet /将其作为一个单独的过程投票给current_session中的相关用户,如果你正在看Twitter这样的方法 .
//使用Post记录做其他事情
向相关用户推送通知,并在以后联机时推送destroy() .
希望能给出一些指导 .
我知道这个问题已经过时了,但我最近发布了一个MentionSystem gem给rubygems.org,它允许在提及对象和提及者之间创建提及,它还允许你在@ username1和#hashtag中检测facebook / twitter样式中的提及以便创建提到 .
宝石托管在github:https://github.com/pmviva/mention_system
假设您有一个可以以@username的形式提及用户的帖子 .
你有 class
和
然后定义一个自定义提示处理器:
然后在你的帖子中控制器创建您拥有的操作:
如果您的帖子在其内容中有@ user1,@ user2和@ user3,提及处理器将解析user1,user2,user3,将找到用户名为[user1,user2,user3]的用户,然后在每个用户之后创建数据库中的提及提到它将运行后回调,在该示例中将发送电子邮件通知帖子和用户之间的提及 .