
K,现在结束了……
我在Heroku上有一个Rails API服务器.我使用俄语玩偶缓存对RABL进行了大量优化,以改善集合中底层对象的重用.虽然,我仍然留有收集缓存,当用户在第一次请求时生成时,是体验的负担(例如1秒API呼叫).
在调试示例API调用时,我在给定对象上获得以下缓存 *** 作.
… API / v1 / activitIEs / 26600:
Cache read: rabl/activitIEs/26600-20140423170223588554000//hash/d30440d18014c72014a05319af0626f7 Cache generate: rabl/activitIEs/26600-20140423170223588554000//hash/d30440d18014c72014a05319af0626f7 Cache write: rabl/activitIEs/26600-20140423170223588554000//hash/d30440d18014c72014a05319af0626f7
所以对于调用… API / v1 / activitIEs时的同一个对象(在上面的调用之后),我得到了所需的缓存命中:
Cache read: rabl/activitIEs/26600-20140423170223588554000//hash/d30440d18014c72014a05319af0626f7 Cache fetch_hit: rabl/activitIEs/26600-20140423170223588554000//hash/d30440d18014c72014a05319af0626f7
这非常有效.下一步是避免让第一个/任何API调用花费时间来生成缓存.
所以我一直在寻求缓存加温技术来在用户访问它们之前生成这些集合.一个建议是使用wget作为直接命中API的方法(参见https://stackoverflow.com/a/543988/451488).但是这增加了Heroku web dynos的负担,所以我想通过sIDekiq工作人员来缓存变暖.
RABL提供了一种直接从代码渲染模板的方法(https://github.com/nesquena/rabl#rendering-templates-directly),这对于这个用例来说肯定是正确的方法.因此,我的目的是在API调用之前通过某个事件调用RABL引擎(例如 – 用户登录事件).
因此,对于上面的API示例,我将在rails控制台中调用以下内容并期望缓存命中.
irb(main):002:0> @activity = Activity.find(26600)irb(main):003:0> Rabl.render(@activity,'API/v2/activitIEs/show_no_root',:vIEw_path => 'app/vIEws',:format => :Json) Cache read: rabl/activitIEs/26600-20140423170223588554000//hash Cache generate: rabl/activitIEs/26600-20140423170223588554000//hash Cache write: rabl/activitIEs/26600-20140423170223588554000//hash
出乎意料的是,我没有得到缓存命中,但很明显缓存密钥不一样,因为缺少尾随哈希签名.我不确定为什么缓存密钥在这种情况下会有所不同.我无法为RABL模板加热缓存.
UPDATE
结果是尾随缓存键中的哈希值是模板哈希值.
Cache digest for API/v1/activitIEs/_show.rabl: d30440d18014c72014a05319af0626f7
虽然这告诉我该哈希的来源,但仍然不清楚为什么直接调用Rabl :: Renderer也不会使用它.
解决方法 由于缓存键中缺少模板摘要哈希,我无法使用Rabl :: Render.但是通过创建一个sIDekiq worker,如下所示,我可以通过调用API作为后台进程来加热缓存,这很好用.class CacheWarmAPI include SIDekiq::Worker sIDekiq_options :queue => :warmers def perform( url_helper,args,params={},method='get') if method == 'get' session = Actiondispatch::Integration::Session.new(Rails.application) session.get(session.send(url_helper,*args),params) end end end 例如 :
CacheWarmAPI.perform_async( :API_v2_expensiveAPI_url,args_array,params_hash)
我认为这有点过于沉重的解决方案,并且仍然认为Rabl :: Render有一个解决方案.
总结以上是内存溢出为你收集整理的ruby-on-rails – 使用RABL为JSON模板缓存变暖全部内容,希望文章能够帮你解决ruby-on-rails – 使用RABL为JSON模板缓存变暖所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)