我不明白.
根据Sidekiq文档,每个worker(我的名为FeedWorker)只能包含一个名为perform的方法.那么,如果我想通过同一个工作者运行多个方法呢?
例如,我的FeedWorker(你猜对了,它处理一个活动源)应该运行以下3种方法:
announce_foo
announce_bar
invite_to_foo
Run Code Online (Sandbox Code Playgroud)
我不认为这是一种无理的期望.我相信其他人都考虑过这一点.我不是天才,但我知道我并没有在这里期待新的理由.然而,目前尚不清楚如何做到这一点.
现在,看起来我必须以这种方式编码:
def perform(id, TYPE)
if TYPE == BAR
Bar.find(id) and_announce_bar
else
Foo.find(id) and_announce_foo
end
end
Run Code Online (Sandbox Code Playgroud)
无聊和丑陋的代码.那里一定有更好的.任何帮助赞赏!
如果我有一个1核心的服务器,有多少puma worker,thread和什么数据库池大小合适?
一般大拇指在这里是什么?
我有一些由supervisord管理的Python工作者,如果他们正常工作,应该连续打印到stdout(在每个完成的任务之后).但是,他们往往会挂起,我们很难找到错误.理想情况下,supervisord会注意到它们没有在X分钟内打印并重新启动它们; 任务是幂等的,所以不优雅的重启很好.是否有任何supervisord功能或插件可以做到这一点?或者是另一个类似管理员的程序,开箱即用?
我们已经在使用http://superlance.readthedocs.io/en/latest/memmon.html来杀死内存使用量突然增加,这可以缓解一些挂起,但是一个不会导致内存泄漏的挂起仍然会导致工人达到停顿状态.
我在代码库中遇到一个问题,即作业被提前终止,而其timeout设置为 540 秒。然而,在查看文档后,我发现这是参数的问题retry_after,我现在将其增加到 600 秒,这解决了该问题。文档https://laravel.com/docs/7.x/queues在文档中有一个块说明:
该
--timeout值应始终比您的配置值短至少几秒retry_after。这将确保处理给定作业的工作人员始终在重试作业之前被终止。如果您的--timeout选项长于您的retry_after配置值,您的作业可能会被处理两次。
然而,我已经阅读了几次文档,但我无法理解retry_after和timeout选项之间的区别。--timeout似乎是与工作相关的设置,而retry_after似乎是与工人相关(流程)的设置。此外,--timeout可以作为参数传递给php artisan queue:work ...,但它retry_after是要在 中定义的配置属性config/queue.php。
任何人都对这种配置有一定的经验,并且可以通过示例说明差异吗?
我想知道如何在Heroku工作者dyno上的进程之间进行通信.
我们希望Resque工作者读取队列并将数据发送到在同一个dyno上运行的另一个进程."其他进程"是一种现成的软件,通常使用TCP套接字(端口xyz)来监听命令.它设置为在Resque工作程序启动之前作为后台进程运行.
但是,当我们尝试本地连接到该TCP套接字时,我们无处可去.
我们设置队列的Rake任务执行此操作:
task "resque:setup" do
# First launch our listener process in the background
`./some_process_that_listens_on_port_12345 &`
# Now get our queue worker ready, set up Redis backing store
port = 12345
ENV['QUEUE'] = '*'
ENV['PORT'] = port.to_s
Resque.redis = ENV['REDISTOGO_URL']
# Start working from the queue
WorkerClass.enqueue
end
Run Code Online (Sandbox Code Playgroud)
这样做 - 我们的侦听器进程运行,Resque尝试处理排队的任务.但是,Resque作业失败,因为它们无法连接localhost:12345(具体而言Errno::ECONNREFUSED).
可能,Heroku在同一个dyno上阻止TCP套接字通信.有没有解决的办法?
我尝试从情境中取出"代码"并在命令行上执行(在服务器进程声称它已正确绑定到12345之后):
nc localhost 12345 -w 1 </dev/null
Run Code Online (Sandbox Code Playgroud)
但这也没有联系.
我们目前正在调查更改客户端/服务器代码以便UNIXSocket在两侧使用而不是TCPSocket,但由于它是一个现成的软件,我们宁愿避免使用我们自己的分支.
我知道Heroku平台的内存限制,我知道将应用程序分成web和worker dynos的可扩展性要高得多.但是,我仍然希望在Web进程旁边运行异步任务以进行测试.Dynos价格昂贵,我想在Heroku提供的免费实例上进行原型设计.
在与Web进程相同的dyno中将新作业作为进程或子进程生成是否有任何问题?
我有一个烧瓶应用程序,我需要APScheduler的调度功能.问题是:
我从哪里开始调度程序实例?
我使用uwsgi + nginx为多个工作者提供这个应用程序,我不会最终得到多个彼此无视的调度程序实例吗?如果这是正确的,单个作业将被多次触发,不是吗?
在这种情况下,最好的策略是什么,所以我最终只得到一个Scheduler实例,并且仍然可以从预定的作业中访问应用程序的上下文?
这个问题虽然有枪炮而不是uwsgi,但也有同样的问题,但答案可能类似.
下面是将"app"定义为uwsgi可调用应用程序对象的代码.包含此代码的文件称为wsgi.py(并不重要).
app = create_app(config=ProductionConfig())
def job_listener(event):
get_ = "msg from job '%s'" % (event.job)
logging.info(get_)
# This code below never gets invoked when I check with worker_id() == 1
# The only time it is run is with worker_id() value of 0
app.sched = Scheduler()
app.sched.add_jobstore(ShelveJobStore('/tmp/apsched_%d' % uwsgi.worker_id()), 'file')
app.sched.add_listener(job_listener,
events.EVENT_JOB_EXECUTED |
events.EVENT_JOB_MISSED |
events.EVENT_JOB_ERROR)
app.sched.start()
Run Code Online (Sandbox Code Playgroud) 我想知道collectAsMap在Spark中是如何工作的.更具体地说,我想知道所有分区的数据聚合将在何处发生?聚合发生在主人或工人中.在第一种情况下,每个工作人员在master上发送数据,当master从每个worker收集数据时,master将汇总结果.在第二种情况下,工人负责汇总结果(在他们之间交换数据之后),之后结果将被发送给主人.
我必须找到一种方法,以便主人能够分别从每个分区收集数据,而无需工人交换数据.
任何人都知道如何在Windows上运行Node Cluster?我无法在网上找到任何文章,似乎无法解决这个问题:
events.js:160
throw er; // Unhandled 'error' event
^
Error: write ENOTSUP
at exports._errnoException (util.js:1007:11)
at ChildProcess.target._send (internal/child_process.js:634:20)
at ChildProcess.target.send (internal/child_process.js:521:19)
at sendHelper (cluster.js:751:15)
at send (cluster.js:534:12)
at cluster.js:509:7
at SharedHandle.add (cluster.js:99:3)
at queryServer (cluster.js:501:12)
at Worker.onmessage (cluster.js:449:7)
at ChildProcess.<anonymous> (cluster.js:765:8)
Run Code Online (Sandbox Code Playgroud)
而代码......
if (cluster.isMaster) {
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('online', (worker) => {
console.log('Worker ' + worker.process.pid + ' is online');
});
cluster.on('exit', (worker, code, signal) => {
console.log(`Worker ${worker.process.pid} died …Run Code Online (Sandbox Code Playgroud) 嘿伙计们,我这个问题一直在苦苦挣扎,所以我决定发帖.
我在我的应用程序上安装了一个服务工作者,它安装得很好,激活得很好,缓存也可以.
但是当我点击一个302的页面完成缓存时,它会告诉我:
" http:// localhost:8000/form / " 的FetchEvent 导致网络错误响应:重定向响应用于重定向模式不是"跟随"的请求.
我已经阅读了很多关于这个主题的内容,我在这里查阅了帖子:服务工作者打破301重定向,然后https://github.com/w3c/ServiceWorker/issues/737 和https:// github. COM/GoogleChromeLabs/SW-预缓存/问题/ 220
据我所知,提取时的默认重定向模式是{redirect:"follow"},但是当我从重定向页面查看重定向模式时,我可以看到它是{redirect:"manual"}所以基本上我必须要做什么这是"手动".
以为我有点困惑,我正在努力如何在我的代码中实现这一点.
如果你们可以帮助我,你可以节省我的一天.
非常感谢你 !
这是我的代码:
const STATIC_CACHE_NAME = 'exell-static-v28';
const DYNAMIC_CACHE_NAME = 'exell-dynamic-v4';
// INSTALLING THE SERVICE WORKER AND PRECACHING APPSHELL
self.addEventListener('install', function(event) {
console.log('[Service Worker] Service Worker installed');
event.waitUntil(
caches.open(STATIC_CACHE_NAME) // Create a static cache
.then(function(cache) {
console.log('[Service Worker] Precaching App Shell');
cache.addAll([ // Add static files to the cache
'/',
'/build/app.js',
'/build/global.css',
'login',
'logout',
'offline',
'form/',
'form/new/first_page',
'form/new/second_page', …Run Code Online (Sandbox Code Playgroud) worker ×10
heroku ×2
javascript ×2
python ×2
ruby ×2
apache-spark ×1
apscheduler ×1
flask ×1
laravel ×1
node-cluster ×1
node.js ×1
php ×1
pool ×1
puma ×1
redirect ×1
redis ×1
service ×1
sidekiq ×1
sockets ×1
subprocess ×1
supervisord ×1
tcp ×1
uwsgi ×1