Использование redis в поточной установке jruby
Так что гем redis должен быть потокобезопасным, это хорошо. Но мне интересно, как мне нужно это настроить. Я использую jRuby и Celluloid (используя волокна по умолчанию).
Теперь я использую его, у меня есть глобальный метод:
def redis
@_redis ||= Redis.new(...)
end
У меня параметр тайм-аута для клиента Redis установлен на 30. Я не думаю, что у меня возникают какие-либо проблемы с безопасностью потоков (я инициализирую его перед порождением потоков), однако иногда я начинаю получать ошибки Redis::TimeoutError, так что мне интересно, могут ли эти потоки сохранять открытые соединения вечно и в конечном итоге занимать все доступные?
В основном проблема в том, что иногда я получаю Redis::TimeoutError. Есть ли способ проверить, какие соединения открыты в какой-то момент? Или есть идеи, в чем проблема?
Спасибо
1 ответ
Проблема здесь в том, что клиент redis блокируется исключительно (вы можете убедиться, что, измеряя время, которое требуется команде для потоков 1,2,3 и т. Д., Она, скорее всего, будет линейной).
Здесь есть два решения:
- создайте новый клиент для каждого потока (будьте осторожны, он оставит у вас много открытых файлов, а в течение длительного процесса он убьет вашу машину)
- реализовать пул соединений
- использовать этот драгоценный камень в качестве пула соединений (я еще не проверял его)