@Fly3110
web developer

Насколько безопасно сохранять модель в отдельном потоке?

Всем привет.

Есть модель, которая может сохраняться довольно продолжительное время. Около секунды, но для веб приложения это критично.

Насколько оправдан такой подход?

Thread.new do
  model_instance.save
end


факт того, сохранилась ли модель не особо важен. В 99.99% случаев она сохранится, ошибки все равно попадут в лог.

Вопрос в том, не наступлю ли я на какие-то грабли, если запрос уже будет завершен, а модель еще не будет сохранена? Так как сохраняется модель почти перед самой отправкой ответа пользователю.
Сервер - puma

Спасибо.
  • Вопрос задан
  • 183 просмотра
Решения вопроса 1
vick
@vick
Пишу на RoR
Вполне вероятно, что тут уже можно подумать над какими-то инструментами для работы с фоновыми задачами и отдавать что-то "долгоиграющее" туда.

Но, если по конкретно по делу, то вам нужно иметь ввиду, что каждый поток будет открыт со своим коннектом к БД, который потом нужно будет закрыть руками внутри блока после сохранения:
Thread.new do
  model_instance.save
  ActiveRecord::Base.connection.close
end

Либо действия внутри потока совершать с использованием уже имеющегося соединения из пула:
Thread.new do
  ActiveRecord::Base.connection_pool.with_connection do
    model_instance.save
  end
end
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@lebron32rus
Senior Software Engineer
Я бы начал с БД. Проанализировал план запроса, оптимизировал запрос. Выявить причину по которой БД долго выполняет запрос - первостепенно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы