Helpers - компьютеры, интернет, программирование

Как разделить долгоживущее задание Sidekiq на множество краткосрочных заданий в приложении Ruby on Rails

Итак, я создаю веб-сайт, который вызывает сторонний API, который может занять от 20 секунд до 30 минут, чтобы вернуть результат. Но я не могу знать эту продолжительность заранее, поэтому нужно часто опрашивать ее, чтобы проверить, выполнена ли работа (возвращает «COMPLETE» и результат) или нет (возвращает «IN_PROGRESS»). Кроме того, этот API может вызываться много раз от многих пользователей одновременно.

Поэтому я создал воркер Sidekiq, который проверяет API каждые 5 секунд, пока не получит «COMPLETE», и только тогда он завершается. Но я читал, что Sidekiq должен выполнять только кратковременную работу, и я изо всех сил пытаюсь понять, как мне это сделать. Также я пытался найти ответ, но подозреваю, что не знаю слов, чтобы найти то, что ищу.

Я уверен, что есть способ сказать своим работникам вызвать API один раз, и если результат будет "IN_PROGRESS", конец, но убедитесь, что другой работник выполнит еще один вызов API для проверки, и так далее и так далее, пока не будет получен результат. завершено".

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

Это мой работник, который, я надеюсь, проясняет, что я делаю прямо сейчас:

class ThingProgressWorker
  include Sidekiq::Worker

  def perform(id)
    @thing = Thing.find(id)
    @thing_api_call = ThingAPICall.new // This uses the ruby library of the API
    completed = false
    while completed == false
      result = @thing_api_call.get_result( { thing_job_name: @thing.job_name })
      if !result.include? "COMPLETED"
        completed = false
        sleep 5
      else
        completed = true
        @thing.status = "completed"
        @thing.save
        break
      end
    end
  end
end

Таким образом, если API требуется десять минут, чтобы перейти от «IN_PROGRESS» к «COMPLETED», этот рабочий процесс будет занят в течение этого времени, что, по моему мнению, вообще не рекомендуется.

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

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

Буду признателен за любую помощь или указания!

заранее спасибо

11.11.2019

Ответы:


1

Попробуйте вызвать работника с задержкой. Например:

class ThingProgressWorker
  include Sidekiq::Worker

  def perform(id)
    @thing = Thing.find(id)
    @thing_api_call = ThingAPICall.new // This uses the ruby library of the API
      result = @thing_api_call.get_result( { thing_job_name: @thing.job_name })
      if !result.include? "COMPLETED"
        ThingProgressWorker.perform_in(1.minute, id)
      else
        completed = true
        @thing.status = "completed”
        @thing.save
      end
  end
end

Это добавит рабочего в очередь, но запустит его не сразу, а в указанное вами время.

11.11.2019
  • Извините, наверное, я не объяснил это должным образом. Дело не в том, что я хочу отсрочить выполнение задания, а в том, что я хочу, чтобы это доооооооооооооооооооооооооооооооооеся задание было бы разбито на более короткие. Спасибо, в любом случае! 13.11.2019
  • Я имею в виду, что вместо цикла while вы снова вызываете работника изнутри себя, если процесс не завершен в API. Таким образом, у вас будет недолговечный рабочий процесс, который снова вызывает себя для выполнения через x секунд или минут. Если вы скажете задержку 1 минута, она будет выполняться 20 раз за 20 минут (по несколько секунд каждый). 14.11.2019
  • Я наполовину работает, но не работает полностью. Он вызывает себя с задержкой (это то, что я хотел), но затем он продолжает вызывать ThingProgressWorker (самого себя) на неопределенный срок, даже после того, как задание выполнено, и цикл if должен выполнить часть в операторе else. Даже когда result.include? COMPLETED должен быть истинным, на самом деле он никогда не относится к операторам под else 14.11.2019
  • Тогда теперь вопрос касается условия if. Можете ли вы показать ответ API, когда задача будет выполнена? 15.11.2019
  • Новые материалы

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

    Использование машинного обучения для диагностики болезни Альцгеймера, часть 4
    Маркеры семантической согласованности для ранней диагностики болезни Альцгеймера (arXiv) Автор: Давиде Колла , Маттео Дельсанто , Марко Агосто , Бенедетто Витиелло , Даниэле Паоло Радичони..

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

    Анимированный математический анализ
    Использование Manim для создания математических анимированных визуализаций Визуализация данных помогает понять скрытые закономерности в данных, которые невозможно визуализировать..

    Создание простого слайдера изображений с помощью JavaScript
    Узнайте, как создать базовый слайдер изображений с помощью HTML, CSS и JavaScript. Введение В этом уроке мы создадим удобный слайдер изображений, используя JavaScript, HTML и CSS. Ползунок..

    Создание базы данных с помощью супергероя «Python»
    В этом посте мы узнаем, как создать «базу данных SQLite с помощью модуля python sqlite3, создав простую функцию входа и регистрации. Готовы ли вы к этому путешествию? Если да , давайте приступим..

    ИИ для чайников: руководство для начинающих по пониманию будущего технологий
    Вы чувствуете, что остались позади в мире ИИ? Не волнуйтесь, вы не одиноки! Со всей этой шумихой вокруг искусственного интеллекта может быть трудно понять, с чего начать. Но не позволяйте сленгу..