首先,AWS和Heroku是不同的东西。AWS提供基础设施即服务(
IaaS),而Heroku提供平台即服务(
PaaS)。
有什么区别?大致上,IaaS为您提供构建其上应用程序所需的组件;PaaS为您提供一个环境,在其中只需推送代码和一些基本配置即可获得运行中的应用程序。IaaS可以提供更多的功能和灵活性,但需要自己构建和维护,代价较高。
为了在AWS上运行您的代码并使其看起来有点像Heroku部署,您需要一些EC2实例-您需要在它们上安装负载均衡器/缓存层(例如
Varnish),您需要运行类似
Passenger和
nginx的实例来提供您的代码,您需要部署和配置一个类似
PostgreSQL的集群数据库实例。您需要使用类似
Capistrano的部署系统,并进行日志聚合。
这不是一个微不足道的工作量来设置和维护。使用Heroku,达到那种阶段所需的工作可能只需几行应用程序代码和git push
。
所以你已经到了这一步,想要扩大规模。很好。你正在使用
Puppet进行EC2部署,对吗?现在你需要配置Capistrano文件以根据需要启动/关闭实例;重新调整Puppet配置,使Varnish知道Web工作实例并自动在它们之间进行池化。或者你可以使用
heroku scale web:+5
。
希望这能让你了解两者之间的比较。现在来回答你的具体问题:
速度
目前Heroku仅在
us-east
和
eu-west
的AWS实例上运行。对于你来说,这听起来正是你想要的。对于其他人来说,这可能更值得考虑。
安全性
我见过很多内部维护的生产服务器都滞后于安全更新,或者总体上组织不佳。使用Heroku,你有别人管理这样的事情,这既是一种福音也是一种诅咒,取决于你的看法!
当你部署时,实际上是将你的代码直接交给了Heroku。这可能对你有问题。他们关于
Dyno隔离的文章详细介绍了他们的隔离技术(似乎多个dyno在独立的EC2实例上运行)。一些同事对这些技术和它们的隔离强度表示担忧;我很遗憾没有足够的知识/经验来真正评论,但我的当前Heroku部署认为“足够好”。这可能是一个问题,我不知道。
扩展
我在上面的IaaS与PaaS比较中提到了如何实现这一点。大致来说,你的应用程序有一个Procfile
,其中有形式为dyno_type:command_to_run
的行,例如(摘自Heroku架构-过程模型):
web: bundle exec rails server
worker: bundle exec rake jobs:work
这个,带有一个:
heroku scale web:2 worker:10
将其设置为2个
web
dyno和10个
worker
dyno将会使您的应用程序运行。很好,简单易懂。请注意,
web
是一种特殊的dyno类型,它可以访问外部世界,并且位于他们美好的Web流量多路复用器(可能是某种Varnish / nginx组合)后面,该多路复用器将相应地路由流量。您的工作者可能会与消息队列进行交互以进行类似的路由,从中他们将通过环境中的URL获取位置。
成本效益
许多人对此有许多不同的意见。目前每小时的dyno费用为$0.05,而AWS微实例的每小时费用为$0.025,AWS小型实例的每小时费用为$0.09。
Heroku的dyno documentation文档称你有大约512MB的RAM,因此将dyno视为类似于EC2微实例可能不是太不合理。它值得加倍的价格吗?你如何评价自己的时间?在IaaS提供商上构建并将其提升到这个标准所需的时间和精力肯定不便宜。我无法真正回答这个问题,但不要低估安装和维护的“隐藏成本”。
(A bit of an aside, but if I connect to a dyno from here (
heroku run bash
), a cursory look shows 4 cores in
/proc/cpuinfo
and 36GB of RAM - this leads me to believe that I'm on a
"High-Memory Double Extra Large Instance". The Heroku
dyno documentation says each dyno receives 512MB of RAM, so I'm potentially sharing with up to 71 other dynos. (I don't have enough data about the homogeny of Heroku's AWS instances, so your milage may vary))
它们与竞争对手相比如何?
抱歉,我无法真正帮助您。我曾经关注的唯一竞争对手是
Google App Engine - 当时我正在寻找部署Java应用程序,并且
可用框架和技术的限制量令人非常沮丧。这不仅仅是“Java的事情” - 一般限制和必要考虑的数量(
FAQ指出了几个)似乎不太方便。相比之下,部署到Heroku是一个梦想。
结论
请留言以指出空缺/其他需要解决的领域。我觉得我应该提供我的个人立场。我喜欢Heroku的“快速部署”。当我开始一个应用程序,并且想要一些廉价托管(Heroku免费层非常棒-如果您只需要一个Web dyno和5MB的PostgreSQL,那么托管应用程序是免费的),Heroku是我的首选位置。对于带有服务级别协议、专门用于操作的时间等多个付费客户的“严肃生产部署”,我无法将那么多控制权转移给Heroku,然后AWS或我们自己的服务器成为首选托管平台。
最终,这取决于哪种方式最适合您。您说您是“初学者程序员”-也许使用Heroku会让您专注于编写Ruby,而不必花费时间构建围绕代码的所有其他基础设施。我肯定会试试。
注意,AWS实际上有一个PaaS服务
Elastic Beanstalk,支持Ruby、Node.js、PHP、Python、.NET和Java。当大多数人看到“AWS”时,他们通常会想到EC2、S3和EBS等明显的IaaS服务。