当记录未在X时间内更新时通知用户

时间:2016-06-10 20:12:58

标签: mysql ruby-on-rails cron delayed-job resque

我正在开发一个Rails 3.2应用程序,用户可以在其中创建,读取和更新多种报告。我们使用MySQL和Redis。

我想通过在浏览器的个人资料/信息中心页面上显示通知来通知用户,他们的某个报告在过去的X个月内没有更新过。

我宁愿异步这样做。

在某些时候,我还希望提供实时的应用内通知,以便在用户正在观看的报告更新或有人喜欢他们的报告时通知用户。从概念上讲,我正在考虑实现这一目标的最佳方式......

  1. 运行SQL查询并检索update_at字段超过3个月的所有报表的cron作业,并创建链接到该用户和报表的通知记录。仅当用户没有现有通知时,才会创建新的通知记录。

  2. 后台作业,使用Resque等全天定期检查数据库的内容。通知存储在队列中。这似乎可以更好地扩展到更强大的应用内通知功能。

  3. 这些是我唯一的选择吗? 有没有更好的异步方式来监听数据库,并在3个月内没有更新其中一条记录时通知用户?这里是否需要一些websockets实现?

1 个答案:

答案 0 :(得分:0)

我不相信你一定需要将CPU周期用于一些经常运行的后台工作,但这取决于你想要这些通知的强大程度。如果您希望它们是实时的,并且您计划将来使用发布商订阅者模型,那么我consider a redis + node server setup.

websockets的复杂性意味着更多的实施时间。这花费的额外时间真的会让你受益吗?如果您的通知异步和实时非常重要,例如在聊天应用中交换消息或在Facebook上获取弹出通知,那么这是正确的选择。

但是,如果您真正想做的就是让用户知道他们的报告何时超过某个年龄,当他们请求他们的个人资料页面时,每隔几个小时运行一次的cron将更容易实现。您甚至可以使用Google Analytics(分析)来了解用户何时为您的应用施加最沉重的负担,并安排相关工作。

首先,创建一个完成上述行为的rake任务 - 检查旧报告并创建通知。把它放在你的应用程序的lib/tasks目录中。然后像这样编写一个cron作业:

$ 0 6,12,18 * * * cd /path/to/app && bundle exec rake task_name

此任务将每天运行3次,早上6点,中午12点和下午6点。

从那里,如果您想为用户创建活动源,您还可以非常简单地实现同步pub-sub解决方案。例如,用户A订阅用户B的报告,用户B发布新报告,after_save回调为用户A创建通知。这将更慢,它不会生效,但如果它&#39 ;一个小应用程序,这个功能不是核心部分,然后这比其他选项更好地利用你的时间。