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

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

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

当他们的一份报告在过去 X 个月内没有更新时,我想通过在浏览器中的个人资料/仪表板页面上向他们显示通知来通知他们。

我更愿意异步执行此操作。

在某些时候,我还希望有实时的应用程序内通知,这样当用户正在观看的报告已更新或有人喜欢他们的报告时,他们可以收到通知。从概念上讲,我正在考虑执行此操作的最佳方式...

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

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

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

最佳答案

我认为您不一定需要将 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 点。

从那里开始,如果您想为您的用户创建事件提要,您还可以非常简单地实现同步发布-订阅解决方案。例如,用户 A 订阅了用户 B 的报告,用户 B 发布了一个新报告,after_save 回调为用户 A 创建一个通知。这会比较慢,它不会实时,但是如果它是一个小应用程序并且这个功能是'如果不是核心部分,那么与其他选项相比,这可以更好地利用您的时间。

关于mysql - 当记录在 X 时间内未更新时通知用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37756470/

相关文章:

ruby-on-rails - 如何使用 simple_form 在 Rails 中上传多张图片?

ruby-on-rails - 如果添加尾部斜杠,Rails 4 中的 URL 会中断吗?

ruby-on-rails - 使用 每当 gem for Rails 在 cron 作业中重复进程

ruby-on-rails - 使用 utf8 字符的 ruby​​ 正则表达式在 rails 中的奇怪行为

php - Cron 正在运行但功能不工作

linux - cron 如何在内部安排作业?

php - ORM 的算法是什么?

java - 如何替换 H2 数据库中的枚举类型?

Python mysql.connector 错误

php - 显示 mysql 查询的内容,只有第一个字段有效