【问题标题】:Call API but not for every user调用 API,但不是针对每个用户
【发布时间】:2020-08-09 21:51:24
【问题描述】:

我想做类似的事情:Rails way to call external API from view?

但我不想为用户的每个请求调用 API,因为这会给 API 服务器带来很多不必要的负载,并且会过快耗尽我的配额。

有没有办法缓存每 100 个用户的响应并将缓存的版本显示给所有其他用户或类似的东西?可能已经有一些东西可以做到这一点,但我对 Ruby 很陌生,希望能得到一些帮助。

【问题讨论】:

  • 由于配额限制,您希望保留哪些资源?缓存的请求可以避免数据库命中,但它仍然是一个 http 请求。

标签: ruby-on-rails ruby api


【解决方案1】:

有多种方法可以实现您的目标。我建议不要缓存每个 xxx 用户的响应,因为在流量比其他人更费力的日子和时间周围有很多变量。我建议您问问自己该方法的行为是什么。是提取一些复杂的数据还是只是一个简单的计数?如果实时信息不重要,缓存信息的可接受时间范围是多少?

如果上述问题的答案可以通过时间度量而不是xxx用户访问来回答,那么您可能希望通过在帮助程序中定义度量收集方法然后从视图中调用来使用内置的Rails.cache,

def method_to_call
   Rails.cache.fetch("some_method", expires_in: 1.hour) do
      SomeThing.to_cache
   end
end

从这里您可以预测您对 API 的访问并确定您在定义的时间段内的使用情况,而不必担心您的网站在一天中的什么时候可能更繁忙,或者应用程序使用量出现任何意外高峰。

如果你想缓存每个 xxx 用户的访问,我强烈推荐 redis。这是一款出色的软件,速度极快且可扩展。它是一个键值对存储,可以保存有关唯一用户和页面浏览量的数据。

另一个要问的问题是,您是在缓存单个用户还是单个页面视图?根据答案,您可以存储用户 ID 或页面查看次数,并有条件逻辑来刷新每个 xxx 指标上的缓存。如果您有尽职调查每周左右清理存储,性能应该不是太大问题,具体取决于存储的数据。

当您使用大规模缓存时,您可能需要考虑托管 Redis 实例的基础架构。您需要专用服务器吗? docker 是生产 redis 的可行选择吗?您可以在应用程序的同一实例上托管 redis 实例吗?所有这些可能的开销都有利于最初的方法,但同样取决于您的需求。

【讨论】:

  • 这太棒了!非常感谢您的帮助:) 不管它是什么用户,API 的结果都是一样的。我们的配额真的很有限:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-31
  • 2019-02-09
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
相关资源
最近更新 更多