2012-11-09 4 views
2

Ну. Я использую Sidekiq для преобразования видеофайлов в фоновом режиме. Я использую sidekiq-unique-jobs gem, чтобы избежать дублирования работы с тем же объектом полезной нагрузки.Sidekiq странное поведение уникальных заданий

Я бег моего процесса sidekiq без вариантов только в очереди по умолчанию с параллелизмом из 25

Проблемы заключается в том: каждую работе после обработки в течение длительного времени (видео файлы действительно большие) идет в очереди накопившегося но размер обрабатываемых заданий также увеличивается.

Работа как ни законченная, ни уникальная. Я застрял. Заранее спасибо

UPD:

Я бегу Puma в качестве веб-сервера.

+0

Выполнены ли эти задания более 30 минут? – platforms

+0

Гораздо больше, чем 30 минут. 3-4 часа в среднем –

ответ

4

Попробуйте запустить его без драгоценного камня sidekiq-unique-jobs. В любом случае, вы защищаете вас от обманов в течение 30 минут. Этот драгоценный камень устанавливает свои хэш-клавиши в Redis для автоматического истечения срока действия через 30 минут (настраивается). sidekiq сам устанавливает свои рабочие места для автоматического истечения срока действия в Редисе через 24 часа.

Я, очевидно, не вижу ваше приложение, но я готов поспорить, что вы хотите не обрабатывать тот же файл очень часто. Я хотел бы контролировать это на прикладном уровне, а не и отслеживать собственные hashkey делать что-то похожее на то, что Уникально работа камень делает:

hash = Digest::MD5.hexdigest(Sidekiq.dump_json(md5_arguments)) 

Это также возможно, что sidekiq-unique-jobs промежуточного слоя также становится на пути sidekiq зная если работа выполнена должным образом или нет. Готов поспорить, что не так много людей тестируют это с помощью длительных заданий в той же конфигурации.

Если вы продолжаете видеть это поведение без дополнительного промежуточного слоя, попробуйте resque. Я никогда не видел такого поведения с этим камнем, а неудавшиеся задания имеют полезный параметр повтора в графическом интерфейсе администратора.

Главное преимущество sidekiq в том, что оно многопоточное. Тем не менее, параллелизм 25 с большими видеопроцессами может немного подтолкнуть его. По моему опыту, forking более стабилен и портативен, с меньшим беспокойством по поводу безопасности потоков вашего приложения (YMMV).

Независимо от того, что вы делаете, убедитесь, что вам известны параметры TTL автоматического истечения срока годности, которые эти системы используют для своих данных в Redis. Размер и характер ваших заданий означает, что рабочие места могут легко резервироваться в течение 24 часов. Эти автоматические удаления происходят на уровне базы данных. На прикладном уровне нет обратных вызовов, чтобы предупредить, что задание было автоматически удалено. Например, в коде sidekiq они вводили поведение auto-expire в «во избежание возможных утечек». (reference) Это не очень радует, если вам действительно нужны эти задания для выполнения.

+0

Хорошо, спасибо за ваш ответ. На самом деле, теперь я больше не вижу этого поведения, и причина все еще немного неясна. То, что я сделал: уверен, я установил срок годности уникальности и установил его до 6 часов. Я запустил «redis-cli FLUSHALL», чтобы очистить все задания, потому что у меня была привычка убивать сторонние процессы незаметно (причина появления старых заданий). Кроме того, я сконфигурировал 'ffmpeg', используя только 2 потока для каждого задания для преобразования и имея одновременно только 3 задания sidekiq (у меня 8 основных процессоров на сервере), и 25 параллельных заданий ffmpeg слишком много для него, не так ли? :) –

+1

хорошо - рад слышать, как он работает на вас. – platforms

+0

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