提高此服务器代码的性能以查找域名?

时间:2012-09-27 21:51:15

标签: ruby-on-rails ruby ruby-on-rails-3 performance optimization

我们使用Ruby来检查域可用性,但代码运行缓慢。我们跨请求缓存Whois对象会加快性能,但SO上的其他帖子表明,如果有的话,这只会略微提高性能。

代码非常简单。我们不确定是否可以进行其他改进,或者由于Whois对象而导致我们只是因为查找速度慢而停滞不前。

bulk_check 方法接受要查找的域数组。其他一切都是不言自明的。

我们在Rails 3上。

有什么建议吗?

谢谢!

def bulk_check
    domains = params[:domains] || '[]'
    callback = params[:callback] || ''      
    results = []
    threads = []

    # String -> Array
    domains = ActiveSupport::JSON.decode domains

    # Iterate over each domain and spawn new thread to check domain status
    domains.each do |d|
      threads << Thread.new(d) { |my_domain|
        Thread.current['domain'] = my_domain
        Thread.current['status'] = get_domain_status my_domain
      }
    end

    # Wait for threads to finish and update results array
    threads.each do |t| 
        t.join
        results.push [ t['domain'], t['status'] ]
    end

    # Render results
    respond_to do |type|
        type.json { render :json => { :results => results }.to_json, :callback => callback }
    end
end


def get_domain_status domain
    begin
        # Create Whois object
        whois = Whois::Client.new

        # Query Whois for domain data
        result = whois.query domain

        # Prep JSON response
        status = result.available? ? 'available' : 'taken'
    rescue Exception => e
        puts "Exception in parsing '#{domain}' status: #{e.message}"
        status = 'error'
    end

    # Return status
    return status
end

1 个答案:

答案 0 :(得分:0)

由于这不是CPU密集型操作,而是“网络密集型” - 考虑使用Ruby线程或光纤同时检查多个域。

例如,Celluloid gem让它变得简单易用:https://github.com/celluloid/celluloid/