Laravel / PHP-并行运行作业的正确选择?

时间:2019-03-16 16:55:01

标签: php laravel

我当前的应用程序在数据库中拥有大约5000个网络节点的状态。每个节点应及时更新以提供当前状态。更新过程如下所示:

  1. 从数据库获取旧条目以获取其IP
  2. 将RPC发送到节点
  3. 使用返回的数据更新数据库条目

为此,我正在运行Laravel Horizo​​n,它为我提供了一个基于Redis的简洁作业调度程序。 cron每分钟都会获取所有节点条目,并将每个UpdateNode(id)任务推送到调度程序。

随着节点数量的增加,我也必须不断增加调度工人。当前,有60个PHP线程仅负责更新节点,以保持分钟更新循环的运行。

这个事实再次导致了一个巨大的资源问题(目前在40美元的DigitalOcean Droplet上有80%的RAM和70%的CPU),这又使我再次遇到了主要问题:

  1. Laravel(或更多PHP)仍然是该职位的合适人选吗?
  2. 从Laravel的角度来看,我可能做错了什么吗?通常,获取数据库条目,发送RPC并使用新数据更新条目应该没什么大不了的。

//编辑:这是我的iostatenter image description here

//对于所有对此感兴趣的人都是该项目:https://github.com/nknx-org/nknx-api 我们正在谈论的工作是https://github.com/nknx-org/nknx-api/blob/master/app/Jobs/UpdateNode.php

2 个答案:

答案 0 :(得分:1)

如果计划的任务有任何瓶颈,您可以做的一件事就是将分配工作的工作分解为另一个工作。

您可以使记录分成ID块,而不是由单个计划任务负责为工人分配所有5000 UpdateNode个工作。因此,您的计划任务会将5000条记录分成250个ID的块,并分派20个新的DispatchUpdateNodeJobs($ids)作业,每个作业包含250个ID的数组。

这些作业进入您的普通队列系统,以供您的工作人员提取,并且每个捡起DispatchUpdateNodeJobs工作的工作人员依次运行时分派其250 UpdateNode个工作,然后这些工作像现在一样被工人接走。如果您的计划任务需要很长时间才能创建5000个作业,那么这可能会更轻松地扩展工作,具体取决于系统的设置方式,并且有可能更快地将全部5000个作业排入队列,以供工作人员使用。

但是,如果您说CPU使用率很高是因为您现有的所有60名工人都在同一台服务器上,那么我认为您只需要添加另一台服务器来分散工作。每个60个PHP进程使用1%的CPU和大约25mb的内存仍将占用60%的CPU和1.5gb的内存,而活动的进程如此之多,无法避免这种情况。

如果数据库在同一系统上并且还使用大量cpu,则您可能还需要针对用例优化查询,添加索引和其他性能调整。最快的数据库。是您无法访问的(利用您可以缓存的内容)。

最好的选择最终取决于您当前的瓶颈以及系统的设置方式。

答案 1 :(得分:0)

%user = 53% 一个任务= 1%* 4CPU = 4%大

拆分任务

_roomCollectionRef.document(documentId).snapshots().listen((onData) { -仅将数据保存到文件夹或Redis

handle()

在一项任务中的每一分钟将所有json从文件夹推送到数据库。