Использование redis в поточной установке jruby

Так что гем redis должен быть потокобезопасным, это хорошо. Но мне интересно, как мне нужно это настроить. Я использую jRuby и Celluloid (используя волокна по умолчанию).

Теперь я использую его, у меня есть глобальный метод:

def redis
  @_redis ||= Redis.new(...)
end

У меня параметр тайм-аута для клиента Redis установлен на 30. Я не думаю, что у меня возникают какие-либо проблемы с безопасностью потоков (я инициализирую его перед порождением потоков), однако иногда я начинаю получать ошибки Redis::TimeoutError, так что мне интересно, могут ли эти потоки сохранять открытые соединения вечно и в конечном итоге занимать все доступные?

В основном проблема в том, что иногда я получаю Redis::TimeoutError. Есть ли способ проверить, какие соединения открыты в какой-то момент? Или есть идеи, в чем проблема?

Спасибо

1 ответ

Решение

Проблема здесь в том, что клиент redis блокируется исключительно (вы можете убедиться, что, измеряя время, которое требуется команде для потоков 1,2,3 и т. Д., Она, скорее всего, будет линейной).

Здесь есть два решения:

  1. создайте новый клиент для каждого потока (будьте осторожны, он оставит у вас много открытых файлов, а в течение длительного процесса он убьет вашу машину)
  2. реализовать пул соединений
  3. использовать этот драгоценный камень в качестве пула соединений (я еще не проверял его)
Другие вопросы по тегам