e-Commerce w ChmurzeHandel

Zasady architektury dla chmury



Przetwarzanie w chmurze nie powinno być trudne do przyjęcia, pod warunkiem, że Twoja organizacja jest kompetentna, chętna do wprowadzania zmian i posiada odpowiednie zasoby. Jeśli zastosowałeś się już do zasad zawartych w dwóch pierwszych częściach tej książki, oznacza to, że jesteś kompetentny i chętny do wprowadzania zmian, dlatego też nie powinien mieć problemów obejmujących przetwarzanie w chmurze. Pełniejsze przyjęcie przetwarzania w chmurze jest ogromnym przedsięwzięciem, ale może być dość bezbolesne, jeśli zostanie właściwie wykonane. Problem z pełniejszym wykorzystaniem chmury obliczeniowej polega na tym, że znacznie pogarsza zarówno braki organizacyjne, jak i techniczne. Jeśli już dziś zmagasz się z utrzymaniem platformy, chmura z pewnością pogorszy Twoje problemy. Z drugiej strony chmura może być równie transformująca w odpowiednich rękach. Przetwarzanie w chmurze jest potężne, a ci, którzy go opanują, będą mieli przewagę konkurencyjną w nadchodzących latach. W tym rozdziale omówimy, jak e-commerce jest wyjątkowy z punktu widzenia architektury, a następnie, jak zaprojektować e-commerce dla chmury. Dodatkowa uwaga zostanie skoncentrowana na tym, czym jest skalowalność i jak ją osiągnąć. Kolejne części tej części książki omawiają, jak faktycznie przyjąć różne formy przetwarzania w chmurze.

Dlaczego eCommerce jest wyjątkowe?

Przyjrzyjmy się kilku wyjątkowym cechom e-commerce. Oto powody, dla których platformy eCommerce są projektowane i wdrażane inaczej niż większość innych systemów.

Generowanie przychodów

Wraz ze wzrostem sprzedaży detalicznej wielokanałowej większość przychodów płynie teraz przez platformę e-commerce organizacji. Awaria na całej platformie zapobiegnie uzyskiwaniu przychodów przez całą organizację. Jest to odpowiednik blokowania klientom dostępu do wszystkich fizycznych sklepów detalicznych. Wiele organizacji jest teraz w stanie dokładnie obliczyć, ile każda sekunda przestoju kosztuje ich utracone przychody. Jednak rzeczywistym długoterminowym kosztem przestoju są szkody wyrządzone reputacji marki. Wielu klientów nie wróci po awarii. Z powodu tego, jak ważny jest e-commerce, większość środowisk jest ogromnie przepełniona.

Widoczność

Widoczność charakteryzuje większość platform e-commerce, często służąc jako twarz publiczna i coraz częściej zaplecze organizacji. Każde żądanie HTTP odzwierciedla tę markę, podobnie jak stan fizyczny sklepu. Każda milisekunda opóźnionego czasu reakcji słabiej odbija się na tej marce. 100-milisekundowa reakcja zachwyci klientów i sprawi, że marka zabłyśnie, a 10-sekundowa reakcja zdenerwuje klientów i zniszczy markę.

Spikiness ruchu

Cechą charakterystyczną e-commerce jest to, że podlega on często nieprzewidywalnym skokom ruchu, który jest o jeden lub dwa rzędy wielkości większy niż stan ustalony. Większość oprogramowania po prostu nie została stworzona do obsługi ogromnych skoków ruchu. Na przykład pule połączeń z bazami danych na serwerach aplikacji często nie mogą natychmiast podwoić lub potroić wielkości danej puli połączeń. Oprogramowanie zaprojektowano z myślą o świecie, w którym było ono wdrażane statycznie, a obciążenia były dość stabilne. W dzisiejszym świecie przepustowość można zapewnić i natychmiast zatrzasnąć przy pełnym obciążeniu ruchem. Dobrze zaprojektowane oprogramowanie jest często w stanie poradzić sobie z tymi skokami ruchu, ale nie zawsze.

Bezpieczeństwo

Wszyscy słusznie troszczą się o bezpieczeństwo. Organizacje często ponoszą odpowiedzialność za naruszenia, a nawet niewielkie naruszenia kosztują dziesiątki milionów dolarów, nie wspominając już o negatywnej reklamie i utracie zaufania ze strony klientów. Naruszenia zwykle są dalekosiężne, z ujawnieniem wszystkich zarządzanych danych. Rzadko zdarza się, aby zagrożony był tylko podzbiór informacji o kliencie. Wprowadzenie przetwarzania w chmurze, w zależności od sposobu jego wykorzystania, może oznaczać, że więcej danych jest częściej przesyłanych przez niezaufane sieci i przetwarzanych na współużytkowanym sprzęcie, co dodatkowo zwiększa złożoność zabezpieczenia tych danych.

Stanowość

Żądania HTTP można podzielić na dwie klasy: te, które wymagają stanu i te, które nie wymagają stanu. Stan jest zwykle reprezentowany jako sesja HTTP. Jest to tymczasowy obszar przechowywania, który jest unikalny dla danego klienta i trwały dla żądań HTTP. Na przykład koszyki są zwykle przechowywane w sesji HTTP. Status uwierzytelnienia jest również utrwalany przez czas trwania sesji. Protokół HTTP jest z definicji bezstanowy, ale stan dodawany jest na wierzchu przez serwery aplikacji i klientów, aby zapewnić podstawową funkcję e-commerce. Żądania HTTP od anonimowych klientów dotyczące statycznych stron nietransakcyjnych (np. Strony głównej, strony ze szczegółami produktu) zasadniczo nie wymagają stanu. Stan zazwyczaj zaczyna się po zalogowaniu lub dodaniu do koszyka. Wyzwaniem związanym z e-commerce jest to, że klienci często przeglądają anonimowo przez dłuższy czas, zanim zidentyfikują się po zalogowaniu. Większość dużych witryn zmusza Cię do natychmiastowego zalogowania się (np. Media społecznościowe, e-mail, bankowość internetowa) lub wcale (wiadomości , wyszukiwarki, Wikipedia). Logując się w witrynie e-commerce, musisz scalić wszystko, co wydarzyło się w trakcie sesji, z danymi, które utrwalono na temat klienta. Na przykład personalizację można zastosować, aby uzyskać zniżkę na wszystkie buty Nike po obejrzeniu 10 butów Nike i nie kupieniu niczego. Anonimowy klient, który obejrzał osiem par butów Nike, nie uruchomiłby zniżki. Ale co się stanie, gdy anonimowy użytkownik zaloguje się na konto, które już zarejestrowało cztery wyświetlenia strony Nike? Promocja zostanie następnie uruchomiona po pomyślnym połączeniu anonimowego profilu klienta i zalogowanego profilu klienta. Omówimy to bardziej w części 10, ale innym problemem jest problem wielu równoczesnych logowań dla tego samego konta. Co się stanie, jeśli mąż i żona zalogują się na to samo konto, jednocześnie wprowadzając zmiany do tego samego zamówienia i profilu klienta w bazie danych? W przypadku jednego centrum danych nie stanowi to problemu, ponieważ udostępniasz jedną logiczną bazę danych. Ale co się dzieje, gdy używasz publicznej infrastruktury jako usługi do hostingu i rozpościerasz platformę e-commerce na dwa centra danych, a każde centrum danych ma własną bazę danych? Utrzymanie stanu w żądaniach HTTP najczęściej oznacza, że dany klient musi zostać przekierowany do tego samego centrum danych, modułu równoważenia obciążenia, serwera WWW (jeśli jest używany) i instancji serwera aplikacji. Utrzymanie tej lepkości wymaga dodatkowej uwagi, z którą wiele innych aplikacji nie musi sobie poradzić.

Co to jest skalowalność?

Ściśle mówiąc, skalowalność to zdolność systemu do zwiększenia wydajności (na przykład obsługiwanych jednoczesnych użytkowników lub żądań HTTP na sekundę) poprzez dodanie większej liczby danych wejściowych (na przykład dodatkowego serwera). Aby być idealnie skalowalnym, twoje dane wejściowe muszą zawsze być równe twoim wynikom w tej samej proporcji. Na przykład, jeśli twój pierwszy serwer zapewnia 200 wyświetleń strony na sekundę, twój 1.000 serwer powinien również zapewnić 200 wyświetleń strony na sekundę. Jeśli Twój pierwszy serwer zapewnia 200 wyświetleń strony na sekundę, a Twój 1000 serwer zapewnia 20 wyświetleń stron na sekundę, twój system ma problem ze skalowalnością. Wszystkie warstwy stosu muszą być jednakowo skalowalne, od DNS do pamięci. Omówimy dwie formy skalowalności: skalowanie w górę (w pionie) i skalowanie w górę (w poziomie).

Wydajność

Przepustowość odnosi się do ilości pracy lub pojemności, które może obsłużyć jednostka danych wejściowych (np. Serwer, węzeł siatki pamięci podręcznej, węzeł bazy danych) lub cały system. Typowe przykłady metryk używanych do reprezentowania przepustowości obejmują:

•  Wyświetlenia strony na sekundę
•  Transakcje na sekundę
•  Współbieżni klienci

Nie należy mylić przepustowości z ogólną skalowalnością całego systemu, ponieważ oba są od siebie niezależne. Przepustowość pojedynczej jednostki wejściowej (np. Serwera aplikacji) może być niska, ale o ile można stale uzyskiwać ten sam poziom marginalnej wydajności (np. Odsłon stron na sekundę), gdy zwiększa się liczbę danych wejściowych, system jest skalowalny.

Skalowanie

Skalowanie w górę, znane również jako skalowalność pionowa, zwiększa wydajność (np. Liczbę odsłon na sekundę) stałej jednostki wejściowej (np. Serwer aplikacji działający na 8 rdzeniach). Gdy zwiększysz wydajność serwera aplikacji z 200 wyświetleń strony na sekundę do 250 wyświetleń strony na sekundę, zwiększyłeś ten zasób. Skalowanie może być wykonywane przez optymalizację (większe buforowanie, zwiększenie wydajności kodu itd.) Lub dodanie większej ilości zasobów fizycznych (np. Przejście z 8 vCPU na 12). Jest to w przeciwieństwie do skalowania, gdzie liczba wyświetleń strony na sekundę zostałaby zwiększona poprzez dodanie kolejnej instancji serwera aplikacji. Żadne oprogramowanie nie jest naprawdę nieskończenie skalowalne. W pewnym momencie zaczniesz otrzymywać malejące zwroty. Na przykład Apache historycznie nie skalował się daleko poza garstką fizycznych rdzeni. Osiągnąłbyś większą całkowitą przepustowość, uruchamiając cztery instancje Apache na jednym 32-rdzeniowym serwerze CPU, niż gdybyś uruchomił jedną instancję Apache na tym samym serwerze. Niektóre programy muszą być skalowane ze względu na ograniczenia w jego architekturze. Często stare systemy backendowe nie skalują się zbyt dobrze, ponieważ zostały zaprojektowane z myślą o czasach, w których procesory miały tylko jeden rdzeń. Procesory wielordzeniowe są dość nowoczesnym wynalazkiem

tudium przypadku: Problem C10K

W 2003 r. Programista Dan Kegel opublikował stronę internetową stwierdzającą, że nowoczesne serwery internetowe powinny być w stanie obsłużyć 10 000 równoczesnych klientów. Nazywał on problem C10K, gdzie C oznacza połączenia, a 10K oznacza 10 000. Jego sprytną obserwacją było to, że sprzęt poczynił ogromne postępy w ciągu ostatnich kilku lat, ale zdolność serwera WWW do skalowania i używania tego sprzętu nie uległa zmianie. W tym czasie wiele serwerów było w stanie obsłużyć tylko 1000. Dan i dalsze prace wykazały, że 10 000 jednoczesnych połączeń może zostać utrzymanych dzięki zmianom w systemie operacyjnym i oprogramowanie serwera WWW. Dziesięć lat później, w 2013 r., Robert Graham pokazał, że nowoczesne serwery mogą obsługiwać 10 milionów jednoczesnych klientów.2 Ponownie, rozwiązaniem było oprogramowanie. Te dwie inicjatywy pokazały, że wąskim gardłem w skalowalności pionowej było głównie oprogramowanie. Sprzęt ma znaczenie, ale nie tak bardzo, jak dobre oprogramowanie.

Skalowanie

Skalowanie, znane również jako skalowalność pozioma, zwiększa wydajność (np. Liczbę odsłon na sekundę) systemu poprzez dodanie większej liczby danych wejściowych (np. Więcej serwerów aplikacji działających na większej ilości sprzętu). Przykładem skalowania zasobu jest dodanie serwera, w przeciwieństwie do zwiększenia pamięci lub mocy obliczeniowej istniejącego. Jeśli marginalne wejście (np. Dodatkowy serwer) jest równe marginalne wyjście (np. Liczba odsłon na sekundę), masz doskonale skalowalny system. Jeśli dodatkowe jednostki wejściowe (np. Fizyczne serwery) są równe coraz mniej jednostkom wyjściowym (np. Liczba wyświetleń strony na sekundę), system nie jest skalowalny. Rysunek dotyczy w równym stopniu zarówno poszczególnych jednostek, jak i całego systemu

Zasady skalowania

Podczas gdy skalowanie w górę jest absolutną koniecznością, skalowanie w górę jest również ważne. Im bardziej się skalujesz, tym mniej musisz skalować i tym niższe koszty krańcowe. Możesz uniknąć całej klasy problemów, lepiej projektując system w celu zwiększenia przepustowości każdego serwera. Nowoczesne serwery towarowe x86 mogą obsługiwać 10 milionów jednoczesnych połączeń HTTP dzięki architekturom opartym na pętli zdarzeń bez blokady, preferowanym przez nowsze serwery WWW / usługi równoważenia obciążenia, takie jak Nginx i Node.js. Apache jest teraz w stanie obsłużyć ponad kilka tysięcy równoczesnych żądań HTTP na jednym serwerze towarowym, ale jest to w dużej mierze spowodowane ulepszeniami sprzętowymi i poprawkami. Ogromny wzrost przepustowości tych nowszych serwerów sieciowych wynika wyłącznie z ich lepszej architektury. Oprogramowanie do skalowania sprowadza się do dwóch zasad. Pierwszym jest umożliwienie każdemu systemowi wykonania pracy, którą musi wykonać, przy możliwie jak najmniejszej liczbie przeszkód. Połączenia ze zdalnymi systemami są prawidłowe, pod warunkiem że nie blokują. Zablokowane wątki zabijają zarówno przepustowość, jak i wydajność. Unikanie wątków tam, gdzie to możliwe, eliminuje problem blokowania wątków. Drugą i jeszcze silniejszą barierą skalowalności jest ludzka strona technologii. Zatrudnianie odpowiednich ludzi przyniesie dywidendy na nadchodzące dziesięciolecia i może mieć wpływ na sukces lub porażkę Twojej firmy. Poszczególne osoby są skalowalne w pionie tylko do pewnego momentu. Skalowanie i powiększanie personelu jest wymagane do sukcesu. W poniższej sekcji omówiono każdą z następujących zasad:

•  Konwertuj synchroniczny na asynchroniczny
•  Zmniejszyć blokowanie
•  Uproszczać
•  Usuń stan
•  Inteligentne buforowanie
•  Zatrudnij odpowiednich ludzi
•  Planuj, planuj, planuj
•  Rozmiar odpowiednio
•  Użyj odpowiedniej technologii

Konwertuj synchroniczny na asynchroniczny

W przetwarzaniu synchronicznym wykonanie jednego zadania (np. Serwera aplikacji generującego odpowiedź HTTP) zależy od wykonania jednego lub większej liczby innych zadań (np. Zapytania do bazy danych). Typowym przykładem tego jest e-mail potwierdzający wysyłany synchronicznie po złożeniu zamówienia. Zakładając, że transakcje są właściwie wykorzystywane, pomyślne złożenie zamówienia jest całkowicie zależne od czegoś tak niepoważnego, jak dostępność i wydajność serwera SMTP. Przy prawidłowym oddzieleniu tych dwóch systemów zamówienie zostanie złożone normalnie, ale zamiast synchronicznego wysłania wiadomości zostanie zrzucone w kolejce i dostarczone asynchronicznie na dostępny serwer SMTP. Synchroniczne wywołania dowolnego systemu umieszczają go na ścieżce krytycznej, co powoduje, że skalowalność całego systemu zależy od najmniej skalowalnego zasobu. Na przykład system zarządzania zamówieniami może mieć problemy z obsługą ruchu z najbardziej obciążonych dni w roku. Jeśli łączysz się synchronicznie z systemem zarządzania zamówieniami, skalowalność całej platformy będzie zależała od skalowalności tego jednego systemu. W świecie wielokanałowym, w którym wszystkie kanały używają tych samych systemów zaplecza, niektóre z Twoich systemów nie będą mogły skalować. Każda czynność, która nie jest bezpośrednio związana z generowaniem przychodów lub nie wymaga natychmiastowej reakcji, powinna być wykonywana asynchronicznie, aby nie zakłócała generowania przychodów.

Studium przypadku: Node.js

Tradycyjne serwery WWW i aplikacji działają na zasadzie wątków, w których pojedyncze żądanie HTTP wiąże pojedynczy wątek, dopóki odpowiedź nie zostanie w pełni wygenerowana. Wszystko odbywa się synchronicznie. W przypadku tradycyjnej kombinacji serwera WWW i serwera aplikacji oznacza to, że każdy wątek serwera WWW czeka na odpowiedź serwera aplikacji, a wątek każdego serwera aplikacji czeka na odpowiedzi z różnych baz danych, siatek pamięci podręcznej, systemów innych firm i tak dalej. Wątki spędzają dużo czasu zablokowane, czekając na coś. Wątki są drogie, ponieważ każdy wymaga dedykowanej pamięci. Model ten został stworzony dla świata, w którym klienci pasywnie pobierali statyczne strony internetowe. Node.js to framework oparty na JavaScript, który służy zarówno jako serwer WWW, jak i środowisko programistyczne po stronie klienta. Obydwie pracują razem, aby zaoferować pełną dwukierunkową komunikację między serwerem WWW a klientem, a także asynchroniczny model wykonania, który eliminuje wątki. Nieużywając wątków, każda instancja Node.js może obsługiwać milion lub więcej równoczesnych połączeń. Sposób działania polega na tym, że przychodzą żądania HTTP, a ponieważ systemy zaplecza wykonują swoje zadania (np. Wyszukiwanie zapasów, żądanie załadowania szczegółów produktu za pośrednictwem żądania HTTP z odpowiedzią REST), odpowiedź jest stopniowo przekazywana do klienta . Dzięki temu przeglądarka internetowa może zacząć renderować odpowiedź równolegle podczas jej generowania. Na dowolnej platformie, a szczególnie w chmurze, bazy danych mogą służyć jako wąskie gardło. Bazy danych są często używane w handlu elektronicznym, ponieważ aplikacje są tak rozbudowane. Poza chmurą bazy danych są wdrażane na dedykowanym sprzęcie wspieranym przez wysokiej jakości pamięć masową z szybkim sprzętem sieciowym łączącym komponenty systemu. W publicznej chmurze Infrastruktura jako usługa masz niewielką kontrolę nad swoim środowiskiem. Nie możesz optymalnie dostroić dużo poza systemem operacyjnym i masz do czynienia ze sprzętem i sieciami, które są wspólne dla wielu najemców. Chociaż dostawcy usług chmurowych podejmują wielkie środki ostrożności w celu odizolowania ruchu, nigdy nie jest idealny. Aby nie dopuścić do tego, aby bazy danych były wąskim gardłem, możesz użyć pamięci podręcznej zapisu dla wszystkich lub podzbioru zapisów. Oznacza to, że aplikacja korzysta z pamięci podręcznej jako systemu zapisu, a pamięć podręczna odczytuje i zapisuje asynchronicznie bazę danych

Może to pozwolić na skalowanie i skalowanie systemu przy jednoczesnym zwiększeniu wydajności. Dla klientów zapis odbywa się natychmiast w lokalnej pamięci podręcznej, co umożliwia natychmiastowe wygenerowanie odpowiedzi. Chociaż może to nie być odpowiednie dla czegoś ważnego, takiego jak inwentaryzacja, doskonale nadaje się do takich rzeczy, jak recenzje produktów, aktualizacje profilu klienta, aktualizacje koszyka - wszystko, gdzie system źródłowy jest nieaktualny o kilka milisekund. Najbardziej skalowalne platformy całkowicie oddzieliły swoje nakładki od zaplecza. Wszystkie połączenia z frontendu do backendu są asynchroniczne, z wprowadzeniem kolejkowania, aby pozwolić backendowi znikać na pewien czas. Z opuszczonym backendem interfejs nadal przyjmuje przychody.

Zmniejszyć blokowanie

Z definicji praca (np. Żądania HTTP) na platformie e-commerce jest wykonywana jednocześnie w wielu wątkach. Mogą to być wątki w zarządzanym środowisku wykonawczym, wątki w bazie danych lub wątki w siatce pamięci podręcznej. Serwery sieciowe i usługi równoważenia obciążenia zwykle nie blokują się bardzo i coraz częściej odchodzą od wątków, więc nie ma problemów. Istnieją obiekty, które wymagają aktualizacji przez wiele wątków jednocześnie. Świetnym przykładem tego jest sytuacja, gdy miliony ludzi próbują kupić najnowszy smartfon, gdy tylko będzie dostępny w sprzedaży. Inwentaryzacja na całej platformie zazwyczaj sprowadza się do aktualizacji jednego rekordu w scentralizowanej siatce pamięci podręcznej, w wierszu bazy danych i tak dalej. Bez odpowiedniej współbieżności wątki bazy danych i serwera aplikacji mogą czekać zbyt długo na aktualizację, powodując kaskadowe blokowanie na całej platformie. Jest to częsta przyczyna awarii. Blokowanie może również wystąpić w ramach jednego procesu, co ogranicza jego zdolność do zwiększania skali. Twoja aplikacja może mieć kilka wspólnych gorących obiektów, które są zablokowane przez każdy wątek obsługi żądania. Kiedy masz zbyt wiele wątków, każdy wątek musi czekać dłużej, aby się zablokować, a ostatecznie staje się zbyt długi i nie możesz już powiększać skali. Blokowanie może być szybkim sposobem na ograniczenie możliwości skalowania w górę i w górę. Dlatego należy tego unikać za wszelką cenę. Możesz w dużej mierze wyeliminować blokowanie, stosując zdrowy rozsądek podczas projektowania systemu. Zamiast cały czas czytać ekwipunek, możesz ustawić flagi o niskim ekwipunku lub przydzielić partię ekwipunku do każdej instancji, jeśli dostępnych jest wiele ekwipunku. W celu aktualizacji zapasów można zamiast tego wykonywać proste inkrementacje i dekrementacje połączeń z siatką pamięci podręcznej lub podobnym systemem w pamięci, który wykorzystuje strukturę danych bez blokady. Połączenie może być tak proste:

http://www.website.com/InventoryUpdate?productId=X&value=-1&securityToken=ABC123

Możesz nawet wykonać połączenie asynchronicznie, jeśli wiesz, że masz wystarczająco dużo zapasów, aby przetrwać przez chwilę. Po prostu informując system zarządzania zapasami o zwiększaniu lub zmniejszaniu, unikniesz konieczności czytania obiektu, ustawiania jego wartości i czekania, aż baza danych go zatwierdzi dysk. To jest po prostu znacznie szybsze. Każdy język programowania ma koncepcję niezablokowanych struktur danych. Wewnętrznie te struktury danych mogą wykorzystywać bardziej wydajne nieblokujące techniki na poziomie systemu operacyjnego, takie jak porównywanie i zamiana. Korzystanie z tych struktur danych znacznie zmniejsza rywalizację wątków w ramach jednego procesu i pozwala na znacznie większe skalowanie.

Upraszczać

Twoja architektura powinna być tak prosta, jak to możliwe. Prostota rodzi skalowalność. Obejmuje to szeroki zakres tematów, w tym:

•  Usuwanie poziomów z platformy
•  Usuwanie serwerów internetowych.
•  Uproszczenie konfiguracji
•  Zmienianie adresów IP na nazwy hostów, całkowite usuwanie nazw hostów, eliminowanie singletonów i tak dalej.
•  Usuwanie niepotrzebnych opakowań / kopert
•  Przełączanie z SOAP na SOA, nieużywanie SSL / TLS, gdy nie jest to naprawdę konieczne, i tak dalej.
•  Budowanie dyskretnych interfejsów między systemami

Pozwala to lepiej oddzielić swoje systemy. Dyskretne interfejsy można zapisywać do iz magistrali usług i podobnych technologii. Uproszczenia muszą być wbudowane od samego początku. Powrót do uproszczenia starego kodu jest bardzo trudny. Zbuduj go poprawnie od samego początku, zatrudniając odpowiednich ludzi i czyniąc prostotę najwyższym celem.

Usuń stan z poszczególnych serwerów

Jak wspomniano wcześniej, stan to tymczasowy obszar przechowywania, który jest unikalny dla danego klienta i trwały dla żądań HTTP. Wózki sklepowe, status uwierzytelnienia, promocje itd. Zależą od stanu. Stan zawsze będzie stałym elementem, biorąc pod uwagę naturę handlu elektronicznego. Utrzymanie stanu w żądaniach HTTP najczęściej oznacza, że dany klient musi zostać przekierowany do tego samego centrum danych, modułu równoważenia obciążenia, serwera WWW (jeśli jest używany) i instancji serwera aplikacji. Gdy szybko dodajesz i usuwasz serwery w chmurze poprzez automatyczne skalowanie, nie zawsze możesz zagwarantować, że dany serwer będzie dostępny. Serwery w chmurze są z natury efemeryczne. Zmuszanie klienta do ponownego zalogowania się, ponieważ stan został utracony po wyrejestrowaniu serwera, jest niedopuszczalny. Serwery w chmurze są z natury efemeryczne. Nie przechowuj w nich stanu. Państwo ma poważne implikacje techniczne z kilku powodów:

•  Stan może być ciężki, zazwyczaj pod względem wykorzystania pamięci. Nic nie zabija twojej zdolności zwiększania skali, podobnie jak sesje 1 MB.
•  Utrzymanie stanu e-commerce wymaga utrwalenia go po stronie serwera i udostępnienia go każdemu serwerowi aplikacji, który o to poprosi. Ponownie, serwery mogą szybko przechodzić w górę i w dół. Jeśli anulujesz rezerwację serwera, klient nie powinien wiedzieć.
•  Państwa muszą zostać połączone. Jak omówiono wcześniej w części, klienci przeglądają anonimowo, cały czas gromadząc stan. Gdy klient się loguje, ten stan sesji musi zostać scalony ze stanem trwałym, który jest trwały w sesjach HTTP.

Aby zminimalizować szkodliwe skutki stanu, pamiętaj o następujących zasadach:

•  Stan powinien być jak najlżejszy - najwyżej kilka kilobajtów. Wszystko, co nieistotne, powinno zostać pominięte.
•  Stan należy sprowadzić do jak najmniejszej liczby systemów. Chociaż serwer aplikacji ma sens, aby dbać o jego stan, połączenie aplikacji z niezależną usługą zarządzania zapasami powinno być bezstanowe. Przejrzyj każde zdalne połączenie i potwierdź, czy stan jest naprawdę wymagany.
•  Należy unikać państwa, chyba że jest to konieczne. Na przykład roboty wyszukiwarek indeksujące Twoją witrynę nie mają pojęcia o sesjach i utworzą zupełnie nową sesję HTTP przy każdym wyświetleniu strony. Albo zapobiegaj tworzeniu sesji HTTP, albo rozważ unieważnienie sesji HTTP utworzonych przez wyszukiwarkę przez boty (które można zidentyfikować za pomocą ciągu agenta użytkownika) po każdym żądaniu HTTP. Podobnie anonimowi klienci wyświetlający stronę główną prawdopodobnie nie potrzebują sesji.
Najważniejsze pytanie dotyczy tego, gdzie należy przechowywać stan. Tradycyjnie serwery aplikacji były odpowiedzialne za zarządzanie cyklem życia sesji HTTP. Aplikacje wdrożone na serwerach aplikacji dodają dane do sesji. Następnie możesz zreplikować sesję HTTP lub nie. Replikacja może odbywać się w całości w pamięci, poprzez bazę danych, siatkę pamięci podręcznej lub przez prawie każdy inny sposób przenoszenia danych między procesami. Aby zmniejszyć obciążenie związane z utrzymywaniem stanu po stronie serwera, naturalne byłoby przekazanie go do klienta (np. Przeglądarki internetowej, aplikacji mobilnej), jak to jest często w przypadku wielu innych obciążeń. Często jest to osiągane w przeglądarkach internetowych za pomocą plików cookie lub HTML 5. Ale w świecie wielokanałowym to nie działa dobrze, ponieważ używasz tak wielu różnych kanałów, z których każdy wymaga reprezentacji stanu przez klienta i wersję. Ponieważ HTTP jest z definicji bezstanowy, każdy klient musi wprowadzić stan. Na przykład przeglądarki internetowe używają plików cookie, podczas gdy aplikacje na Androida używają interfejsu API opartego na Javie z natywnym mechanizmem trwałości. Niektórzy klienci nawet nie obsługują możliwości utrwalania danych między żądaniami HTTP. Ze względu na różnorodność klientów i ich ciągle zmieniające się interfejsy API najlepiej jest pozwolić serwerowi aplikacji kontynuować zarządzanie stanem. Nie zakładaj, że klienci wspierają coś tak podstawowego, jak ciasteczka. Aplikacje i serwery aplikacji powinny być skonfigurowane tak, aby utrzymywały stan w systemie rozproszonym, takim jak baza danych NoSQL lub siatka pamięci podręcznej. Następnie możesz obsłużyć żądanie HTTP z dowolnego serwera z dostępem do bazy danych NoSQL lub siatki pamięci podręcznej. Buforuj jak najwięcej, jak najbliżej klienta. Buforowanie jest wyjątkowo ważne dla e-commerce, ponieważ klienci wymagają absolutnie najlepszej dostępnej wydajności. Jednocześnie buforowanie może zaoszczędzić ogromne zasoby komputerowe, umożliwiając skalowanie poszczególnych serwerów znacznie dalej inaczej byłoby możliwe. W ostatnim dziesięcioleciu wartością oferowaną przez wartą wiele miliardów dolarów branżę Content Delivery Network (CDN) była niemal wyłącznie ich zdolność do buforowania treści. Zasada buforowania polega na tym, że najlepiej buforować tak dużo, jak to możliwe, jak najbliżej klienta końcowego. Im bliżej pamięci podręcznej, tym mniej każdy system pośredniczący między klientem a systemem źródłowym faktycznie generującym treść musi działać.

Jeśli masz odpowiednią architekturę, wąskim gardłem systemu powinny być procesory z serwerem aplikacji. Wcześniejsze wąskie gardła stanowiły pamięć, pamięć masowa, sieci i inne warstwy, ale obecnie są to procesory z serwerem aplikacji. Wykonywanie kodu w celu generowania stron pochłania większość procesora. Większość stron składa się z fragmentów. Chociaż cała strona może mieć zbyt dużo treści, aby można ją było buforować w warstwie pośredniej, same fragmenty strony są dynamiczne. Na przykład ten cały fragment pokazany tu, prawdopodobnie nie ulegnie zmianie. Zamiast ciągłego wykonywania kodu w celu wygenerowania fragmentu strony, o którym wiesz, że nigdy się nie zmieni, możesz zamiast tego buforować wykonanie tego fragmentu, przekazując zmienne. Większość frameworków internetowych ma możliwość buforowania fragmentów, w tym parametrów wejściowych będących kluczami pamięci podręcznej. Aby buforować fragment, weźmiesz odpowiednik:

< jsp: include page = "/ menu_bar.jsp" / >

i przekonwertować na:

< jsp: include page = "/ menu_bar.jsp" >
< jsp: param name = "anonymous" value = "false" / >
< jsp: param name = "user_segment" value = "bay_area_male_engineer" / >
< jsp: param name = "locale" value = "us_EN" / >
< / jsp: include >

Dzięki parametrom anonimowym, user_segment i locale tworzącym klucz, możesz po prostu tworzyć kopie każdej kombinacji i buforować HTML. Łatwiej jest dołączyć wstępnie buforowany blok HTML niż wykonać tysiące wierszy kodu, które wchodzą w generowanie HTML ze źródła. Fragmenty należy buforować w miarę możliwości. Buforowanie jest jedną z najbardziej podstawowych zasad w informatyce i powinno być stosowane w sposób swobodny. Używaj odpowiedniej technologii Technologia jest niezwykle modną branżą, w której decyzje o wyborze technologii często kierują się modą, a nie pragmatyzmem. Ludzie mylą używanie nowej, niesprawdzonej technologii z innowacją, gdy są one prawie całkowicie niezwiązane. Innowacje powinny pochodzić z tego, jak wykorzystujesz technologie do osiągania celów biznesowych, a nie same technologie. Chociaż nowa technologia ma swoje miejsce, zawsze należy równoważyć marginalne korzyści, jakie zapewnia nowa technologia, z następującymi cechami bardziej ugruntowanych opcji:

•  Dojrzałość
•  Dostępność umiejętności na rynku
•  Wsparcie
•  Trwający serwis
•  Jak dobrze można to monitorować

Na przykład użycie nowego języka programowania może pozwolić Ci napisać 10% mniej kodu, ale jeśli nie możesz znaleźć IDE lub programistów, czy 10% naprawdę jest tego warte? Prawdopodobnie nie. Jednak takie decyzje są podejmowane cały czas, często z powodu wymówki "nie skaluje się". Ale skalowalność to znacznie więcej niż sposób korzystania z technologii niż sama technologia. Zasadniczo najlepiej jest zlecać na zewnątrz lub stosować ugruntowaną technologię dla dowolnej części systemu, której nie robisz szybciej / lepiej / taniej niż konkurenci. Właśnie z tej zasady e-commerce należy wdrażać w chmurze. Wprowadzaj innowacje we wdrażaniu i / lub rozwoju aplikacji e-commerce. Twórz piękne i funkcjonalne interfejsy użytkownika. Połącz się z fizycznymi sklepami, zapewniając takie funkcje, jak w czasie rzeczywistym, zapasy na poziomie sklepu i ceny. Obsługuje szeroką gamę klientów. Spraw, by był szybki i wysoce dostępny. Pozostaw rozwój elementów składowych (np. Sprzętu, oprogramowania, usług) dostawcom technologii lub społeczności open source. Upewnij się, że masz proces oceny wybranej technologii. Osoby wybierające technologię mogą nie mieć widoku całkowitego kosztu korzystania z danej technologii. Poświęć czas na dostarczanie swoich kluczowych kompetencji, a nie na budowanie utowarowanych komponentów.

Zasady nietechniczne

Zatrudnij odpowiednich ludzi Ogólnie rzecz biorąc, potrzebujesz architektów i programistów, aby zapewnić platformę wysokiej jakości. Oczywiście zaangażowanych jest wiele innych ról pomocniczych, ale potrzebujesz ludzi do projektowania (architektów) i ludzi do implementacji (programistów). Architekci są odpowiedzialni za projektowanie całego systemu, od tego, jak i gdzie kod jest wdrażany, aż do projektowania na poziomie metody. Architektura zmieniła się w ciągu ostatnich dwóch dekad, od projektowania systemów od zera po wykorzystanie elementów konstrukcyjnych. Obecnie elementami składowymi są usługi w chmurze (Software-as-a-Service, Platform-as-a-Service, Infrastructure-as-a-Service), platformy programistyczne i produkty takie jak siatki pamięci podręcznej. Bardzo niewiele z tych elementów składowych istniało jeszcze dziesięć lat temu. Musiałeś zbudować wszystko, co chciałeś ręcznie. Architekci mają teraz o wiele więcej dostępnych opcji - co jest dobre, jeśli wiesz, co robisz, ale złe, jeśli nie. Praca zmieniła się bardziej z tego, jak na co. Jest to fundamentalna zmiana, która wymaga zatrudnienia kilku bardzo wykwalifikowanych architektów, w przeciwieństwie do dużej liczby przeciętnych lub poniżej przeciętnych architektów. Po prostu nie potrzebujesz dzisiaj tak wielu ludzi. Cały ekosystem, w którym pracują programiści, znacznie dojrzał w ciągu ostatniej dekady. Języki programowania, ramy programistyczne, narzędzia i środowiska wykonawcze pozwalają programistom pisać mniej kodu o wyższej jakości w krótszym czasie niż kiedykolwiek wcześniej. Jeden dobry programista ma teraz wydajność 10 lub więcej przeciętnych programistów. Dzięki nowoczesnym narzędziom dobry programista może być jeszcze bardziej wydajny. Współcześni programiści nie piszą tyle kodu niskiego poziomu. Te pytania do wywiadu "odwróć połączoną listę na białej tablicy" są w najlepszym wypadku bezużyteczne, ponieważ dobry programista powinien po prostu wybrać metodę sortowania. Większość programistów dzisiaj powinna pisać kod kleju, co bardziej sprowadza się do wykorzystania frameworków programistycznych i wykorzystania gotowych bibliotek niż pisanie dużej ilości kodu od zera. Napisany kod musi zostać skomentowany, przetestowany jednostkowo, poddany kontroli jakości, przetestowany pod kątem wydajności i utrzymany. Wszystko to kosztuje czas i pieniądze. Dobrzy programiści nie powinni pisać dużo kodu, a sam kod powinien być prosty i jasno udokumentowany. Nie trzeba mieć stopnia informatyki, aby zrozumieć, co robi większość kodu. Dobrzy programiści muszą także mieć silną świadomość tego, gdzie i jak wykonywany jest ich kod. To nie tylko praca architekta. Chociaż często wymagane są podstawowe umiejętności informatyczne, dla architektów i programistów ważniejsza jest umiejętność komunikowania się z interesariuszami, współpracy z kolegami, popierania stanowisk, samodzielnego uzgadniania stanowisk i na ogół wykorzystywania umiejętności miękkich, a nie twardych, aby osiągnąć cele. Wracając do problemu "odwróć powiązaną listę", dobry programista powinien być w stanie skorzystać z IDE, aby znaleźć metodę do wywołania, przeprowadzić szybkie wyszukiwanie w Internecie, aby znaleźć metodę, lub zapytać dewelopera siedzącego obok niego, co metoda jest. Zły programista wdroży algorytm ręcznie, a nie przy użyciu dostępnych narzędzi do znalezienia metody. Podczas gdy umiejętności miękkie są ważnym warunkiem sukcesu, entuzjazm, kompetencje i wytrwałość są trzema cechami najlepszych architektów i programistów. Entuzjazm i wytrwałość są nieodłącznymi cechami, których nie można nauczyć, a kompetencje pochodzą z doświadczenia. Najlepiej jest budować stosunkowo małe zespoły wysoko wykwalifikowanych programistów. Kilku dobrych programistów. Colocated może wykonać ogromną pracę. Wiele najlepszych startupów zbudowało garstka ludzi. Amazon słynie ze "zespołów składających się z dwóch pizz", co oznacza, że każdy zespół powinien być na tyle mały, aby mógł go karmić dwie pizze. Świetnym sposobem na zorganizowanie projektu jest podzielenie projektu na małe zespoły, z których każdy koncentruje się na dostarczaniu usługi z przejrzystym interfejsem. Na przykład możesz wyznaczyć architekta i garść programistów, aby zbudowali system zarządzania zapasami. Zdefiniuj interfejsy i pozwól zespołowi odejść, aby go zbudować, jednocześnie kodując resztę platformy, aby korzystać z tych interfejsów. Rozbicie platformy nie tylko ma zalety techniczne, ale łatwiej jest przypisać odpowiedzialność, a ludzie lubią coś posiadać. Kiedy wszyscy są właścicielami, nikt tak naprawdę nie jest właścicielem niczego. Przy zatrudnianiu chodzi przede wszystkim o jakość, a nie o ilość. Przy zatrudnianiu chodzi przede wszystkim o jakość, a nie o ilość. Zatrudniaj najlepszych, organizuj je w małe zespoły, jasno określaj odpowiedzialność i pracuj nad usunięciem przeszkód dla ludzi wykonujących swoją pracę.

Współpraca z liniami biznesowymi

Zbyt często ważne decyzje biznesowe są podejmowane przez dział IT w izolacji, w oparciu o nieprawidłowe lub nieaktualne założenia. Komunikacja musi być częsta, dwukierunkowa i bez pośredników. Może przyjmować formę osobistych spotkań, wiadomości e-mail, wiadomości błyskawicznych, a nawet wiadomości tekstowych. Każde medium jest w porządku. Budowanie platformy, która nie zaspokaja potrzeb biznesowych, to ogromna strata czasu i energii. Jest to wspólny wysiłek. Umowy dotyczące poziomu usług (SLA) muszą być zdefiniowane dla każdego aspektu systemu. Obejmuje to czas reakcji po stronie serwera i klienta, ile system musi być dostępny, ile czasu powinno zająć odzyskanie po awarii (cel czasu odzyskiwania) oraz ile strat danych jest akceptowalnych podczas awarii (cel punktu odzyskiwania ). Wyższe umowy SLA oznaczają wyższy koszt. Na przykład, jeśli wymaga się, aby nigdy nie było żadnych przestojów platformy, musisz wdrożyć platformę w wielu strefach geograficznych przez wielu dostawców chmury. To się komplikuje i kosztuje. To zawsze jest kompromis. Liczy się to, że liczby te są wspólnie uzgadniane i istnieje odpowiedzialność, gdy cele nie zostaną osiągnięte. Każde wydarzenie, które może zwiększyć ruch na Twojej platformie (np. Błyskawiczna sprzedaż, kupony, wyjątkowe rabaty), musi zostać zaplanowane z wyprzedzeniem. Z platformami e-commerce dostępnymi na całym świecie, a także szybkością, z jaką wiadomości mogą przemieszczać się przez serwisy społecznościowe , możesz szybko zostać oblężonym ruchem. Chociaż prawidłowe użycie chmury powinno umożliwić automatyczne skalowanie systemu w celu spełnienia zwiększonego zapotrzebowania, dobrze jest, aby zdarzenia o wysokiej widoczności były skalowane z wyprzedzeniem dla dodatkowego bezpieczeństwa. Zawsze, gdy jest to możliwe, powinien istnieć solidny system zatwierdzania, aby działy IT informowały o kampaniach marketingowych. Na przykład łatwo jest przypadkowo osadzić identyfikator pliku cookie z bieżącej sesji (np. Jsessionid = 0000000fec3dff553fc1532a937765d43fc42836ed3f8894) w adresie URL linku, który wysyłasz do klientów w kampanii e-mail. Możesz skalować środowisko w dowolny sposób, ale jeśli osadzisz identyfikator sesji, wszyscy klienci trafią na ten sam serwer, jeśli masz ciągłość sesji. Aby pomóc IT zrozumieć, w jaki sposób ich decyzje wpływają na biznes, dobrze jest określić ilościowo wpływ różnych wskaźników IT na przychody. Na przykład obliczyć, ile każda minuta przestoju kosztuje utracone przychody lub ile każda dodatkowa milisekunda czasu ładowania strony negatywnie wpływa na przychody. Określenie tych kosztów pomaga spojrzeć na decyzje podejmowane przez ludzi. Zmienia cały sposób myślenia. Na przykład 20-minutowa przerwa w konserwacji nie wydaje się zbyt duża dla większości administratorów IT, ale wiedza o tym, że awaria kosztuje 300 000 USD utraconych przychodów, sprawiłaby, że ktoś pomyślałby o sposobach skrócenia długości awarii lub całkowitego jej wyeliminowania. Coraz częściej platformy e-commerce są tak ważne, że są wdrażane w wielu centrach danych, a nawet u różnych dostawców usług w chmurze, aby zapewnić jak największą dostępność platformy.