Как поставить в очередь несуществующего работника - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь поставить в очередь работника Sidekiq, которого нет в моем проекте, но существует в каком-то другом проекте, использующем тот же сервер redis.

В нашей текущей ситуации у нас есть два сервера:

  • Сервер API работает на Heroku. Веб-экземпляр для REST API и работник с Sidekiq прослушивает очередь :api.

  • Сервер обработки работает на AWS ElasticBeanstalk с экземпляром puma, выполняющим REST Full API с Sinatra. Этот экземпляр запускает Sidekiq и слушает очередь :processing

Дополнительное примечание : В начале наш API выполнял всю работу, но, поскольку некоторые работники начали использовать слишком много памяти, мы переключаемся на сервер обработки.


Когда нам нужно выполнить задание на сервере обработки, у нас происходят следующие действия:

  1. API-вызовы POST processing.com/some_job

  2. Обработка очередей SomeJobWorker в очереди processing

  3. Обработка выполняется SomeJobWorker из очереди processing

  4. Обработка вызовов POST api.com/webhooks/some_job_result

  5. API-очереди SomeJobResultWorker в очереди api

  6. API выполняет SomeJobResultWorker из очереди processing


Это заставило меня задуматься, если бы я мог как-то с сервера API напрямую поставить в очередь SomeJobWorker, тогда я мог бы избавиться от API REST на нашем сервере обработки .

... тогда я мог бы избавиться от конечной точки webhooks на сервере API и сделать то же самое с сервера обработки

Я бы закончил что-то вроде этого:

  1. очереди вызовов API SomeJobWorker

  2. Обработка выполняется SomeJobWorker

  3. Обработка очередей SomeJobResultWorker

  4. API выполняет SomeJobResultWorker

Есть ли способ поставить в очередь работника, которого нет в моей локальной кодовой базе?

1 Ответ

1 голос
/ 03 апреля 2019

У вас есть два осколка. Каждый Redis - это осколок. Прочитайте эту страницу:

https://github.com/mperham/sidekiq/wiki/Sharding

Вы можете отправить задание, используя имя класса:

client = Sidekiq::Client.new(PROCESSING_REDIS)
client.push('queue' => 'api', 'class' => 'FooWorker', 'args' => [1,2,"foo"])
...