Оптимальная практика работы с long task в Rails


#1

Работая с длинными процессами в Rails, прежде всего сталкиваешься с тем обстоятельством, что запушенный процесс порой крайне непросто погасить. Разумеется, всегда остается

kill -9 <pid>

, но речь о том, чтобы залогиненный (посредством devise) юзверь мог не только запустить работу, но и прервать ее в любой момент, а не о том, чтобы погасить всю аппликуху. Во время работы длинного процесса даже разорвать сессию, нажав стандартную ссылку, не получается.

Конкретный пример: получаем небольшими порциями френдов и фолловеров из API твиттера, сравниваем два полученных массива, соответственно, получаем третий - перечень ID аккаунтов, предназначенных для фолловинга или анфолловинга (это уже, с паузами, минут 10 как минимум, если акк раскрученный и содержит хотя бы 10К или 15К читателей); и далее приступаем к собственно фолловингу/анфолловингу опять-таки между длинными (до 15 минут) паузами. инициированными лимитами твиттера (во время rescue аппликуха sleep).

Буду благодарен за адекватные в этом контексте советы. Правильно ли понимаю, что вопрос априори имеет смысл только в контексте использования sideqik, resque, иного менеджера очередей? Что посоветуете? ткните оптимальный, на ваш взгляд, way. Delayed_job уже не используют, проект умер? Хотелось бы иметь еще и индикацию состояния процесса в кабинете пользователя, присматриваюсь к workling… или же что-то иное? Any ideas, please.


(Kvokka) #2

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

при этом как всегда можно отвелосипедить и просто сделать новый thread и там уже резвиться как хочется, желательно его периодически потыкивая палочкой. но, если под капотом mri то результат по производительности может быть грустным


#3

насколько понимаю, ты имеешь в виду вот эту методу, описанную, в частности, на хабре. Но это ведь даже не велосипед, это имхо костыль… как думаешь, нужно ли понимать так, что архитектура rails априори не предназначена для работы с длинными процессами? -


(Kvokka) #4

ну, у этих перцев вообще треш. я предпочитаю такое не пить.
при чем тут архитектура рельс я так и не понял. рельсы это малость про другое

для убийства тредов вполне пойдет просто TimeOut и Thread.status.

те ты запускаешь тред, внутри которого в блоке таймаута стартует нужный тред и там уже мясо.

ну и периодически проходит тред, токовый проверяет все процессы, и если что-то особо долго живет, то логирует и добивает.

наверн, под конец дня не особо это лаконично, но что выросло-то выросло