Lo primero es lo primero, AWS y Heroku son cosas diferentes. AWS ofrece Infraestructura como Servicio ( IaaS ) mientras que Heroku ofrece una Plataforma como Servicio ( PaaS ).
¿Cual es la diferencia? Muy aproximadamente, IaaS le brinda los componentes que necesita para construir cosas sobre él; PaaS le brinda un entorno en el que simplemente inserta código y alguna configuración básica y obtiene una aplicación en ejecución. IaaS puede darle más potencia y flexibilidad, a costa de tener que construir y mantener más usted mismo.
Para que su código se ejecute en AWS y se parezca un poco a una implementación de Heroku, querrá algunas instancias EC2; querrá un equilibrador de carga / capa de almacenamiento en caché instalada en ellas (por ejemplo, Varnish ), querrá instancias que ejecuten algo como Passenger y nginx para servir su código, querrá implementar y configurar una instancia de base de datos en clúster de algo como PostgreSQL . Querrá un sistema de implementación con algo como Capistrano , y algo que haga agregación de registros.
Esa no es una cantidad insignificante de trabajo para configurar y mantener. Con Heroku, el esfuerzo requerido para llegar a ese tipo de etapa es tal vez unas pocas líneas de código de aplicación y a git push
.
Así que estás tan lejos y quieres escalar. Excelente. Estás utilizando Puppet para tu implementación de EC2, ¿verdad? Así que ahora configura sus archivos Capistrano para aumentar / disminuir las instancias según sea necesario; vuelve a mover la configuración de Puppet para que Varnish conozca las instancias de los trabajadores web y se agrupe automáticamente entre ellas. O usted heroku scale web:+5
.
Esperemos que eso te dé una idea de la comparación entre los dos. Ahora para abordar sus puntos específicos:
Velocidad
Actualmente Heroku solo se ejecuta en instancias de AWS en us-east
y eu-west
. Para ti, esto suena como lo que quieres de todos modos. Para otros, es potencialmente más una consideración.
Seguridad
He visto muchos servidores de producción mantenidos internamente que están muy atrasados en las actualizaciones de seguridad, o en general mal ensamblados. Con Heroku, tienes a alguien más manejando ese tipo de cosas, ¡lo cual es una bendición o una maldición dependiendo de cómo lo mires!
Cuando despliega, efectivamente está entregando su código directamente a Heroku. Esto puede ser un problema para ti. Su artículo sobre Dyno Isolation detalla sus tecnologías de aislamiento (parece que se ejecutan múltiples dynos en instancias individuales de EC2). Varios colegas han expresado problemas con estas tecnologías y la fuerza de su aislamiento; Por desgracia, no estoy en una posición de suficiente conocimiento / experiencia para comentar realmente, pero mis implementaciones actuales de Heroku lo consideran "lo suficientemente bueno". Puede ser un problema para ti, no lo sé.
Escalada
Toqué cómo se podría implementar esto en mi comparación de IaaS vs PaaS anterior. Aproximadamente, su aplicación tiene un Procfile
, que tiene líneas del formulario dyno_type: command_to_run
, por ejemplo (citado desde http://devcenter.heroku.com/articles/process-model ):
web: bundle exec rails server
worker: bundle exec rake jobs:work
Esto, con un:
heroku scale web:2 worker:10
resultará en que tenga 2 web
dynos y 10 worker
dynos corriendo. Agradable, simple, fácil. Tenga en cuenta que web
es un tipo de dinamómetro especial, que tiene acceso al mundo exterior, y está detrás de su agradable multiplexor de tráfico web (probablemente algún tipo de combinación Varnish / nginx) que enrutará el tráfico en consecuencia. Sus trabajadores probablemente interactúen con una cola de mensajes para un enrutamiento similar, del cual obtendrán la ubicación a través de una URL en el entorno.
Eficiencia de costo
Mucha gente tiene muchas opiniones diferentes sobre esto. Actualmente cuesta $ 0.05 / hr por una hora dyno, en comparación con $ 0.025 / hr para una micro instancia de AWS o $ 0.09 / hr para una pequeña instancia de AWS.
La documentación del dinamómetro de Heroku dice que tiene aproximadamente 512 MB de RAM, por lo que probablemente no sea demasiado irrazonable considerar un dinamómetro como un poco como una micro instancia EC2. ¿Vale el doble del precio? ¿Cuánto valoras tu tiempo? La cantidad de tiempo y esfuerzo necesarios para construir sobre una oferta de IaaS para llegar a este estándar definitivamente no es barata. Realmente no puedo responder esta pregunta por usted, pero no subestime los "costos ocultos" de la configuración y el mantenimiento.
(Un poco aparte, pero si me conecto a un banco de pruebas desde aquí ( heroku run bash
), un aspecto superficial muestra 4 núcleos /proc/cpuinfo
y 36 GB de RAM; esto me lleva a creer que estoy en una "Instancia doble extra grande de alta memoria" " . La documentación del dinamómetro de Heroku dice que cada dinamómetro recibe 512 MB de RAM, por lo que potencialmente estoy compartiendo con hasta otros 71 dinamómetros.
¿Cómo les va a sus competidores?
Esto, me temo que realmente no puedo ayudarte. El único competidor que he visto realmente fue Google App Engine , en el momento en que buscaba implementar aplicaciones Java, y la cantidad de restricciones en los marcos y tecnologías utilizables fue increíblemente desagradable. Esto es más que "solo una cuestión de Java": la cantidad de restricciones generales y las consideraciones necesarias ( las preguntas más frecuentes sugieren varias) parecían menos que convenientes. En contraste, desplegarse en Heroku ha sido un sueño.
Conclusión
Espero que esto responda a sus preguntas (comente si hay lagunas / otras áreas que le gustaría abordar). Siento que debería ofrecer mi posición personal. Amo a Heroku por "despliegues rápidos". Cuando estoy iniciando una aplicación, y quiero un alojamiento barato (el nivel gratuito de Heroku es increíble, esencialmente si solo necesita un dinamómetro web y 5MB de PostgreSQL, es gratis alojar una aplicación), Heroku es mi posición de acceso . Para el "Despliegue de producción serio" con varios clientes que pagan, con un acuerdo de nivel de servicio, con tiempo dedicado para gastar en operaciones, etc., no puedo descargar ese control en Heroku, y luego AWS o nuestros propios servidores han sido la plataforma de alojamiento elegida.
En definitiva, se trata de lo que funciona mejor para usted. Dices que eres "un programador principiante", puede ser que usar Heroku te permita concentrarte en escribir Ruby y no tengas que perder el tiempo construyendo toda la infraestructura alrededor de tu código. Definitivamente lo probaría.
Tenga en cuenta que AWS en realidad tiene una oferta de PaaS, Elastic Beanstalk , que admite Ruby, Node.js, PHP, Python, .NET y Java. Creo que, en general, la mayoría de las personas, cuando ven "AWS", saltan a cosas como EC2 y S3 y EBS, que definitivamente son ofertas de IaaS