【发布时间】:2017-05-24 07:16:58
【问题描述】:
要求:
我正在构建一个 Rails 应用程序,其主要功能是通过 API 使用的。我想跟踪为每个用户调用的对象的 API 使用情况,以便我可以向用户显示他们每个对象的指标,并根据总使用量对其进行计费。
我正在寻找一种数据结构或其他解决方案,让我能够跟踪和报告为给定资源(在本例中是属于用户的“流”对象)调用 API 的次数。
当前实施:
为了解决这个问题,我在我的模型中添加了一个“daily_calls”哈希字段,该字段具有按日期计算 API 调用次数的计数器。我还想添加一个低于一天的小时数的级别,但我知道在运行聚合查询(例如上个月的通话)时这不会非常高效。
# Flow daily_calls field example (Y => M => D)
{2016=>{12=>{14=>5}}, 2017=>{1=>{9=>6}}}
# Flow daily_calls example with hours (Y => M => D => H)
{2016=>{12=>{14=>{23=>5}}}, 2017=>{1=>{9=>{3=>4,4=>2}}}}
目前我在调用 API 时使用一种方法更新计数,并且我有一些方法可以为特定对象聚合数据:
class Flow < ApplicationRecord
belongs_to :user
...
# Update usage metrics
def api_called
update_lifetime_count!
update_daily_count!
end
# Example method for displaying usage
def calls_in_month(date)
return 0 unless daily_calls[date.year] && daily_calls[date.year][date.month]
daily_calls[date.year][date.month].values.sum
end
end
我对上面的解释越多,听起来就越疯狂!我希望该应用程序的容量很大,因此如果可以提供帮助,我不想创建过多的数据量,尽管将来保存有关 API 使用的更多信息可能会很有用,例如请求的地理位置/IP。
我正在考虑的另一种方法是每小时创建一个对象实例并在该对象上增加一个整数字段。然后我可以在一个时间范围内运行查询并对整数求和(这比所有这些哈希工作要容易得多)。
请求:
我怀疑这不是最佳解决方案,因此想知道最好的数据结构,或者是否有一个 gem 可以灵活地跟踪这些类型的用户活动并使用此信息向用于报告的用户和汇总使用情况。
它应该支持的一些示例用例:
- 按小时显示给定流(或更精细级别)的使用情况图表
- 显示属于给定用户的所有流在给定月份的 API 调用总数
- 报告给定时间段内所有用户的应用程序使用情况
【问题讨论】:
标签: ruby-on-rails database data-structures database-design