Na dobre lub na złe przeprowadziliśmy migrację całej naszej aplikacji internetowej LAMP z dedykowanych maszyn do chmury (maszyny Amazon EC2). Jak dotąd idzie świetnie, ale sposób, w jaki robimy crony, jest nieoptymalny. Mam pytanie dotyczące Amazona, jak najlepiej zarządzać zadaniami cron w chmurze przy użyciu „sposobu Amazon”.
Problem : mamy wiele serwerów internetowych i musimy uruchamiać crony do zadań wsadowych, takich jak tworzenie kanałów RSS, wyzwalanie wiadomości e-mail, a właściwie wiele różnych rzeczy. ALE zadania crona muszą być uruchamiane tylko na jednym komputerze, ponieważ często zapisują w bazie danych, więc zduplikowałyby wyniki, gdyby były uruchamiane na wielu komputerach.
Do tej pory wyznaczyliśmy jeden z serwerów WWW jako „główny serwer WWW” i ma on kilka „specjalnych” zadań, których nie mają inne serwery sieciowe. Kompromisem za przetwarzanie w chmurze jest niezawodność - nie chcemy „głównego serwera internetowego”, ponieważ jest to pojedynczy punkt awarii. Chcemy, aby wszystkie były identyczne i aby można było przeskalować w górę lub w dół bez pamiętania, aby nie usuwać głównego serwera internetowego z klastra.
Jak możemy przeprojektować naszą aplikację, aby konwertować zadania Linux cron na przejściowe elementy pracy, które nie mają ani jednego punktu awarii?
Moje dotychczasowe pomysły:
- Miej maszynę przeznaczoną tylko do uruchamiania cronów. Byłoby to trochę łatwiejsze w zarządzaniu, ale nadal stanowiłoby pojedynczy punkt awarii i zmarnowałoby trochę pieniędzy na posiadanie dodatkowej instancji.
- Niektóre zadania można by przenieść z cronów Linuksa do MySQL Events, jednak nie jestem wielkim fanem tego pomysłu, ponieważ nie chcę umieszczać logiki aplikacji w warstwie bazy danych.
- Być może możemy uruchomić wszystkie crony na wszystkich maszynach, ale zmienić nasze skrypty cron, aby wszystkie zaczęły się od odrobiny logiki, która implementuje mechanizm blokujący, więc tylko jeden serwer faktycznie podejmuje działanie, a inne po prostu pomijają. Nie jestem fanem tego pomysłu, ponieważ brzmi to potencjalnie błędnie i wolałbym skorzystać z najlepszych praktyk Amazon, zamiast tworzyć własne.
- Wyobrażam sobie sytuację, w której zadania są gdzieś zaplanowane, dodane do kolejki, a następnie każdy z serwerów WWW może być pracownikiem, który może powiedzieć „hej, wezmę to”. Amazon Simple Workflow Service brzmi dokładnie w ten sposób, ale obecnie niewiele o nim wiem, więc wszelkie szczegóły byłyby pomocne. Wydaje się, że coś tak prostego jak cron wydaje się ciężkie? Czy jest to właściwa usługa, czy może istnieje bardziej odpowiednia usługa Amazon?
Aktualizacja: Od czasu zadania pytania obejrzałem webinarium Amazon Simple Workflow Service na YouTube i zauważyłem o 34:40 ( http://www.youtube.com/watch?v=lBUQiek8Jqk#t=34m40s ). slajd wspominający o zadaniach cron jako przykładowej aplikacji. Na swojej stronie dokumentacji „ AWS Flow Framework samples for Amazon SWF ” Amazon podaje, że ma przykładowy kod dla cronów:
... > Zadania Cron W tym przykładzie długotrwały przepływ pracy okresowo wykonuje działanie. Pokazana jest możliwość kontynuowania wykonywania jako nowych egzekucji, tak aby wykonanie mogło działać przez bardzo długi czas. ...
Ściągnąłem AWS SDK dla Java ( http://aws.amazon.com/sdkforjava/ ) i na pewno zakopany w śmiesznych warstwach folderów jest kod java ( aws-java-sdk-1.3.6/samples/AwsFlowFramework/src/com/amazonaws/services/simpleworkflow/flow/examples/periodicworkflow
).
Problem polega na tym, że jeśli mam być szczery, to nie pomaga, ponieważ nie jest to coś, co mogę łatwo strawić dzięki moim umiejętnościom. Brakuje tej samej próbki w PHP SDK i nie wydaje się, aby istniał samouczek, który omawia ten proces. Zasadniczo więc wciąż szukam porad lub wskazówek.