我正在开发一个 Rails 3.2 应用程序,用户可以在其中创建、阅读和更新多种报告。我们使用 MySQL 和 Redis。
当他们的一份报告在过去 X 个月内没有更新时,我想通过在浏览器中的个人资料/仪表板页面上向他们显示通知来通知他们。
我更愿意异步执行此操作。
在某些时候,我还希望有实时的应用程序内通知,这样当用户正在观看的报告已更新或有人喜欢他们的报告时,他们可以收到通知。从概念上讲,我正在考虑执行此操作的最佳方式...
一个 cron 作业运行 SQL 查询并检索所有包含 update_at 字段早于 3 个月的报告,并创建链接到该用户和报告的通知记录。仅当用户没有现有通知时才会创建新的通知记录。
后台作业,使用 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/