Po pierwsze, AWS i Heroku to różne rzeczy. AWS oferuje infrastrukturę jako usługę ( IaaS ), podczas gdy Heroku oferuje platformę jako usługę ( PaaS ).
Co za różnica? W przybliżeniu IaaS zapewnia komponenty potrzebne do zbudowania czegoś na nim; PaaS zapewnia środowisko, w którym po prostu wypychasz kod oraz podstawową konfigurację i dostajesz działającą aplikację. IaaS może dać ci więcej mocy i elastyczności, kosztem konieczności samodzielnego budowania i utrzymywania.
Aby twój kod działał w AWS i wyglądał trochę jak wdrożenie Heroku, będziesz potrzebować niektórych instancji EC2 - będziesz chciał zainstalować na nich moduł równoważenia obciążenia / buforowania (np. Varnish ), będziesz chciał instancji uruchamiających coś w rodzaju Passenger i nginx do obsługi kodu, będziesz chciał wdrożyć i skonfigurować klastrową instancję bazy danych czegoś takiego jak PostgreSQL . Będziesz potrzebował systemu wdrażania z czymś takim jak Capistrano i czymś gromadzącym logi.
To nie jest niewielka ilość pracy do skonfigurowania i utrzymania. W Heroku wysiłek, aby przejść do tego rodzaju etapu, to może kilka linii kodu aplikacji i git push
.
Więc jesteś tak daleko i chcesz zwiększyć skalę. Świetny. Używasz Puppet do wdrożenia EC2, prawda? Tak więc teraz konfigurujesz pliki Capistrano, aby odpowiednio zwiększać / zmniejszać instancje; ponownie konfigurujesz konfigurację Puppet, aby Varnish wiedział o instancjach web-workera i automatycznie gromadził między nimi pule. Albo ty heroku scale web:+5
.
Mam nadzieję, że daje to wyobrażenie o porównaniu obu. Teraz, aby zająć się swoimi konkretnymi punktami:
Prędkość
Obecnie Heroku działa tylko na instancjach AWS w us-east
i eu-west
. Dla ciebie to i tak brzmi jak chcesz. Dla innych jest to potencjalnie więcej uwagi.
Bezpieczeństwo
Widziałem wiele wewnętrznie utrzymywanych serwerów produkcyjnych, które są daleko w tyle w przypadku aktualizacji zabezpieczeń lub po prostu ogólnie źle połączone. Dzięki Heroku masz kogoś innego zarządzającego tego rodzaju rzeczami, które są albo błogosławieństwem, albo przekleństwem, w zależności od tego, jak na to patrzysz!
Podczas wdrażania skutecznie przekazujesz swój kod bezpośrednio Heroku. To może być dla ciebie problem. W artykule na temat izolacji dyno wyszczególniono ich technologie izolacji (wygląda na to, że na poszczególnych instancjach EC2 działa wiele dyn). Kilku kolegów wyraziło problemy z tymi technologiami i siłą ich izolacji; Niestety nie mam wystarczającej wiedzy / doświadczenia, aby naprawdę komentować, ale moje obecne wdrożenia Heroku uważają to za „wystarczająco dobre”. To może być dla ciebie problem, nie wiem.
skalowanie
Dotknąłem powyższego sposobu, w jaki można to zaimplementować w moim porównaniu IaaS vs PaaS. W przybliżeniu twoja aplikacja ma linię Procfile
, która ma wiersze formularza dyno_type: command_to_run
, więc na przykład (cribbed from http://devcenter.heroku.com/articles/process-model ):
web: bundle exec rails server
worker: bundle exec rake jobs:work
To z:
heroku scale web:2 worker:10
spowoduje, że uruchomisz 2 web
dynos i 10 worker
dynos. Miło, prosto, łatwo. Zauważ, że web
jest to specjalny typ hamowni, który ma dostęp do świata zewnętrznego, i stoi za ładnym multiplekserem ruchu sieciowego (prawdopodobnie jakąś kombinacją Varnish / nginx), który odpowiednio kieruje ruchem. Twoi pracownicy prawdopodobnie wchodzą w interakcję z kolejką komunikatów dla podobnego routingu, z której uzyskają lokalizację za pośrednictwem adresu URL w środowisku.
Efektywność kosztowa
Wiele osób ma na ten temat wiele różnych opinii. Obecnie jest to 0,05 USD / godz. Za godzinę dynamiki, w porównaniu do 0,025 USD / godz. W przypadku mikro instancji AWS lub 0,09 USD / godz. W przypadku małej instancji AWS.
Heroku za dokumentację dyno mówi trzeba około 512 MB pamięci RAM, więc to chyba nie zbyt nierozsądne rozważyć dyno jak trochę jak instancji EC2 mikro. Czy warto podwoić cenę? Ile cenisz swój czas? Ilość czasu i wysiłku potrzebnego do zbudowania oferty IaaS w celu dostosowania jej do tego standardu zdecydowanie nie jest tania. Naprawdę nie mogę odpowiedzieć na to pytanie, ale nie lekceważ „ukrytych kosztów” konfiguracji i konserwacji.
(Trochę na bok, ale jeśli podłączę się tutaj do hamowni ( heroku run bash
), pobieżny wygląd pokazuje 4 rdzenie /proc/cpuinfo
i 36 GB pamięci RAM - to prowadzi mnie do przekonania, że jestem w „Bardzo dużej instancji podwójnie dużej pamięci” " . Dokumentacja dyno Heroku mówi, że każda hamownia otrzymuje 512 MB pamięci RAM, więc potencjalnie udostępniam maksymalnie 71 innym dynom. (Nie mam wystarczających danych na temat homogeniczności instancji AWS Heroku, więc twój przebieg może się różnić))
Jak radzą sobie w porównaniu z konkurencją?
Obawiam się, że nie mogę ci pomóc. Jedynym konkurentem, na jakiego naprawdę patrzyłem, był Google App Engine - w tamtym czasie chciałem wdrożyć aplikacje Java, a ilość ograniczeń dotyczących użytecznych platform i technologii była niesamowicie odrażająca. To coś więcej niż „tylko Java” - ilość ogólnych ograniczeń i niezbędnych uwag ( kilka wskazówek FAQ ) wydawała się mniej niż wygodna. Natomiast wdrożenie w Heroku było snem.
Wniosek
Mam nadzieję, że to odpowiada na twoje pytania (proszę o komentarz, jeśli są luki / inne obszary, które chciałbyś rozwiązać). Czuję, że powinienem zaoferować swoje osobiste stanowisko. Uwielbiam Heroku za „szybkie wdrażanie”. Kiedy uruchamiam aplikację i chcę taniego hostingu (darmowa warstwa Heroku jest niesamowita - w zasadzie, jeśli potrzebujesz tylko jednej dynamiki internetowej i 5 MB PostgreSQL, możesz bezpłatnie hostować aplikację), Heroku jest moją pozycją do przejścia . W przypadku „Serious Production Deployment” z kilkoma płatnymi klientami, z umową dotyczącą poziomu usług, ze specjalnym czasem na wydatki na operacje, itd., Nie mogę się zmusić do przeniesienia tak dużej kontroli na Heroku, a potem AWS lub nasze własne serwery były wybraną platformą hostingową.
Ostatecznie chodzi o to, co działa najlepiej dla Ciebie. Mówisz, że jesteś „początkującym programistą” - być może po prostu używanie Heroku pozwoli ci skoncentrować się na pisaniu w języku Ruby i nie będziesz musiał spędzać czasu na budowaniu całej infrastruktury wokół kodu. Zdecydowanie spróbuję.
Uwaga: AWS ma w rzeczywistości ofertę PaaS, Elastic Beanstalk , która obsługuje Ruby, Node.js, PHP, Python, .NET i Java. Myślę, że generalnie większość ludzi, widząc „AWS”, przeskakuje do takich rzeczy jak EC2, S3 i EBS, które są zdecydowanie ofertami IaaS