我的网站托管在AWS Elastic Beanstalk(PHP)上。我使用Yii框架作为MVC。
不久前,我想每天运行一个SQL查询。我查找了如何在Beanstalk上运行Cron,合并Cloud和Cron的概念似乎很复杂。我偶遇钢铁工人(http://www.iron.io/worker),并设法创建了一个当前工作良好的工作人员。
今天,我想运行一个更复杂的cron(在我的数据库中查找通知,决定是否发送电子邮件,构建电子邮件模板并发送电子邮件(通过AWS SES)。
据我所知,工作者文件应该是独立的项目,包含他们工作所需的一切。然而,我在构建MVC方面投入了大量的时间和精力。我有复杂的模型、验证、电子邮件模板引擎等。。。用我所做的工作来创造一个钢铁工人似乎很困难。即使我设法将所有代码移植到一个工作者(这似乎是一项艰巨的工作),这意味着无论何时我对主代码进行更改,我都需要确保工作者也有这些更改。这意味着我的代码将有一个"分支"。如果我想在未来创造更多的工人,那就更是如此。
正确的方法是什么?
短期而言,您可能只需要使用IronWorker中的调度功能,就可以让工人在应用程序中达到端点。然后,端点将触发在应用程序环境中运行的操作。
从长远来看,我们确实建议您更多地考虑一种面向服务的方法,通过这种方法,您可以将应用程序分解为更松散的耦合和分布式。这是一篇关于这个主题的帖子。优点很多,尤其是在可扩展性和开发灵活性方面。
https://blog.heroku.com/archives/2013/12/3/end_monolithic_app
你也可以看看这个YII添加。
http://www.yiiframework.com/extension/yiiron/
当然不希望你不必要地重写你的应用程序,但你可能会在一些领域寻求解耦。建议创建一个worker目录,并努力编写独立的worker。通过这种方式,您可以在不同的环境中运行它们,并将有效负载传递给工作者。(推送队列也可以用来推送给这些工作者。)一旦你习惯了分布式异步处理,这是一个非常容易管理的过程。
(注:我在Iron.io工作)