Czy logika biznesowa naprawdę należy do serwera?


10

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?

Odpowiedzi:


14

Ze względów bezpieczeństwa logika biznesowa prawie zawsze musi działać na kontrolowanym serwerze. Jeśli przez „serwer” rozumiesz „serwer WWW”, to zgadzam się, że nie musi mieć prawie żadnej logiki biznesowej. Ale prawie zawsze potrzebujesz serwera aplikacji z logiką biznesową, niezależnie od tego, czy znajduje się on w bazie danych, czy na serwerze WWW, czy też jest osobny i wywoływany przez serwer WWW.

Istnieją aplikacje w świecie rzeczywistym, w których serwer WWW nie robi nic poza ujawnieniem interfejsu API serwera aplikacji za pośrednictwem usług WWW lub JSON.

Nawet przed wersją Web 2.0 i AJAX naprawdę nie uważano za najlepszą praktykę łączenia logiki biznesowej ze stronami ASP. Uznano, że lepiej jest mieć niezależną logikę biznesową i mieć część logiczną prezentacji serwera w ASP, JSP lub cokolwiek innego. Tak więc prawdziwą zmianą w stosunku do web 2.0 jest to, że warstwa prezentacji może być całkowicie w javascript. Osobiście wolę to.


Tak, zgadzam się, że logika biznesowa nie powinna znajdować się w ASP. O to właśnie chodzi w MVC.
Joe

Ta odpowiedź pochodzi z prawie dwóch lat temu, a teraz takie rzeczy jak SproutCore są modne. Na stronie internetowej SproutCore wyraźnie stwierdzają, że celem jest przeniesienie logiki biznesowej do przeglądarki (patrz: sproutcore.com/about ). Więc ... czy stan sieci zmienił się teraz? Czy logika biznesowa na kliencie (szczególnie przez JS w przeglądarce) jest w porządku, a może nawet lepsza?
JoeCool,

@JoeCool SproutCore istniało wtedy. I względy bezpieczeństwa związane z wprowadzeniem logiki biznesowej na kliencie nie uległy zmianie. Ale nie wszystkie aplikacje mają wiele obaw związanych z bezpieczeństwem. Ponadto „cała wściekłość” wydaje się dość zawyżona dla SproutCore. Ale wykonalność robienia więcej na kliencie stale rośnie - z wyjątkiem urządzeń mobilnych, które zyskiwały na znaczeniu i pozostają trudne pod względem wydajności dla wielu aplikacji.
psr

@psr Zgadza się - ale wydawało się, że po prostu całkowicie odciąłeś się, używając logiki biznesowej w kliencie, podczas gdy w rzeczywistości co najmniej kilka popularnych technologii zmierza w tym kierunku.
JoeCool,

6

JavaScript często implementuje usługę RESTful, co oznacza, że ​​określa zapytanie do bazy danych.

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.


2

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.


+1 za przekupienie problemu ze zgodnością przeglądarki. Ponadto pisanie kodu biznesowego w JavaScript wymaga dodatkowych umiejętności i nie pozwala na stosowanie metod w klasach biznesowych.
NoChance 18.10.11

2

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.


+1 za podniesienie wielu dobrych punktów. System rozliczeniowy użyty jako przykład ma najbardziej dziwny projekt, o jakim kiedykolwiek słyszałem.
NoChance 18.10.11

Miał też najdziwniejszą nazwę, o jakiej kiedykolwiek słyszałem, choć wciąż widnieją na nim odniesienia. Nazywał się HURLnet ISP Admin i był dość stworkiem w utrzymaniu. Mieliśmy pełną licencję na kod źródłowy i wykorzystałem ją szeroko, gdy przestali ją obsługiwać.
SplinterReality
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.