2013-07-15 7 views
8

मैं Dragonfly और rack/cache के संयोजन का उपयोग कर रहा हूं Heroku पर होस्ट किया गया।हेरोकू पर रैक/कैश के साथ 1 एमबी से अधिक फ़ाइलों को कैसे कैश करें?

मैं अपलोड की गई संपत्तियों के लिए ड्रैगनफ्लाई का उपयोग कर रहा हूं। थंबनेल को ऑन-द-फ्लाई पर संसाधित किया जाता है और मेमकैड से तेज वितरण के लिए रैक/कैश में संग्रहीत किया जाता है (Memcachier addon के माध्यम से)।

नियमित स्थैतिक संपत्तियों को रैक/कैश के माध्यम से memcached में भी कैश किया जाता है।

मेरी समस्या यह है कि 1 एमबी से अधिक अपलोड की गई फाइलें मेरे आवेदन में 500 त्रुटि उत्पन्न कर रही हैं।

2013-07-15T10:38:27.040992+00:00 app[web.1]: DalliError: Value too large, memcached can only store 1048576 bytes per key [key: d49c36d5db74ef45e957cf169a0b27b83b9e84de, size: 1502314] 
2013-07-15T10:38:27.052255+00:00 app[web.1]: cache: [GET /media/BAhbBlsHOgZmSSIdNTA3Njk3ZWFiODBmNDEwMDEzMDAzNjA4BjoGRVQ/WTW_A5Flyer_HealthcareMedicalObsGynae_WEB.pdf] miss, store 
2013-07-15T10:38:27.060583+00:00 app[web.1]: !! Unexpected error while processing request: undefined method `each' for nil:NilClass 

Memcache 1 एमबी की एक सीमा होती है, तो मैं समझ सकता हूँ क्यों मेरी संपत्ति कैश नहीं था, लेकिन मैं नहीं बल्कि यह की सेवा की संपत्ति नहीं तोड़ा जाएगा।

मुझे यह भी सुनिश्चित नहीं है कि यह त्रुटि कहां से आ रही है। संभवतः दूसरे रैक मिडलवायर में से एक से?

अधिकतम फ़ाइल आकार को बढ़ाने से कोई प्रभाव नहीं पड़ता है।

config.cache_store = :dalli_store, ENV["MEMCACHIER_SERVERS"].split(","), {¬ 
    :username  => ENV["MEMCACHIER_USERNAME"],¬ 
    :password  => ENV["MEMCACHIER_PASSWORD"],¬ 
    :value_max_bytes => 5242880 # 5MB¬ 
} 

दीर्घकालिक, मुझे पता है कि Heroku के बंद संपत्ति की इस तरह से आगे बढ़ एक समझदार कदम है, लेकिन यह एक त्वरित काम नहीं होगा।

त्रुटियों के बिना इस दौरान हेरोोकू पर इन संपत्तियों की सेवा के लिए मैं क्या कर सकता हूं?

उत्तर

7

मैं @jordelver रूप में एक ही मुद्दा था और बंदर पैचिंग Dragonfly::Response द्वारा दौर memcachier की सीमा पाने में कामयाब रहे:

module Dragonfly 
    class Response 
    private 
    def cache_headers 
     if job.size > 1048576 
     { 
      "Cache-Control" => "no-cache, no-store", 
      "Pragma" => "no-cache" 
     } 
     else 
     { 
      "Cache-Control" => "public, max-age=31536000", # (1 year) 
      "ETag" => %("#{job.signature}") 
     } 
     end 
    end 
    end 
end 

अनिवार्य रूप से, अगर आकार 1048576 बाइट्स खत्म हो गया है, नो कैश हेडर भेजें।

+0

यह समाधान सफलतापूर्वक मेरे लिए काम करता है। धन्यवाद! – Francois

+1

एफवाईआई बंदर-पैचिंग के बिना हेडर बदलने के लिए एक एपीआई है - http://markevans.github.io/dragonfly/configuration/ ("respond_header" बिट) –

9

तो @ जोर्डेलवर के प्रश्न के विपरीत, मुझे लगता है कि दल्ली के :value_max_bytes विकल्प को काम करना है। मैं रैक :: कैश को थोड़ा अलग तरीके से स्थापित कर रहा हूं जो शायद अंतर बनाता है।

यह मेरा production.rb क्या रैक कॉन्फ़िगर करने के लिए होता है :: कैश:

client = Dalli::Client.new(ENV["MEMCACHIER_SERVERS"], 
          :username => ENV["MEMCACHIER_USERNAME"], 
          :password => ENV["MEMCACHIER_PASSWORD"], 
          :value_max_bytes => 10485760) 
config.action_dispatch.rack_cache = { 
    :metastore => client, 
    :entitystore => client 
} 
config.static_cache_control = "public, max-age=2592000" 
ऊपर के साथ

, कुछ त्रुटियाँ 1 एमबी से अधिक मूल्यों के लिए लॉग के लिए प्रिंट किया जाएगा, लेकिन वे एक 5xx त्रुटि का कारण नहीं बनेगा ग्राहक के लिए, बस एक कैश मिस।

पीएस मैं मेमकैचियर के लिए काम करता हूं :) इसलिए हम इसे हल करने की कोशिश में रुचि रखते हैं। अगर यह काम करता है तो कृपया मुझे बताएं।

+0

एक उच्च value_max_bytes मान सेट करने से मेरे मामले में काम नहीं हुआ। – Francois

+0

इससे मुझे थोड़ा अलग समस्या पर सही दिशा में इंगित करने में मदद मिली, इसलिए डेविड धन्यवाद :) – robotmay

+0

ऐसा करने के लिए, आपको रैक-कैश मणि इंस्टॉल करना होगा। आम तौर पर आप 'config.cache_store =: dalli_store' जोड़कर' वातावरण/विकास.आरबी' में दल्ली चालू करते हैं।क्या आप यहां value_max_bytes निर्दिष्ट कर सकते हैं? धन्यवाद –

0

मेरे application.jsrack-cache के लिए बहुत बड़ा था, इसलिए मैंने किया:

# in config/environments/development.rb 
config.action_dispatch.rack_cache = { 
    metastore: 'file:/var/cache/rack/meta', 
    entitystore: 'file:tmp/cache/rack/body' 
} 

और यह काम करता है!

मेमकेचे में स्टोर मेटाडेटा लेकिन फाइल सिस्टम में वास्तविक फ़ाइल और स्मृति में नहीं।

+1

यह एक अच्छा विचार नहीं है कि आप हेरोकू पर चल रहे हैं Dynos मेटास्टोर साझा करेंगे, लेकिन फाइल सिस्टम नहीं। इसका मतलब है कि कभी-कभी आपकी फ़ाइल मेटास्टोर के अनुसार कैश की जाएगी लेकिन फाइल सिस्टम से गायब हो जाएगी और यह नहीं मिलेगी। – jordelver

+0

क्या आप Memcache में फ़ाइलों को संग्रहीत करने की सलाह देते हैं? – Dorian

+0

और बीटीडब्लू, यह 'development.rb' – Dorian

संबंधित मुद्दे