У нас есть приложение rails, которое синхронизируется с другим приложением.Это происходит на заднем плане.По сути, каждый раз, когда эта работа просто синхронизирует все данные, поэтому в настоящий момент она действительно медленная, и мы ищем ускорение процесса с помощью параллелизма.
В основном это выглядит примерно так:
accounts.each { |a| sync_account(a) }
И мы хотим, чтобы это выглядело так:
accounts.each { |a| SyncAccountJob.perform_later(a) }
Если быть точным, мы хотим использовать фоновые очереди для этого.Для начала мы хотим использовать одну работу для каждой учетной записи (у нас есть много учетных записей, которые нуждаются в синхронизации).Проблема заключается в том, как мы можем запретить нашей очереди получать одно и то же задание несколько раз?
Например, если мы планируем задания каждый час, иногда, когда какая-то учетная запись еще не синхронизирована, будет запланировано новое задание (извините замой английский).
Что бы вы сделали?
Мы думаем, что мы должны просто сохранить идентификатор созданной работы в таблице счетов и просто проверить, не существует ли работа, прежде чем планировать ее снова.
Другой вопрос - какую систему мы используем: delayed_job (уже используется почтовыми программами) или sidekiq?
Другая проблема: задания "зомби".Например, допустим, я запланировал какое-то задание (delayed_job), и работник начал его обрабатывать.Теперь он заблокирован.И затем сервер падает, так что работа все еще заблокирована, но ничего не обрабатывает.Неужели delayed_job / sidekiq решает эту проблему самостоятельно или мне стоит написать что-нибудь почище?
Буду признателен за любые комментарии или истории на эту тему.