首先,AWS 和 Heroku 是不同的东西。 AWS 提供基础设施即服务(IaaS https://en.wikipedia.org/wiki/Cloud_computing#Infrastructure_as_a_service_.28IaaS.29)而 Heroku 提供平台即服务(PaaS https://en.wikipedia.org/wiki/Platform_as_a_service).
有什么不同?非常近似的是,IaaS 为您提供了在其上构建内容所需的组件; PaaS 为您提供了一个环境,您只需推送代码和一些基本配置即可获得正在运行的应用程序。 IaaS 可以为您提供更多功能和灵活性,但代价是您必须自己构建和维护更多功能。
为了让您的代码在 AWS 上运行并且看起来有点像 Heroku 部署,您需要一些 EC2 实例 - 您需要在它们上安装负载均衡器/缓存层(例如Varnish https://www.varnish-cache.org/),你会希望实例运行类似乘客 http://www.modrails.com/ and nginx http://nginx.org/为了服务您的代码,您需要部署和配置类似的集群数据库实例PostgreSQL http://www.postgresql.org/。您需要一个具有类似功能的部署系统卡皮斯特拉诺 https://github.com/capistrano/capistrano/wiki,以及进行日志聚合的操作。
设置和维护这并不是一个微不足道的工作量。对于 Heroku,达到这种阶段所需的努力可能只是几行应用程序代码和一个git push
.
所以你已经走到这一步了,你想扩大规模。伟大的。你正在使用Puppet http://puppetlabs.com/适合您的 EC2 部署,对吗?现在,您可以配置 Capistrano 文件以根据需要启动/关闭实例;您重新调整您的 Puppet 配置,以便 Varnish 能够识别 Web Worker 实例并自动在它们之间进行池化。或者你heroku scale web:+5
.
希望这能让您了解两者之间的比较。现在解决您的具体问题:
Speed
目前 Heroku 仅在 AWS 实例上运行us-east
and eu-west
。对你来说,这听起来无论如何都是你想要的。对于其他人来说,这可能更多是一个考虑因素。
Security
我见过很多内部维护的生产服务器在安全更新方面远远落后,或者通常组合得很差。有了 Heroku,你就可以由其他人来管理这类事情,这要么是福,要么是祸,取决于你如何看待它!
当您部署时,您实际上是将代码直接交给 Heroku。这对您来说可能是个问题。他们的文章关于测功机隔离 http://devcenter.heroku.com/articles/dyno-isolation详细介绍了它们的隔离技术(看起来好像多个测功机在各个 EC2 实例上运行)。几位同事对这些技术及其隔离强度表示了疑问;遗憾的是,我没有足够的知识/经验来真正发表评论,但我当前的 Heroku 部署认为“足够好”。我不知道,这对你来说可能是个问题。
Scaling
我在上面的 IaaS 与 PaaS 比较中谈到了如何实现这一点。大约,您的应用程序有一个Procfile
,其行的形式为dyno_type: command_to_run
,例如(抄袭自Heroku 架构 - 流程模型 https://devcenter.heroku.com/articles/process-model):
web: bundle exec rails server
worker: bundle exec rake jobs:work
这,带有:
heroku scale web:2 worker:10
将导致你有 2web
测功机和 10worker
动力运行。不错,简单,容易。注意web
是一种特殊的 dyno 类型,它可以访问外部世界,并且位于其良好的网络流量多路复用器(可能是某种 Varnish / nginx 组合)的后面,该多路复用器将相应地路由流量。您的工作人员可能会与消息队列进行交互以进行类似的路由,他们将通过环境中的 URL 从中获取位置。
成本效益
很多人对此有很多不同的看法。目前,dyno 小时的价格为 0.05 美元/小时,而 AWS 微型实例为 0.025 美元/小时,AWS 小型实例为 0.09 美元/小时。
赫罗库的动态文档 http://devcenter.heroku.com/articles/dynos说你有大约 512MB 的 RAM,所以可能不是too将 dyno 视为有点像 EC2 微型实例是不合理的。值得双倍的价格吗?你有多珍惜你的时间?在 IaaS 产品之上进行构建以使其达到此标准所需的时间和精力绝对不便宜。我无法真正为您回答这个问题,但不要低估设置和维护的“隐性成本”。
(有点旁白,但如果我从这里连接到测功机(heroku run bash
),粗略一看,有 4 个核心/proc/cpuinfo
和 36GB RAM - 这让我相信我正在使用《高内存双超大实例》 http://aws.amazon.com/ec2/instance-types/。赫鲁库动态文档 http://devcenter.heroku.com/articles/dynos说每个测功机接收 512MB RAM,因此我可能与最多 71 个其他测功机共享。 (我没有足够的关于 Heroku 的 AWS 实例同质性的数据,因此您的情况可能会有所不同))
他们与竞争对手的竞争如何?
这个,恐怕我真的帮不了你。我真正关注过的唯一竞争对手是谷歌应用引擎 http://code.google.com/appengine/- 当时我正在考虑部署 Java 应用程序,并且对可用框架和技术的限制程度 http://code.google.com/p/googleappengine/wiki/WillItPlayInJava非常令人反感。这不仅仅是“只是 Java 的事情”——一般限制和必要考虑因素的数量(the FAQ http://code.google.com/appengine/kb/general.html几个提示)似乎不太方便。相比之下,部署到 Heroku 一直是一个梦想。
结论
如果存在差距/您想要解决的其他领域,请发表评论。我觉得我应该提出我的个人立场。我喜欢 Heroku 的“快速部署”。当我启动一个应用程序时,我想要一些便宜的托管(Heroku 免费套餐很棒 - 本质上,如果您只需要一个 Web dyno 和 5MB PostgreSQL,它可以免费托管应用程序),Heroku 是我的首选。对于有多个付费客户的“认真的生产部署”,有服务级别协议,有专门的时间花在运维上,等等,我不太能让自己把那么多控制权转移给 Heroku,然后要么 AWS 要么我们自己的服务器一直是首选的托管平台。
最终,这取决于什么最适合您。您说您是“一名初学者程序员” - 可能只是使用 Heroku 可以让您专注于编写 Ruby,而不必花时间围绕您的代码构建所有其他基础设施。我肯定会尝试一下。
请注意,AWS 实际上有 PaaS 产品,弹性豆茎 http://aws.amazon.com/elasticbeanstalk/,支持 Ruby、Node.js、PHP、Python、.NET 和 Java。我认为大多数人在看到“AWS”时,都会跳到 EC2、S3 和 EBS 之类的东西,这些绝对是 IaaS 产品