Как запустить определенную задачу, когда все остальные задания завершены

У меня есть приложение Rails, и я использую Jobs/Sidekiq для определенных длительных задач и вычислений.

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

Я не использую actionViews, я использую Rails как API

Пример

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

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

Я думал о конкретном поле базы данных (т.е.:visible) или таблица БД, котораяtrueкогда все задания выполнены, наблюдайте за этим состоянием и на его основе пересчитывайте результаты.

Еще одна мысль - создатьdb tableкоторый представляет рассчитанные результаты и действует как кеш для моей навигации.

Каков «правильный» способ справиться с этим в Rails?

Процесс сохранения предметов:

  • Элемент базы данных
    • экономия! && отключенная видимость
      • Загрузка/загрузка материалов (работа)
      • Изменение размера изображений (работа)
      • конвертировать медиа (работа)
    • включение элемента
    • сделать кеш недействительным
      • пересчет материала (работы) (или первого посещения страницы)

Пример моего дерева навигации, которое очень глубокое (>20 тыс. записей):

  • RootItem (10 предметов)
    • Детский элемент (3 предмета)
      • Подпункт (2 шт.)
      • Подпункт (1 пункт)
    • Детский элемент (4 предмета)
      • Подпункт (2 шт.)
      • Подпункт (2 шт.)

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

я использую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

0 ответов

Другие вопросы по тегам