2012-06-21 15 views
10

मैं गोलीथ फ्रेमवर्क के साथ एसिंक एपीआई बनाने की कोशिश कर रहा हूं। सेवा mysql को लिखनी चाहिए, RabbitMQ को संदेश जोड़ें और प्रतिक्रियाएं वापस प्राप्त करें। रेल के साथ निर्मित एक अलग व्यवस्थापक आवेदन भी होना चाहिए। मेरे पास इसके बारे में कई प्रश्न हैं:रेल ऐप और गोलीथ एपीआई और डेटाबेस/मॉडल साझा करना

क्या रेल और गोलीथ के बीच प्रभावी ढंग से मॉडल साझा करने का कोई तरीका है? क्या एक्ट्रेकॉर्ड या एम के साथ किसी अन्य ओएम का उपयोग करने में कोई समस्या है? क्या कोई सर्वोत्तम प्रथाएं, कॉन्फ़िगरेशन (कनेक्शन पूल आकार, ड्राइवर) या इसके बारे में अन्य विकल्प हैं? AMQP से संदेश प्राप्त करने के लिए मुझे क्या उपयोग करना है? क्या एक अलग इवेंटमैचिन डिमन बनाने के लिए बेहतर होगा या मैं उस सामान के लिए गोलीथ के किसी भी तरह का उपयोग कर सकता हूं? अग्रिम के लिए धन्यवाद।

उत्तर

4

गोलीथ में ActiveRecord मॉडल का उपयोग करने के लिए यहां एक त्वरित हैक है। इस दृष्टिकोण के साथ आप आवश्यकता का उपयोग किए बिना मॉडल का उपयोग कर सकते हैं, लेकिन आपके पास मॉडल स्तर पर संबंध नहीं हैं। Has_many और संबंधित_ संबंधों (इस दृष्टिकोण में) प्राप्त करने के लिए, मैं मॉडल फ़ाइल लोड करूंगा और नीचे दिए गए वर्ग परिभाषा पाश में ऐसे शब्द वाले रेखाएं शामिल करूंगा।

require 'goliath' 
    require 'active_record' 
    require 'active_support' 

    # The location of the Rails app to integrate 
    RAILS_APP ||= ENV['HOME']+"/dev/qtrack" 

    # Load the ActiveRecord database configuration, development settings 
    configpath = File.join(RAILS_APP, "config", "database.yml") 
    config = YAML::load_file(configpath) 
    ActiveRecord::Base.establish_connection config["development"] 

    # Set the names of all Rails models to a constant 
    MODELS ||= [] 
    models_dir = File.join(RAILS_APP, "app", "models") 
    model_names = Dir[models_dir+"/*.rb"] 

    # Loop over each file name, define a class for each 
    model_names.each do |fname| 
     mname = File.basename(fname, '.rb').titleize.sub(/ /, '') 
     eval %Q{ 
     class ::#{mname} < ActiveRecord::Base 
     end 
     } 
     m = mname.constantize 
     MODELS << m unless MODELS.include?(m) 
    end 

    class Hello < Goliath::API 
     # default to JSON output, allow Yaml as secondary 
     use Goliath::Rack::Render, ['json', 'yaml'] 

     def response(env) 
     # Create a Hash with each model name and the object count 
     models = MODELS.inject({}) {|hsh,model| hsh[model] = model.count; hsh } 
     [200, {}, models.to_json ] 
     end 
    end 

यह आपकी प्रतिक्रिया के आधार पर एक हैक है।

+0

बीटीडब्ल्यू: ActiveRecord मणि 'activerecord' है, आवश्यकताएं दिखाए गए हैं। – ringe

+1

अपने उदाहरण में आप रेल के साथ मॉडल साझा नहीं करते हैं। अगर हमारे पास मॉडल में बहुत तर्क है तो बस उन्हें जरूरी नहीं है। तुल्यकालिक तर्क decoupling की आवश्यकता है। साथ ही, जैसा कि आप जानते हैं कि एसक्लाइट में एसिंक ड्राइवर नहीं है – Bombazook

+1

मैंने आवश्यकता के बिना रेल मॉडल का उपयोग दिखाने के लिए उदाहरण संपादित किया है। SQlite के साथ समस्या एक अलग डेटाबेस का उपयोग कर सबसे अच्छा हल किया जाता है। – ringe

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