Typowy stos dla aplikacji internetowej to baza danych, serwer z kodem po stronie serwera i użytkownik z przeglądarką z HTML / CSS / JavaScript.
Przed rozbudowaną wersją AJAX, MVC, w którym kontroler był kodem po stronie serwera, został zepsuty. Serwer musiał kierować żądania odpowiedzi dotyczące dynamicznych stron internetowych (tj. Szablonowych rozwiązań HTML takich jak JSP i ASP). Serwer koordynuje połączenia z bazą danych i decyduje, której dynamicznej strony użyć do odpowiedzi na żądanie strony. Wynikiem tego wszystkiego jest to, że serwer ostatecznie zawiera logikę biznesową, mimo że logika biznesowa nie jest silnie związana z ideą wyświetlania stron.
Teraz, gdy przechodzimy do „Web 2.0”, serwer obsługuje statyczne strony, które używają JavaScript do wypełnienia się i zmiany tego, co prezentują. Może być w JavaScript. JavaScript często implementuje usługę RESTful, co oznacza, że określa zapytanie do bazy danych.
Tak więc serwer jest odpowiedzialny za obsługę rzeczywistych plików i odbieranie połączeń AJAX. Odbieranie połączeń AJAX to jedynie zarządzanie sesjami i zapewnienie bezpieczeństwa. I tak naprawdę to, co użytkownik powinien widzieć, to dane, które powinny zostać określone w bazie danych.
A zatem, czy serwer powinien zostać przeniesiony do roli głupiego pośrednika, który tylko okazjonalnie wysyła wiadomość e-mail lub odpala serwis internetowy? Czy logika biznesowa może być aktywna w JavaScript (jeśli nie jest tajna) lub w procedurach przechowywanych, kiedy jest?
Czy ma sens łączenie serwerów i baz danych, czy też stosowanie rozwiązań ERP, takich jak SAP, jako serwerów?
Tutaj źle to zrozumiałeś. REST nie jest CRUD.
Zasoby udostępniane przez REST nie są rekordami bazy danych; są to w pełni zarządzane obiekty, które zachowują się zgodnie z logiką biznesową. Gdy serwer otrzyma test POST lub PUT, nie powinien tylko sprawdzać poprawności i przechowywać. Musi wykonać wszystko, co jest odpowiednie dla aplikacji.
Prosty przykład: aplikacja podobna do Twittera odbiera tweety jako wiadomości POST na danym kontenerze. Serwer następnie analizuje kontekst („kim jesteś?”, „Który to kanał?”) I treść („jakieś hashtagi?”, Indeksy tekstowe itp.) I przechowuje to wszystko w odpowiednich kolejkach. Prawdopodobnie dodaje odniesienie bezpośrednio do wszystkich obserwujących.
To dużo pracy poza zwykłym dodaniem zasobu do kontenera, wszystko jest zdefiniowane przez logikę biznesową. I należy na serwerze.
źródło
Moje obawy związane z tym podejściem mogą wynikać z niezrozumienia twojego projektu, więc możesz mnie zastrzelić.
pomyśl jednak o skalowalności, łatwości konserwacji i bezpieczeństwie produktu.
Jeśli Twój produkt gwałtownie rośnie, baza danych staje się wąskim gardłem, więc chociaż „wydajność” sugeruje umieszczenie logiki biznesowej w procedurach przechowywanych, powoduje dodatkowe obciążenie procesora na serwerze bazy danych, przyspieszając dzień, w którym serwer osiągnie maksymalną pojemność. W przeciwieństwie do serwerów sieciowych bazy danych ACID nie są łatwo skalowalne przy użyciu sprzętu równoległego. Jeśli Twój produkt nigdy nie odniesie takiego sukcesu, nie stanowi to problemu.
Myśl o utrzymaniu logiki biznesowej w javascript działającym na przeglądarkach internetowych, w których różne przeglądarki będą wymagały różnych javascriopt, wielu wersji przeglądarek itp. Dlaczego ten problem jest bardziej skomplikowany niż już jest?
Jednak, jak powiedział Javiar, stosowanie podejścia REST jako interfejsu API bazy danych dla produktu jest naprawdę nieuzasadnione. Zaletą interfejsu REST jest to, że inni ludzie wymyślą różne sposoby korzystania z interfejsu REST i sprawdzania go. Są to jednak publiczne zasoby logiki biznesowej, a nie zasoby rekordów tabeli niskiego poziomu. Myśl o udostępnianiu zapytań o dane na niskim poziomie przez interfejs HTTP brzmi jak koszmar bezpieczeństwa.
źródło
Chociaż istnieje wiele szkół myślenia na ten temat i na pewno żaden sposób nie może być powszechnie nazwany „właściwą drogą”, podczas gdy wszystkie inne są „niewłaściwe”, istnieje wiele powodów, aby izolować logikę biznesową po stronie serwera i uzyskać dostęp do tych obiektów i usług za pośrednictwem usługi RESTful.
Krótka odpowiedź jest taka, że chodzi głównie o zarządzanie ryzykiem oraz monitorowanie i poprawę wydajności.
Szczegółowo:
Najważniejszym powodem numer 1 jest bezpieczeństwo. Klientom nigdy nie należy ufać, że przesyłają na serwer cokolwiek innego niż śmieci, a utrzymując aspekty bezpieczeństwa po stronie serwera, izolujesz potencjalne ryzyko uszkodzenia systemu przez nieuczciwego użytkownika. Pamiętaj, że Javascript jest całkowicie kliencki i trywialnie zmienny, więc NIE MOŻESZ ZAUFAĆ WYDAJNOŚCI.
Powodem numer 2 jest rozdzielenie obaw. Twój programista javascript może nie być ekspertem od bezpieczeństwa, a twój guru bezpieczeństwa może nie być tak dobry w Javascript. Izolując logikę biznesową od logiki prezentacji, unikniesz przekraczania tych obaw, ponieważ javascript nie będzie miał dostępu do zasobów przekraczających jego poziomy uprawnień i otrzyma błędy, których obsługa leży w gestii Script Programmer. Podobnie facet od zabezpieczeń nie będzie debugował kodu JavaScript, aby sprawdzić, w jaki sposób utrzymywane jest bezpieczeństwo.
Powodem numer 3 jest wydajność. Logika biznesowa może potencjalnie wymagać zasobów serwera i bazy danych. Utrzymując tę logikę odizolowaną od elementów interfejsu użytkownika, możesz skalować tylko tę część aplikacji, co znacznie ułatwia eliminację wąskich gardeł. Ponadto znacznie łatwiej jest ustalić, który proces biznesowy ładuje zaplecze systemu lub bazy danych, jeśli procesy biznesowe są wykonywane na serwerze.
Następstwem tego jest to, że często kilka procesów biznesowych będzie wykorzystywać te same dane, dzięki czemu można wdrożyć buforowanie po stronie serwera, aby zmniejszyć ogólne obciążenie systemu, które może nie być możliwe / bezpieczne, aby zapewnić dostęp do kodu po stronie klienta.
Na koniec proponuję, aby w celu utrzymania standardów ACID Business Logic naprawdę musiał znajdować się na serwerze. Pamiętam, że utrzymywałem produkt rozliczeniowy działający w przeglądarce internetowej, z połączeniem bazy danych tylko z serwerem. Jeśli codzienne fakturowanie (które może zająć godzinę lub dłużej w dobry dzień!) Zostało przerwane, powiedzmy, przez zamknięcie lub awarię przeglądarki, może potrwać kilka godzin, aby uporządkować bałagan, który zrobił z bazy danych, która została w niespójnym stanie. Pamiętaj, że dotyczyło to również kart kredytowych, więc zapisy faktur również musiały zostać sprawdzone w stosunku do procesora!
Logika biznesowa po stronie serwera jest w większości trywialna w celu zapewnienia aktualizacji ACID, ponieważ istnieją ramy dla dowolnego języka do obsługi transakcji, na poziomie aplikacji lub bazy danych. Jeśli robisz to za pośrednictwem wielu aktualizacji z klienta WWW ... w pewnym momencie uzyskasz niespójny stan i prawdopodobnie wpłynie to na twoją aplikację.
Chociaż myślenie o usługach RESTful może być kuszące, to po prostu sposób na dostęp do bazy danych, nie należy wpadać w tę pułapkę, ponieważ jest to dobry przepis na katastrofę. Model obiektowy, który udostępniasz za pośrednictwem usługi RESTful, może być powiązany z bazą danych, ale naprawdę powinien zawierać w sobie logikę biznesową, a nie tylko używać go jako silnika CRUD.
źródło