Как запустить определенную задачу, когда все остальные задания завершены
У меня есть приложение Rails, и я использую Jobs/Sidekiq для определенных длительных задач и вычислений.
Я хочу обновить свою навигацию по меню, если все задания выполнены, сделав недействительным кеш, возвращающий навигацию, и снова пересчитать содержимое для этого кеша. Таким образом, пользователи видят фактические результаты и не будут иметь длинных страниц рендеринга.
Я не использую actionViews, я использую Rails как API
Пример
- Пользователи могут добавлять элементы, которые запускают длительные задачи после сохранения (изменение размера изображений, загрузка/загрузка мультимедиа, преобразование материалов...)
- Когда все эти задания будут завершены, кеш должен быть признан недействительным и пересчитан.
На данный момент я аннулирую кеш в каждом задании, но это не оптимально, потому что эти задания всегда каким-то образом выполняются с другими элементами, поэтому кеш никогда не будет доступен.
Я думал о конкретном поле базы данных (т.е.:visible
) или таблица БД, котораяtrue
когда все задания выполнены, наблюдайте за этим состоянием и на его основе пересчитывайте результаты.
Еще одна мысль - создатьdb table
который представляет рассчитанные результаты и действует как кеш для моей навигации.
Каков «правильный» способ справиться с этим в Rails?
Процесс сохранения предметов:
- Элемент базы данных
- экономия! && отключенная видимость
- Загрузка/загрузка материалов (работа)
- Изменение размера изображений (работа)
- конвертировать медиа (работа)
- включение элемента
- сделать кеш недействительным
- пересчет материала (работы) (или первого посещения страницы)
- экономия! && отключенная видимость
Пример моего дерева навигации, которое очень глубокое (>20 тыс. записей):
- RootItem (10 предметов)
- Детский элемент (3 предмета)
- Подпункт (2 шт.)
- Подпункт (1 пункт)
- Детский элемент (4 предмета)
- Подпункт (2 шт.)
- Подпункт (2 шт.)
- Детский элемент (3 предмета)
Я пытался справиться с этим как можно более общим образом. Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.
я используюRails
,Postgres
,Memcached
,Dalli
,actionpack-action_caching
Упрощенный:
class ItemSavedJob
include Sidekiq::Job
sidekiq_options retry: 3
# It activates or deactivates items
def perform(id)
item = Item.find(id)
item.make_invisible!
item.start_long_running_job
item.images.each do |image|
ItemConvertJob.perform_async(image.id)
# HERE when the last convertion has finished,
# it should activate the item and invalidate the Navigation
end
CacheHelper.invalidate_navigation_cache!
end
end
class ImageConvertJob
include Sidekiq::Job
sidekiq_options retry: 3
def perform(id)
image = Image.find(id)
image.do_a_long_convertion
end
end