2011-11-17 6 views
12

मैं पेज इंप्रेशन रिकॉर्ड करने के लिए Impressionist का उपयोग कर रहा हूं। डेटाबेस लिखने में केवल 50ms लगते हैं, लेकिन पृष्ठ को प्रस्तुत करने के बाद मैं वास्तव में ऐसा करना पसंद करता हूं और क्लाइंट को भेज दिया जाता है।रेल में रेंडर करने के बाद कुछ कार्य कैसे करें 3.1

मैंने Spawn के माध्यम से फोर्किंग में देखा है, लेकिन यह एक नया डेटाबेस कनेक्शन स्थापित करता है, जो कि इस तरह के एक छोटे से काम के लिए ओवरकिल लगता है। देरी नौकरी और अन्य पृष्ठभूमि प्रसंस्करण पुस्तकालय प्रमुख ओवरकिल की तरह लगते हैं। डेटाबेस में लेखन को स्थगित करने के लिए डेटाबेस को लिखना ... जीत नहीं।

काश मैं सिर्फ किए जा सकेंगे:

def show 
    render 
    impressionist(@article) 
end 

... और बस के बाद कार्रवाई पहले से ही करने के लिए वापस आ गया है प्रभाववादी है एक ही डेटाबेस कनेक्शन और कार्रवाई के रूप में सभी एक ही अनुरोध डेटा के साथ अपने काम करते हैं, ग्राहक। लेकिन निश्चित रूप से यह नहीं है कि रेंडर विधि कैसे काम करती है।

कोई समाधान? हेरोकू सीडर पर रेल 3.1 और रुबी 1.9.2 चल रहा है।

+4

यह आपके विचार से कठिन है :) यहां से प्रेरणा लें: http://www.perfectline.ee/blog/ruby-on-rails-before-render-filter – apneadiving

उत्तर

0

मोंगोडब की तरह कुछ तेज़ी से लॉगिंग करने के बारे में, या आप रेडिस (अल्ट्रा फास्ट) में हैश स्टोर करने पर विचार कर सकते हैं और बैच नौकरी हर घंटे या तो अपने पोस्टग्रेज़ डेटाबेस में स्टोर करने के लिए चला सकते हैं। इन दोनों विकल्पों के साथ आपको इंप्रेशनिस्ट को हैक करना होगा, या अपने स्वयं के समाधान को रोल करना होगा, जैसा कि आपने पृष्ठभूमि समाधान (देरी_job, रेस्क इत्यादि) के साथ सुझाव दिया है, आपकी परियोजना के आकार के आधार पर अधिक हो सकता है।

1

इस तरह के लिए रेस्क का उपयोग करने पर एक बहुत अच्छा railscast है, लेकिन मुझे पूरा यकीन है कि इसमें अन्य सभी विधियों के रूप में भी शामिल है।

6

एक नया धागा स्पॉन करें। Heroku आपको प्रति dyno तक 15 धागे की अनुमति देगा।

def show 
    render 
    Thread.new do 
    impressionist(@article) 
    end 
end 
+1

बिंदु था, मैं चाहता था कि प्रक्रिया उपलब्ध हो एक नया अनुरोध थ्रेड के साथ, प्रक्रिया को समाप्त होने पर आपको या तो thread.join या थ्रेड समाप्त हो जाता है। – jasongarber

1

यह साथ आया था और होनहार लग रहा है: https://github.com/brandonhilkert/sucker_punch

ब्रैंडन के एक ठोस दोस्त। सकर पंच आउट करने की कोशिश करने के लिए इंतजार नहीं कर सकता!

+0

सॉकर पंच एक बहुत ही हल्के मणि (सेलूलॉयड में भारी भारोत्तोलन किया जाता है), ग्रोक के लिए आसान है। यह आपको एक व्यवस्थापक यूआई या कुछ भी नहीं देता है, लेकिन यह विज्ञापन करता है। अधिकांश वेबसाइटों को एकाधिक सर्वर की आवश्यकता नहीं होती है, लेकिन मल्टीथ्रेडिंग + CoW एक वीपीएस वातावरण में आसान है। बिना किसी परेशानी के पृष्ठभूमि प्रक्रिया शुरू करना एक अच्छा तरीका है। – julian7

0

मुझे लगता है कि आप

class ApplicationController < ActionController::Base 

    after_filter :after_filter_cb 

    def after_filter_cb 
    # Some logic 
    end 

end 
1

निजी तौर पर after_filter कॉलबैक फ़ंक्शन का उपयोग कर सकते हैं, मैं शुरू करने की सलाह देते हैं होता नहीं 'नई थ्रेड "कार्रवाई से और फिर तत्व (रों) जो अभी भी में छेड़छाड़ कर रहे हैं करने के लिए पृष्ठभूमि धागा संदर्भ में गुजर एक और धागा धागे के बीच संघर्ष के कारण इस तरह की गड़बड़ी गैर-पुनरुत्पादनीय बग में बहुत जल्दी होती है।

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