如何对不存在的工作人员进行排队

时间:2019-04-03 15:30:05

标签: ruby-on-rails ruby sidekiq

我正在尝试使Sidekiq工作者排队,该工作者在我的项目中不存在,但在其他共享相同Redis服务器的项目中存在。

在当前情况下,我们有两台服务器:

  • API服务器在Heroku上运行。 REST API的Web实例和带有Sidekiq的工作程序在听:api队列。

  • 处理服务器在AWS ElasticBeanstalk上运行,并且puma实例与Sinatra一起运行REST Full API。该实例运行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,然后可以在我们的处理服务器上取消REST API

...然后我可以摆脱 API服务器上的webhooks端点,并从处理服务器

中执行相同的操作

我最终会得到这样的东西:

  1. API调用队列SomeJobWorker

  2. 处理执行SomeJobWorker

  3. 处理队列SomeJobResultWorker

  4. API执行SomeJobResultWorker

我是否可以对本地代码库中不存在的工作程序进行排队?

1 个答案:

答案 0 :(得分:1)

您有两个分片。每个Redis都是碎片。阅读此页面:

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

您可以使用班级名称来完成工作:

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