Ưu / nhược điểm giữa việc nhấn mạnh xử lý phía máy khách hoặc phía máy chủ


20

Tại sao tôi muốn viết một ứng dụng web có nhiều máy chủ xử lý?

Đối với tôi, viết chương trình phía máy khách là một lợi thế rất lớn vì nó lấy đi càng nhiều tải máy chủ càng tốt vì nó chỉ phải gửi dữ liệu đến máy khách với quá trình xử lý tối thiểu.

Tôi thấy rất ít về việc viết các ứng dụng web bên cạnh việc viết nó ở phía máy chủ và coi phía máy khách chỉ là một khung nhìn . Tại sao tôi muốn làm điều này? Ưu điểm duy nhất tôi thấy là tôi có thể viết bằng bất kỳ ngôn ngữ nào tôi muốn ( http://www.paulgraham.com/avg.html ).


Hoàn toàn tốt khi thực hiện hầu hết quá trình xử lý của bạn cho khách hàng và chỉ để lại sự cần thiết tuyệt đối cho máy chủ. Chủ yếu, xác thực dữ liệu bổ sung (tách biệt với xác thực phía máy khách) và bảo mật nên được triển khai phía máy chủ vì những lý do được đề cập trong các câu trả lời.
sakisk

Một điểm cần suy nghĩ là gỡ lỗi, mà theo tôi thường là thoải mái hơn trên máy chủ. Việc đăng nhập cũng vậy.
Traubenfuchs

Tôi không đồng ý rằng việc viết các ứng dụng web chỉ được mô tả khi phía máy chủ gửi chế độ xem. Nhìn vào sự gia tăng của các khung như Vue, Angular, v.v. để tạo các ứng dụng đầy đủ trên máy khách và chỉ trao đổi dữ liệu với máy chủ.
Kwebble

Câu trả lời:


28

Có hai vấn đề chính.

  1. Đầu tiên là dễ dàng - bạn thường không biết loại tài nguyên nào có sẵn ở phía máy khách. Nếu nó yêu cầu 1,5 GB để xử lý một cái gì đó, bạn có thể thực sự đẩy nó lên một trình duyệt máy khách không xác định (IE, Safari, Opera, Firefox, v.v.) trên nền tảng máy khách không xác định không? Khách hàng sẽ đánh giá cao hệ thống của mình dogging khi bạn áp đảo nó?

  2. Thứ hai là kiến ​​trúc nhiều hơn - những lớp nào bạn muốn tiếp xúc với thế giới bên ngoài? Hầu hết đều đồng ý rằng việc phơi bày lớp dữ liệu của bạn là cực kỳ rủi ro. Làm thế nào về lớp dịch vụ của bạn? Bạn có thực sự muốn cung cấp logic đó ra khỏi đó? Nếu bạn làm như vậy, bạn cũng đang phơi bày các điểm nhập cảnh vào lớp dữ liệu của bạn? Nếu bạn giữ phía máy chủ lớp dịch vụ, thì còn lại gì? Giao diện người dùng, phải không? Xem lý do 1 về các cân nhắc về số lượng đó sống trên máy chủ và bao nhiêu trên máy khách.


1
+1 để ẩn các lớp. SQL SQL xuất hiện trong tâm trí ...
jmq

7
Tôi không nghĩ rằng việc tiêm SQL có liên quan gì đến việc chuyển phần lớn logic của bạn sang phía máy khách. Ngay cả khi bạn di chuyển xử lý dữ liệu sang phía máy khách, bạn vẫn cần một số loại dịch vụ phía máy chủ thực sự sẽ chạy các truy vấn SQL (trừ khi bạn muốn đặt tên người dùng và mật khẩu cơ sở dữ liệu của mình). Dịch vụ đó chịu trách nhiệm xác nhận và thoát dữ liệu. Không có sự khác biệt ở đó - bạn PHẢI xác nhận và thoát khỏi mọi đầu vào trên LUÔN phía máy chủ của bạn. Đơn giản là không có cách nào xung quanh nó.
Pijusn

16

Đầu tiên và quan trọng nhất là Bảo mật . Đẩy tất cả logic của bạn ra máy khách và đó là trò chơi công bằng cho tin tặc và khai thác.

Bất cứ điều gì với bất kỳ giá trị nhận thức nào sẽ không kéo dài trong 5 phút, đặc biệt là giá trị tiền tệ, và sẽ bị đánh bạc hoặc hack hoặc khai thác và phá vỡ hệ thống của bạn khá tệ. Ngay cả khi nó có ít hoặc không có giá trị tiền tệ, vẫn có một nhóm người sẽ hack nó chỉ để phá vỡ hệ thống của bạn vì họ chán.


1
"Chán" có lẽ là một lời nói quá. Nhiều tin tặc hack chỉ đơn giản là để tạo một điểm hoặc để đánh lừa nhà phát triển. Một loại "mã của bạn là xấu, và bạn sẽ cảm thấy tồi tệ". Không nói rằng hack "hết chán" không bao giờ xảy ra, nhưng tôi không nghĩ nó cực kỳ phổ biến.
chết

@Jarrod - bạn có thể giải thích về cách triển khai logic ở phía máy khách không tốt từ điểm bảo mật của bạn không?
Giải pháp đơn giản

@ Simple-Solution nếu bạn phải đặt câu hỏi này ...

7

Phía máy khách Versus Server Side

Xử lý phía máy khách phù hợp với các tiêu chuẩn REST phổ biến hơn cũng như MVC trái ngược với các cách tiếp cận dựa trên trang và SOAP. Sự xuất hiện của những xu hướng này và tập trung vào AJAX và Html-RIA, kịch bản phía máy khách đang gia tăng và phổ biến hơn; tuy nhiên, do lo ngại về bảo mật và khả năng của máy khách, kịch bản phía máy khách có một vị trí đặc biệt và không nên được sử dụng cho mọi thứ.

Cân nhắc:

Di động

Nếu một phân khúc lớn đối tượng mục tiêu của bạn sẽ là người dùng di động, việc xử lý nặng sẽ được để lại cho máy chủ.

Tính nhất quán của nhiều trình duyệt

Các tiêu chuẩn web đã đi một chặng đường dài và điều này có thể không đáng lo ngại, nhưng mọi nhà phát triển web đều biết rằng IE 6,7 và 8 và đôi khi Safari có thể hoạt động hài hước ở phía máy khách - một số chức năng nhất định có thể không chạy vì hạn chế bảo mật và những người khác vì các tiêu chuẩn không được thực hiện. Cũng cần lưu ý rằng người dùng cuối có thể định cấu hình trình duyệt để có một số hạn chế nhất định hoặc thậm chí tắt hoàn toàn xử lý phía máy khách (không có javascript!). Nếu tính nhất quán là một yêu cầu đối với 100% người dùng (và đặc biệt nếu bạn đang làm điều gì đó không chính thống) thì phía máy chủ là quan trọng nhất.

Bảo vệ

Bất kỳ thao tác dữ liệu nào bạn muốn bảo mật cần phải được thực hiện trên máy chủ. Bất kỳ dữ liệu nào được xử lý ở phía máy khách hoàn toàn mở để thao tác. Ví dụ: nếu bạn có chức năng javascript xử lý một số thông tin sau đó được đăng lại vào hệ thống - sẽ rất dễ dàng để xử lý kết quả ngay trước khi nó được đăng lại ngay cả khi bạn có bảo mật back-end gương mẫu

UI / UX

Xử lý phía máy khách được dành cho giao diện người dùng và tạo các ứng dụng internet phong phú (RIAs). Nó được sử dụng để tạo hình động, hiệu ứng, tương tác của người dùng, cũng như tải động nội dung thông qua các cuộc gọi AJAX thay vì tải lại toàn bộ trang.


6

Chủ yếu nó sẽ là một bản sao của nỗ lực. Nhiều khả năng bất kỳ dữ liệu nào từ máy khách sẽ được kiểm tra và xử lý lại ở cấp máy chủ.

Máy chủ không thể cho rằng máy khách giàu / mạnh của bạn đã gửi dữ liệu, do đó, với bất kỳ dữ liệu nào được gửi, máy chủ phải xác thực dữ liệu và xử lý. Vì vậy, nó có ý nghĩa để đặt nó ở đó.

Tuy nhiên, tôi tin rằng một số logic có thể được thực hiện ở cấp độ máy khách để có trải nghiệm UI tốt hơn.

Bạn đã đúng, tại sao gửi dữ liệu đến máy chủ nếu không đầy đủ hoặc không chính xác. Thật dễ dàng để kiểm tra các trường bắt buộc hoặc cho điện thoại hoặc địa chỉ email được định dạng chính xác. Tôi không bao giờ thích gửi biểu mẫu và sau đó đợi 5 giây để nói với tôi rằng tôi đã quên nhập trường. Kiểu xử lý đó, chắc chắn, thực hiện nó trên máy khách và đảm bảo rằng nó là chính xác và sử dụng logic phía máy khách để đáp ứng nhanh cho người dùng. Như bạn đã chỉ ra, một tác dụng phụ của phần thưởng là máy chủ của bạn sẽ phải xử lý các yêu cầu dữ liệu ít tệ hơn. NHƯNG, máy chủ vẫn phải xác nhận hợp lệ, vì vậy bạn đang lừa đảo logic. Nhưng, người dùng của bạn sẽ hạnh phúc hơn.

Có một dòng tốt ở đây. Logic xác nhận đơn giản OK, logic kinh doanh cốt lõi không OK.


4
  1. Trước hết bạn cần hiểu kiến ​​trúc của các ứng dụng web, hầu hết nếu không phải tất cả đều là 3 tầng:

    a) Máy khách / Bản trình bày - HTML và Javascript, có thể chứa các ứng dụng ActiveX / Flash / Java / Silverlight. Tôi sẽ đi ra ngoài và thêm các ứng dụng di động gốc giao tiếp với máy chủ phụ trợ. Về cơ bản vai trò của lớp này là cung cấp giao diện cho người dùng hệ thống tương tác với nó.

    b) Logic nghiệp vụ - PHP / RoR / Java nơi dữ liệu từ máy khách được thu thập, xử lý và lưu trữ và nơi yêu cầu dữ liệu của máy khách được xử lý và gửi lại cho máy khách

    c) Kho dữ liệu cuối cùng - cung cấp lưu trữ liên tục cho thông tin hệ thống

  2. Vì vậy, nơi bạn làm xác nhận, trong tất cả các lớp. Tại sao?

    a) Phía khách hàng - đảm bảo người dùng nhập dữ liệu chính xác, các trường bắt buộc, v.v.

    b) Logic nghiệp vụ - lọc, khử trùng và xác thực dữ liệu khách hàng. Chạy các quy tắc kinh doanh phức tạp hơn để đảm bảo rằng dữ liệu được hình thành tốt để lưu trữ. Một số xác nhận được thực hiện ở giao diện người dùng được lặp lại ở đây, do thực tế là có thể có các máy khách khác nhau, ví dụ như các trình duyệt, Javascript có thể bị vô hiệu hóa. Ví dụ, nó cũng có thể chấp nhận dữ liệu từ các nguồn khác nhau thông qua API, vì vậy tất cả đều cần được xác thực.

    c) Kho dữ liệu cuối cùng - các ràng buộc đảm bảo rằng dữ liệu được hình thành tốt để lưu trữ và truy xuất sau này.

Vì vậy, nơi bạn tập trung nỗ lực xác thực của mình, sử dụng từng lớp để thực hiện xác thực phù hợp nhất với nó và để lại các quy tắc phức tạp hơn cho lớp có thể xử lý nó


3

Một phần lớn là giữ cho quá trình xử lý của bạn gần với dữ liệu của bạn. Nếu bạn có hàng trăm GB dữ liệu, rõ ràng bạn sẽ không gửi dữ liệu đó cho khách hàng. Với tốc độ truy cập dữ liệu ngày càng tăng, điều này trở thành một vấn đề ít hơn, nhưng nếu bạn đã có một trang web Dữ liệu lớn, bạn vẫn muốn lọc và thu hẹp trên máy chủ nhiều nhất có thể trước khi chuyển đi.


1

Khi bạn tạo hành vi của mình hoàn toàn về phía khách hàng (giả sử với Javascript), SEO có thể trở thành một vấn đề.

Websolutions giữ nhiều ở phía máy chủ có thể dễ dàng giữ nội dung cụ thể được đăng trên một URL cụ thể (thường là RESTful), theo cách hiển thị cho các công cụ tìm kiếm.

Điều này cũng có nghĩa là khách truy cập có thể đánh dấu một trang cụ thể. Bạn đã thử điều đó trên Facebook chưa?

Những thứ này có thể được giải quyết, nhưng nó thường được tích hợp vào các ứng dụng làm rất nhiều trên máy chủ (RAILS, WordPress, v.v.), trong khi nếu bạn đang xây dựng REACT, bạn sẽ phải nhảy qua các vòng.


0

Lý do là sự ổn định .

Về phía máy chủ, tôi có thể chọn các thành phần ổn định. Thông thường, điều này có nghĩa là tôi chọn Java và một loạt các thư viện được chọn rất cẩn thận như FreeMarker. Không cần phải nói, mọi thư viện ngoài các thư viện tiêu chuẩn của Java đều được coi là dùng một lần, vì vậy tôi truy cập các thư viện bên ngoài thông qua trình bao bọc tự tạo. Điều này có nghĩa là tôi có thể dễ dàng thay đổi từ thư viện này sang thư viện khác nếu yêu cầu phát sinh.

Bất cứ khi nào tôi cập nhật Java lên phiên bản mới, nó thường hoạt động tốt vì Java là một thành phần cực kỳ ổn định ngay cả trên các bản cập nhật phiên bản chính. Ngoài ra, mọi máy chủ tôi có đều chạy cùng một phiên bản Java. Không phải mọi khách hàng đang chạy cùng một triển khai JavaScript.

Về phía khách hàng, tôi không thể chọn các thành phần ổn định. Các nhà sản xuất trình duyệt sẽ buộc tôi chọn JavaScript, ngôn ngữ mà tôi đặc biệt không thích, nhưng ngôn ngữ mà tôi buộc phải sử dụng. (Và đừng nói với tôi về các ngôn ngữ được biên dịch thành JavaScript, chúng thật kinh khủng!) Việc triển khai JavaScript của mọi trình duyệt là khác nhau. Điều này có nghĩa là nó hoàn toàn là một địa ngục để kiểm tra sản phẩm của tôi với mọi phiên bản trình duyệt được hỗ trợ.

Giải pháp của tôi? Tôi thực hiện xử lý nhiều nhất có thể ở phía máy chủ và phía máy khách chỉ là một trình bao bọc nhẹ gửi dữ liệu đến máy chủ và nhận dữ liệu từ máy chủ dưới dạng các đoạn JSON và HTML. Tránh XML; sử dụng JSON thay thế.

Tôi không làm khuôn mẫu phía khách hàng; Tôi kết xuất nội dung trên máy chủ thành một đoạn HTML mà sau đó tôi gán .innerHTMLthuộc tính cho các thành phần giữ chỗ khác nhau ở phía máy khách. Điều này giữ cho ngăn xếp công nghệ đơn giản nhất có thể, bởi vì tôi không cần hai công cụ mẫu (một Java và một JavaScript).

Hạn chế rõ ràng là độ trễ tốc độ ánh sáng; nửa giây độ trễ không phải là hiếm giữa các châu lục.

Hãy xem xét rằng khách hàng của bạn những ngày này có thể là điện thoại thông minh. Điện thoại thông minh có thời lượng pin hạn chế, vì vậy nếu bạn đang tính toán nặng, tốt hơn hết là giảm tải cho máy chủ của bạn. Tuy nhiên, những điều đơn giản có thể tiết kiệm năng lượng hơn khi được thực hiện ở phía máy khách vì sau đó bạn có thể tránh truy cập radio. Nhưng đối số chính, tính ổn định, có thể có nghĩa là nó thực sự có thể có ý nghĩa để giảm tải ngay cả tính toán đơn giản cho máy chủ.

Là một phụ lục, như đã được quan sát trong một số câu trả lời, bạn cũng có được sự bảo mật . Nếu logic ứng dụng hoàn toàn thuộc về phía khách hàng, thì ai đó có thể đặt giá cho bất cứ thứ gì họ sẽ mua từ cửa hàng web trực tuyến của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.