要求
我有一个网络应用程序,允许用户安排一些社交媒体任务,如在Facebook或Twitter上发布。
每个用户都可以随时告诉应用程序在他的社交媒体帐户上发布(14:00,15:11,17:54 ......)。
除此之外,我还需要每天为每个用户完成其他任务,例如吸引他们的粉丝或朋友,或者在Twitter上关注他们。
场合
到目前为止,我已经为每个任务创建了一个文件(post.php,getFollowers.php,analytics.php ...)。例如:
post.php中
我为此脚本创建了一个cron作业,如果必须发布某个帖子,则会每分钟检查一次。让我们假设我们运行脚本并找到三个想要在此时发推文的用户,它将使用foreach循环迭代用户并在每个帐户中发布。
......其他脚本也是这样做的:让每个想做某事的用户,创建一个队列并迭代它。
问题
(1)在Twitter和Facebook上发帖需要30-40,所以如果五个用户想在14:00发布,那么3,4和5将会迟到。
(2)获得一个用户的一些关注者需要40-60个,所以只有1000个用户,脚本将花费11-16h,这肯定是不可扩展的。我应该能在2-3小时内完成这项任务。
解决方案吗
我原以为我可以通过分离用户任务和为每个用户执行一个过程来解决这两个问题。
这是一个正确且可扩展的解决方案吗?您将如何以可扩展的方式解决这些问题?
提前致谢。
答案 0 :(得分:2)
使用队列和工作人员系统。
队列,例如:Amazon SQS:
工人:
技巧是你有一个队列,然后是必要的工作进程/服务器,以防止队列不断增长。
答案 1 :(得分:1)
使用托管的分布式计划任务服务,例如AWS Elastic Beanstalk Worker Tier或IronWorker。
使用AWS EB,您可以在项目中包含一个包含以下配置的cron.yaml
文件:
version: 1
cron:
- name: "post"
url: "/post"
schedule: "* * * * *"
每分钟都会触发http://localhost/post
的POST请求。
我还建议计划任务本身不发送帖子,而是触发其他多个任务来执行此操作。使用AWS EB,您可以使用AWS SDK for PHP:
use Aws\Common\Aws;
$aws = Aws::factory('/path/to/my_config.json');
$client = $aws->get('Sqs');
$client->sendMessage(array(
'QueueUrl' => $queueUrl,
'MessageBody' => json_encode($post),
'DelaySeconds' => $delay,
));
对于每个在正文中包含JSON编码数据的邮件,这将触发针对工作者层的配置URL的POST请求(即http://localhost/worker
)。
此方法可让您更好地根据要同时发送的帖子数进行扩展。