Ostatnio przełączyłem się z domyślnego prostego backendu I18n na backend Redis dla mojego I18n. Zrobiłem to, więc ułatwiło nam obsługę tłumaczeń, ale zauważyłem, że na każdej stronie było znaczące uderzenie wydajności.Czy Redis jest zbyt wolny dla produkcji Railsów I18n?
Uruchomiłem niektóre testy porównawcze z Rails 3.2 i Redis 2.6.4 zainstalowanymi na moim MBP w celu zademonstrowania. Używam hiredis-rb jako mojego klienta.
Jest to dość wyraźna różnica podczas korzystania z dwóch różnych elementów zaplecza. Z prostego backend jest krótka przerwa na pierwsze wezwanie - Zakładam, że tłumaczenia są ładowane do pamięci - a potem wielkiej wydajności po tym:
pry(main)> Benchmark.realtime { 500.times { I18n.t 'shared.slogan' } }
=> 0.143246
pry(main)> Benchmark.realtime { 500.times { I18n.t 'shared.slogan' } }
=> 0.00415
pry(main)> Benchmark.realtime { 500.times { I18n.t 'shared.slogan' } }
=> 0.004153
pry(main)> Benchmark.realtime { 500.times { I18n.t 'shared.slogan' } }
=> 0.004056
Redis backend jest konsekwentnie powolna:
pry(main)> Benchmark.realtime { 500.times { I18n.t 'shared.slogan' } }
=> 0.122448
pry(main)> Benchmark.realtime { 500.times { I18n.t 'shared.slogan' } }
=> 0.263564
pry(main)> Benchmark.realtime { 500.times { I18n.t 'shared.slogan' } }
=> 0.232637
pry(main)> Benchmark.realtime { 500.times { I18n.t 'shared.slogan' } }
=> 0.122304
To ma dla mnie absolutny sens, dlaczego jest to powolne dla I18n ... Czekam na dziesiątki połączeń I18n w całej mojej bazie kodu. Gdybym mógł partia je razem z góry byłbym w dobrej kondycji:
pry(main)> keys = $redis.keys[0..500]
pry(main)> Benchmark.realtime { $redis.mget keys }
=> 0.04264
Ale ja nie widzę czystą sposób to zrobić z żadnym z istniejących backendów i18n. Czy ktoś tam rozwiązał ten problem?
EDIT
Wziąłem sugestię Chris Heald i stworzył backend z memoization prosty cache biust. Istotą jest tutaj:
https://gist.github.com/wheeyls/5650947
Postaram się to na kilka dni, a następnie przekształcić go w gem.
UPDATE
Moje rozwiązanie jest dostępne jako klejnot teraz:
https://github.com/wheeyls/cached_key_value_store
I również napisał o tym problemie:
http://about.g2crowd.com/faster-i18nredis-on-rails/
Gdzie jest twój serwer redis w odniesieniu do skrzynki z tymi wzorcami? – deefour
Te zostały uruchomione na mojej lokalnej maszynie. Zmienię moje pytanie, by wyjaśnić. – Wheeyls