我正在尝试使Sidekiq工作者排队,该工作者在我的项目中不存在,但在其他共享相同Redis服务器的项目中存在。
在当前情况下,我们有两台服务器:
API服务器在Heroku上运行。 REST API的Web实例和带有Sidekiq的工作程序在听:api
队列。
处理服务器在AWS ElasticBeanstalk上运行,并且puma实例与Sinatra一起运行REST Full API。该实例运行Sidekiq,并监听队列:processing
旁注:最初,我们的API负责所有工作,但是随着一些工作人员开始占用过多内存,我们切换到处理服务器。
当我们需要在处理服务器上执行作业时,我们会发生以下动作:
API调用POST processing.com/some_job
处理队列SomeJobWorker
上的队列processing
处理从队列SomeJobWorker
执行processing
处理呼叫POST api.com/webhooks/some_job_result
API队列SomeJobResultWorker
上的队列api
API从队列SomeJobResultWorker
执行processing
这让我开始思考,如果可以的话,可以从 API服务器直接排队SomeJobWorker
,然后可以在我们的处理服务器上取消REST API
...然后我可以摆脱 API服务器上的webhooks
端点,并从处理服务器
我最终会得到这样的东西:
API调用队列SomeJobWorker
处理执行SomeJobWorker
处理队列SomeJobResultWorker
API执行SomeJobResultWorker
我是否可以对本地代码库中不存在的工作程序进行排队?
答案 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"])