【问题标题】:Will caching or background job improve my Rails App performance?缓存或后台作业会提高我的 Rails 应用程序性能吗?
【发布时间】:2015-11-03 07:24:13
【问题描述】:

我的 Rails 应用通过 Nylas API 从 gmail 同步日历事件。我将所有事件和相关日历存储在我的应用程序上(创建新的或更新现有的)。这需要很长时间,事实上,每当我尝试同步日历时,我的 Heroku 托管 Rails 应用程序都会出现超时错误。不知道为什么需要很长时间。因此,为了做出反应,我想要么开始缓存(使用 Redis 或 Memcached)数据(仍然不知道我将如何做到这一点),要么在后台作业中运行同步(使用 Delayed_Job 或 Resque)。

我想知道其他人会如何解决这个问题。希望得到一些反馈,不仅要采取什么方法,而且如何方面的指针也将不胜感激。

【问题讨论】:

    标签: ruby-on-rails performance caching heroku


    【解决方案1】:

    如果您需要在应用中快速、持久地访问大量最终源自外部系统的日历事件,那么我会为日历和事件创建(实际上已经创建)模型。从 API 的结构来看,该结构应该是相当明显的,我会将它们保存在您的数据库中,以便您可以使用 ActiveRecord 方法来检索/排序它们。

    您不太可能需要模型顶部的缓存层。

    同步绝对是一项后台工作。

    【讨论】:

    • 也许我实现它的方式不正确,但我确实有映射到 API 的模型。当用户进入日历时,他们将同步以从谷歌获取最新的日历事件,并将在我的应用程序上创建的任何新事件推送到谷歌。问题是,我正在为“公司”(客户)的所有用户同步。这可能高达 20 个用户。我还在抓取所有日历事件(我认为我可以通过某种方式进行分块来做得更好)。
    • 何时同步?每次用户访问日历页面?这可能会导致我的应用出现竞争状况。还是只加载当月的日历事件更好(默认视图是月份)?问题是,一个用户可以看到任何其他用户的事件(基于权限),所以我不得不加载所有用户的事件。
    • 您可以使用后台作业按计划进行同步,这就是 Google 日历对远程链接日历所做的。让他们选择每小时、每 6 小时、每天、每周,也许还有一个“立即同步”按钮?
    • 谢谢!我想我更喜欢这种方法。
    【解决方案2】:

    您可以同时使用但主要是后台作业、delayed_job 或 sidekiq。 您还可以运行 cron 任务来定期更新应用程序中的日历数据。

    要获取数据,您可以从内存存储然后从数据库中获取,其中 memcache 将很有用。

    【讨论】:

    • 你说的 memcache,我也可以用 Redis 代替它,对吧?
    • 另外,我希望更新是按需的。因此,当用户要求同步时,我将运行后台作业。我担心这可能会导致竞争条件,因为后台作业将与最终用户同时添加/删除事件,最终用户将在线进行。
    • memcache 和 redis 都在内存中存储,但 memcache 集成更容易进行对象缓存。正如你所说,按需同步应该在后台工作中发生,竞争条件应该由谷歌日历本身处理。
    • 我在谈论我的应用程序上的竞争条件(因为我保留了来自谷歌的所有数据)。
    猜你喜欢
    • 2012-08-13
    • 2016-02-24
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 2018-04-03
    相关资源
    最近更新 更多