Co to jest serverless? Wyjaśnienie przetwarzania bezserwerowego

Programiści spędzają niezliczone godziny na rozwiązywaniu problemów biznesowych za pomocą kodu. Następnie nadeszła kolej zespołu operacyjnego, aby spędzić niezliczone godziny, najpierw zastanawiając się, jak uzyskać kod, który programiści zapisują i uruchamiają na dowolnych dostępnych komputerach, a po drugie, upewniając się, że te komputery działają płynnie. Druga część to naprawdę niekończące się zadanie. Dlaczego nie zostawić tej części komuś innemu?

Wiele innowacji w IT w ciągu ostatnich dwóch dekad - maszyny wirtualne, przetwarzanie w chmurze, kontenery - skupiło się na upewnieniu się, że nie musisz dużo myśleć o podstawowej maszynie fizycznej, na której działa Twój kod. Przetwarzanie bezserwerowe jest coraz bardziej popularnym paradygmatem, który prowadzi to pragnienie do logicznego wniosku: dzięki przetwarzaniu bezserwerowemu nie musisz nic wiedzieć o sprzęcie lub systemie operacyjnym, na którym działa Twój kod, ponieważ wszystkim zajmuje się za Ciebie usługodawca .

Co to jest przetwarzanie bezserwerowe?

Przetwarzanie bezserwerowe to model wykonania dla chmury, w którym dostawca chmury dynamicznie przydziela - a następnie pobiera od użytkownika - tylko zasoby obliczeniowe i pamięć masową potrzebne do wykonania określonego fragmentu kodu. Oczywiście nadal są zaangażowane serwery, ale ich udostępnianie i konserwacja są całkowicie obsługiwane przez dostawcę. Chris Munns, zwolennik technologii bezserwerowej w firmie Amazon, powiedział na konferencji w 2017 r., Że z punktu widzenia zespołu piszącego i wdrażającego kod „w ogóle nie ma serwerów, którymi można by zarządzać lub udostępniać. Nie obejmuje to niczego, co byłoby gołym metalem, niczego, co jest wirtualne, niczego, co jest kontenerem - wszystko, co wiąże się z zarządzaniem hostem, łataniem hosta lub radzeniem sobie z czymkolwiek na poziomie systemu operacyjnego, nie jest czymś, co powinieneś robić w świat bez serwera ”. 

Jak wyjaśnia programista Mike Roberts, termin ten był kiedyś używany w tak zwanych scenariuszach back-end-as-a-service , w których aplikacja mobilna łączyłaby się z serwerem zaplecza hostowanym w całości w chmurze. Ale dzisiaj, kiedy ludzie mówią o przetwarzaniu bezserwerowym lub architekturze bezserwerowej, mają na myśli oferty funkcjonalne jako usługi , w których klient pisze kod, który zajmuje się tylko logiką biznesową i przesyła go do dostawcy. Ten dostawca zajmuje się udostępnianiem sprzętu, zarządzaniem maszynami wirtualnymi i kontenerami, a nawet zadaniami, takimi jak wielowątkowość, które często są wbudowane w kod aplikacji.

Funkcje bezserwerowe są sterowane zdarzeniami, co oznacza, że ​​kod jest wywoływany tylko wtedy, gdy jest wyzwalany przez żądanie. Dostawca pobiera opłatę tylko za czas obliczeniowy wykorzystany przez to wykonanie, a nie za stałą miesięczną opłatę za utrzymanie fizycznego lub wirtualnego serwera. Funkcje te można łączyć ze sobą w celu utworzenia potoku przetwarzania lub mogą służyć jako komponenty większej aplikacji, współdziałając z innym kodem działającym w kontenerach lub na konwencjonalnych serwerach.

Zalety i wady przetwarzania bezserwerowego

Z tego opisu powinny jasno wynikać dwie największe korzyści z przetwarzania bezserwerowego: programiści mogą skupić się na celach biznesowych napisanego przez siebie kodu, a nie na kwestiach infrastrukturalnych; a organizacje płacą tylko za zasoby obliczeniowe, z których faktycznie korzystają, w bardzo szczegółowy sposób, zamiast kupować fizyczny sprzęt lub wynajmować instancje chmurowe, które w większości pozostają bezczynne.

Jak zauważa Bernard Golden, ten ostatni punkt jest szczególnie korzystny dla aplikacji sterowanych zdarzeniami. Na przykład, możesz mieć aplikację, która jest bezczynna przez większość czasu, ale w pewnych warunkach musi obsługiwać wiele żądań zdarzeń naraz. Lub możesz mieć aplikację, która przetwarza dane wysyłane z urządzeń IoT z ograniczoną lub przerywaną łącznością z Internetem. W obu przypadkach tradycyjne podejście wymagałoby zapewnienia wydajnego serwera, który byłby w stanie obsłużyć szczytową wydajność pracy - ale serwer ten byłby przez większość czasu niedostatecznie wykorzystywany. W przypadku architektury bezserwerowej płacisz tylko za zasoby serwera, których faktycznie używasz. Przetwarzanie bezserwerowe byłoby również dobre w przypadku określonych rodzajów przetwarzania wsadowego.Jednym z kanonicznych przykładów użycia architektury bezserwerowej jest usługa, która przesyła i przetwarza serię pojedynczych plików graficznych i wysyła je do innej części aplikacji.

Być może najbardziej oczywistą wadą funkcji bezserwerowych jest to, że są one celowo efemeryczne i, jak to ujął AlexSoft, „nieodpowiednie do zadań długoterminowych”. Większość dostawców bezserwerowych nie pozwoli na wykonanie kodu dłużej niż kilka minut, a kiedy uruchomisz funkcję, nie zachowuje ona żadnych danych stanowych z wcześniej uruchomionych instancji. Powiązany problem polega na tym, że uruchomienie kodu bezserwerowego może zająć nawet kilka sekund - nie stanowi to problemu w wielu przypadkach użycia, ale jeśli aplikacja wymaga małych opóźnień, należy ostrzec.

Wiele innych wad, jak wskazali Rohit Akiwatkar i Gary Arora, ma związek z blokadą sprzedawcy. Chociaż dostępne są opcje open source, rynek bezserwerowy jest zdominowany przez dużych komercyjnych dostawców chmury, co omówimy za chwilę. Oznacza to, że programiści często używają narzędzi od swoich dostawców, co utrudnia ich zmianę, jeśli są niezadowoleni. A ponieważ tak duża część obliczeń bezserwerowych z definicji odbywa się w infrastrukturze dostawcy, integracja kodu bezserwerowego z wewnętrznymi potokami programowania i testowania może być trudna.

Dostawcy bezserwerowi: AWS Lambda, Azure Functions i Google Cloud Functions

Nowoczesna era obliczeń bezserwerowych rozpoczęła się wraz z uruchomieniem AWS Lambda, platformy opartej na usłudze chmurowej Amazon w 2014 roku. Microsoft poszedł w ślady Azure Functions w 2016 roku. Google Cloud Functions, które było w wersji beta od 2017 roku, wreszcie osiągnęło status produkcyjny w lipcu 2018 r. Te trzy usługi mają nieco inne ograniczenia, zalety, obsługiwane języki i sposoby działania. Rohit Akiwatkar ma dobre i szczegółowe podsumowanie różnic między tą trójką. Uruchomiony jest również IBM Cloud Functions, który jest oparty na platformie Open Source Apache OpenWhisk.

Spośród wszystkich bezserwerowych platform obliczeniowych, AWS Lambda jest najbardziej znana i najwyraźniej miała najwięcej czasu na ewolucję i dojrzewanie. zawiera informacje o aktualizacjach i nowych funkcjach dodanych do AWS Lambda w ciągu ostatniego roku.

Bezserwerowe stosy

Podobnie jak w przypadku wielu dziedzin oprogramowania, w świecie bezserwerowym nastąpiła ewolucja stosów oprogramowania, które łączą różne komponenty potrzebne do zbudowania aplikacji bezserwerowej. Każdy stos składa się z języka programowania , w którym zamierzasz napisać kod, struktury aplikacji zapewniającej strukturę kodu oraz zestawu wyzwalaczy, które platforma zrozumie i użyje do zainicjowania wykonania kodu.

Chociaż możesz łączyć i dopasowywać różne konkretne oferty w każdej z tych kategorii, istnieją ograniczenia w zależności od używanego dostawcy, z pewnym nakładaniem się. Na przykład w przypadku języków można używać Node.js, Java, Go, C # i Python w AWS Lambda, ale tylko JavaScript, C # i F # działają natywnie w funkcjach platformy Azure. Jeśli chodzi o wyzwalacze, AWS Lambda ma najdłuższą listę, ale wiele z nich jest specyficznych dla platformy AWS, np. Amazon Simple Email Service i AWS CodeCommit; W międzyczasie funkcje Google Cloud mogą być uruchamiane przez ogólne żądania HTTP. Paul Jaworski szczegółowo przyjrzał się stosom każdej z trzech dużych ofert.

Struktury bezserwerowe

Warto trochę zatrzymać się nad ramową częścią równania, ponieważ to wiele określi, jak ostatecznie zbudujesz swoją aplikację. Amazon ma swoją własną ofertę natywną, Open Source Serverless Application Model (SAM), ale są też inne, z których większość jest wieloplatformowa, a także open source. Jedna z najpopularniejszych nazywa się, dość ogólnie, Serverless i podkreśla, że ​​zapewnia to samo doświadczenie na każdej obsługiwanej platformie, tj. AWS Lambda, Azure Functions, Google Cloud Functions i IBM OpenWhisk. Inną popularną ofertą jest Apex, która może pomóc wprowadzić do walki niektóre języki niedostępne w innym przypadku u niektórych dostawców.

Bezserwerowe bazy danych

Jak zauważyliśmy powyżej, jednym z dziwactw pracy z kodem bezserwerowym jest brak trwałego stanu, co oznacza, że ​​wartości zmiennych lokalnych nie są zachowywane w instancjach. Wszelkie trwałe dane, do których Twój kod musi uzyskać dostęp, muszą być przechowywane w innym miejscu, a wyzwalacze dostępne w stosach dla głównych dostawców obejmują bazy danych, z którymi funkcje mogą wchodzić w interakcje.

Niektóre z tych baz danych są określane jako bezserwerowe. Oznacza to, że zachowują się podobnie jak inne funkcje bezserwerowe, które omówiliśmy w tym artykule, z oczywistym wyjątkiem, że dane są przechowywane w nieskończoność. Jednak znaczna część kosztów związanych z zarządzaniem związanych z udostępnianiem i utrzymywaniem bazy danych jest odrzucana. Jak ujął to programista Jeremy Daly: „Wszystko, co musisz zrobić, to skonfigurować klaster, a następnie wszystkie czynności konserwacyjne, poprawki, kopie zapasowe, replikacja i skalowanie są obsługiwane automatycznie”. Podobnie jak w przypadku ofert typu funkcja jako usługa, płacisz tylko za faktycznie wykorzystany czas obliczeniowy, a zasoby są zwiększane i zmniejszane w zależności od potrzeb.

Duzi trzej bezserwerowi dostawcy oferują własne bezserwerowe bazy danych: Amazon ma Aurora Serverless i DynamoDB, Microsoft ma Azure Cosmos DB, a Google ma Cloud Firestore. Nie są to jednak jedyne dostępne bazy danych. Nemanja Novkovic ma informacje na temat innych ofert.

Obliczenia bezserwerowe i Kubernetes

Kontenery pomagają zasilać technologię bezserwerową pod maską, ale koszty zarządzania nimi przejmuje sprzedawca, a zatem są niewidoczne dla użytkownika. Wiele osób postrzega przetwarzanie bezserwerowe jako sposób na uzyskanie wielu zalet mikrousług kontenerowych bez konieczności zajmowania się ich złożonością, a nawet zaczyna mówić o świecie post-kontenerowym.

W rzeczywistości kontenery i przetwarzanie bezserwerowe prawie na pewno będą współistnieć przez wiele nadchodzących lat, a funkcje bezserwerowe mogą istnieć w tej samej aplikacji, co mikrousługi kontenerowe. Kubernetes, najpopularniejsza platforma do orkiestracji kontenerów, może również zarządzać infrastrukturą bezserwerową. Rzeczywiście, dzięki Kubernetes możesz zintegrować różne typy usług w jednym klastrze.  

Bezserwerowy w trybie offline

Perspektywa rozpoczęcia pracy z komputerami bezserwerowymi może wydawać się nieco onieśmielająca, ponieważ wydaje się, że musisz zarejestrować się u dostawcy, aby pobawić się i zobaczyć, jak to działa. Ale nie bój się: istnieją sposoby na uruchamianie kodu bezserwerowego w trybie offline na własnym sprzęcie lokalnym. Na przykład AWS SAM zapewnia funkcję lokalną, która umożliwia testowanie kodu Lambda w trybie offline. A jeśli korzystasz ze środowiska aplikacji Serverless, wypróbuj bezserwerową wtyczkę, która umożliwia uruchamianie kodu lokalnie. Miłego eksperymentowania!