0

アプリケーション(シングルクライアント)をマルチテナントアプリケーションに変換しています。

以前は、いくつかの設定(めったに変更されない/非常に頻繁にアクセスされる)をグローバル変数(ハッシュ)に格納していました。このグローバル変数の値は、アプリケーションの起動時にDBから取得されました。明らかに、これらの設定はクライアント/テナントに固有です。

現在、いくつかのオプションが表示されていますが、どれも適切ではないようです。

  • グローバルハッシュを保持しますが、テナントの概念を導入します$global[:client1][:settingX]が、これは良い/スケーラブル/安全ではありません
  • 毎回DBを呼び出しますが、パフォーマンスが低下することを恐れています(DBへの追加の呼び出しは最大40回)

Memcacheでできることはありますか?しかし、オプションからどこから始めればよいのかわかりません。

注:アプリケーションはHerokuでホストされています

4

1 に答える 1

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
于 2013-02-06T16:42:58.340 に答える