2013-02-06 14 views
0

我正在將我的應用程序(單個客戶端)轉換爲多租戶應用程序。Rails多租戶應用程序中全局變量的替代方案有哪些?

我用來將一些設置(很少更改/非常頻繁訪問)存儲到全局變量(哈希)中。 當應用程序啓動時,此全局變量的值從數據庫中取出。 顯然,這些設置是特定於客戶端/租戶的。

我現在看到幾個選項,但他們都不似乎不錯:

  • 維持全球哈希,但引進租戶$global[:client1][:settingX]的概念,但這種感覺並不好/可擴展性/安全
  • 每次撥打數據庫,但我擔心性能受到影響(約40個額外的電話到數據庫)

有什麼我可以用Memcache做什麼?但我不知道從哪裏開始選擇。

注:應用程序託管在Heroku

+0

爲什麼會是40個分貝電話?在這個典型的例子中爲 – KingCronus

+0

:因爲我需要執行40個貨幣轉換。所以如果兩次使用同一種貨幣,其中一些可能會被緩存,但我不能依賴這個假設。 我可能會一勞永逸地加載所有必要的匯率,但這根本不實際...... – Pierre

回答

0

這聽起來像一個偉大的論據使用的memcached或Redis的。你需要一個集中的地方,這些值可以存活,所有的應用服務器池都可以訪問這些值。你的用例主要是偶爾寫入來更新值。

我會構建一個貨幣助手,它可以根據請求從memcached/redis延遲加載一次,然後爲該請求中的任何值計算保存貨幣匯率數據。

我不知道你的問題域,但是讓我們假設你試圖爲系統中的不同用戶提供本地貨幣定價,並且不同用戶的利率是不同的(例如:折扣等)。

class CurrencyHelper 
    attr_reader :currency_rates 

    def initialize(user_id) 
    @currency_rates = load_or_generate_exchange_rates 
    end 

    def load_or_generate_exchange_rates 
    key = "/currency/rates/#{user_id}" 
    REDIS.get(key) || begin 
     rates = generate_exchange_rates 
     REDIS.put(key, rates) 
     rates 
    end 
    end 

    def convert_from_usd_to(amount_usd, currency) 
    round_money(usd * currency_rates[currency]) 
    end 
end 

在控制器代碼:

def currency_helper 
    @currency_helper ||= CurrencyHelper.new(current_user.id) 
    end 

    def show 
    localized_price = currency_helper.convert_from_usd_to(price_usd, params[:country_code]) 
    end