Tại sao mọi người làm API REST thay vì DBAL?


32

Trước đây, hai công ty tôi đã từng tồn tại API REST để truy vấn dữ liệu thông qua một ứng dụng web. I E. thay vì có ứng dụng web làm SQL trực tiếp, nó gọi API REST và SQL đó và trả về kết quả.

Câu hỏi của tôi là ... tại sao điều này được thực hiện?

Nếu nó được tiếp xúc với bên thứ ba, tôi có thể hiểu. Tốt hơn là để lộ API REST giới hạn so với DB đầy đủ. Nhưng trong cả hai công ty đó không phải là trường hợp.

Tôi được đề xuất rằng các API REST này giúp việc chuyển đổi giữa các DBMS dễ dàng hơn. Nhưng đó không phải là điểm của lớp trừu tượng cơ sở dữ liệu (DBAL) sao? Có thể bạn sử dụng ORM làm DBAL hoặc có thể bạn chỉ cần viết SQL thô và yêu cầu DBAL dịch các nội dung cụ thể của DB nếu thích hợp (ví dụ: dịch LIMIT cho MySQL sang TOP cho MSSQL).

Dù bằng cách nào nó dường như không cần thiết với tôi. Và tôi nghĩ nó cũng làm cho việc chẩn đoán các vấn đề trở nên khó khăn hơn. Nếu một báo cáo trên ứng dụng web đưa ra các số sai, bạn không thể bỏ truy vấn SQL - bạn phải kết xuất URL REST và sau đó đi vào dự án đóng vai trò là API REST và rút SQL từ đó. Vì vậy, nó là một lớp bổ sung làm chậm quá trình chẩn đoán.


3
Có vẻ như bạn chỉ làm việc với các ứng dụng về cơ bản là CRUD-- một số người dùng nhập dữ liệu bằng biểu mẫu và những người dùng khác đọc dữ liệu với cùng biểu mẫu hoặc với bản in báo cáo? Nếu bạn chưa bao giờ làm việc với một hệ thống có nhu cầu về một mô hình miền phức tạp và phức tạp, thì tôi có thể thấy bạn sẽ có suy nghĩ đặc biệt đó như thế nào. Nhiều ứng dụng yêu cầu lớp bổ sung thêm để làm công cụ.
RibaldEddie 30/03/2015

1
Tôi đã làm việc với API (không nhất thiết là REST) ​​rằng (trong số những thứ khác) đã thực hiện các phép tính trên các tham số được truyền cho nó. Có thể một DBMS được sử dụng trong các tính toán đó nhưng có lẽ rất nhiều logic không tồn tại trong DB. Tuy nhiên, API nội bộ tại các công ty tôi đã làm việc không làm điều này. Họ chỉ truy vấn một DBMS và đưa ra kết quả của nguyên văn truy vấn SQL. Đối với tôi, dường như các API REST thường (không phải luôn luôn - thường được viết) là hợp thời trang - không thực tế.
neubert 30/03/2015

1
Chắc chắn có những điều kỳ quặc đối với thiết kế API REST gây khó khăn cho việc thiết kế một miền phức tạp - hầu hết các nhà phát triển tôi đã gặp trong nhiều năm qua không quan tâm đến thiết kế. Họ muốn tạo ra mã càng nhanh càng tốt để ông chủ của họ sẽ yêu họ và nghĩ rằng họ là những ngôi sao nhạc rock. Khi bạn kết hợp thực tế đó với một xu hướng như REST, bạn sẽ có được API spaghetti hợp thời trang nhưng không thực tế. Không có gì để làm với chính REST.
RibaldEddie 30/03/2015

3
Bao giờ tự hỏi làm thế nào một số công ty web báo cáo rằng toàn bộ hồ sơ người dùng của họ đã bị đánh cắp bởi một tin tặc? Bao giờ tự hỏi làm thế nào các hacker đã làm điều đó? Khi bạn nghĩ rằng một máy chủ web có kết nối trực tiếp với DB, bạn sẽ nhận ra một khi máy chủ web bị tấn công, kẻ tấn công có quyền truy cập đầy đủ và không bị hạn chế để chọn bất cứ thứ gì từ DB mà anh ta thích. Dán nó phía sau một tầng giữa và kẻ tấn công sau đó chỉ có thể gọi các phương thức trên tầng giữa. Tôi sẽ không nói rằng đó là bảo mật tức thì, nhưng nó tốt hơn đáng kể.
gbjbaanb

1
@gbjbaanb: Quan điểm của tôi là máy chủ web có thể truy cập dữ liệu thông qua máy chủ còn lại, vì vậy nếu máy chủ web bị hack, kẻ tấn công cũng có thể truy cập dữ liệu qua máy chủ còn lại mà không phải hack máy chủ còn lại.
JacquesB

Câu trả lời:


28

Nếu bạn cho phép khách hàng truy cập trực tiếp vào cơ sở dữ liệu - điều họ sẽ làm, ngay cả với lớp trừu tượng hóa cơ sở dữ liệu, thì:

  • Bạn nhận được một khớp nối giữa mã của họ và mã của bạn - đặc biệt, có một khớp nối rất mạnh giữa cấu trúc cơ sở dữ liệu của bạn và mã của họ;
  • Khách hàng của bạn có thể thực hiện một số nội dung không mong muốn trên cơ sở dữ liệu của bạn - cho dù đó là cập nhật dữ liệu mà họ không nên, viết một truy vấn mất quá nhiều thời gian, bế tắc một cái gì đó vì họ không có được khóa một cách sạch sẽ ...
  • Nếu bạn đã thực hiện một số lựa chọn ít hơn tối ưu trong cấu trúc cơ sở dữ liệu của mình, thì việc chuyển ra khỏi lựa chọn đó có thể rất khó khăn, đặc biệt là nếu bạn không có cách nào tốt để khiến khách hàng của mình chuyển sang cấu trúc mới.

Đó là, tôi hoàn toàn không chạm vào phần REST - cách ly cơ sở dữ liệu của bạn đằng sau API đơn giản là một lựa chọn hợp lý hơn nếu nhóm duy trì cơ sở dữ liệu và các nhóm sử dụng nó không đồng bộ hóa, vì nó cho phép các phần này phát triển theo tốc độ của riêng họ.


24

Bạn đã đúng, không có lợi ích rõ ràng nào khi giới thiệu lớp API REST giữa ứng dụng web và cơ sở dữ liệu và nó có chi phí phức tạp và chi phí hiệu năng.

Lý do bạn nhận được câu trả lời mâu thuẫn là sự nhầm lẫn về 'khách hàng' trong kiến ​​trúc của bạn là gì.

Trong kiến ​​trúc của bạn (nếu tôi hiểu đúng), bạn có các trình duyệt tương tác với một ứng dụng web duy nhất, đến lượt nó đang tương tác với cơ sở dữ liệu. Giới thiệu lớp API REST giữa ứng dụng web và cơ sở dữ liệu không có lợi ích. Tất cả các lợi ích đã nêu (bộ nhớ đệm, cách ly cơ sở dữ liệu, v.v.) có thể đạt được với (các) lớp truy cập dữ liệu trong mã.

Nhưng có một số kiến trúc khác trong đó API REST có ý nghĩa:

  • Nếu bạn có nhiều khách hàng truy cập cơ sở dữ liệu - nghĩa là, không phải một ứng dụng web đơn lẻ mà nhiều ứng dụng web độc lập truy cập vào cùng một cơ sở dữ liệu. Có thể có lợi khi tạo giao diện REST chung để cho phép chia sẻ mô hình dữ liệu, bộ nhớ đệm, v.v ... Chắc chắn bạn có thể nhận được một số lợi ích bằng cách chia sẻ cùng các thư viện DAL, nhưng sẽ không hoạt động nếu các ứng dụng được phát triển bằng các ngôn ngữ khác nhau và trên các ngôn ngữ khác nhau nền tảng. Điều này là phổ biến trong các hệ thống doanh nghiệp.

  • Nếu bạn có nhiều ứng dụng máy tính để bàn truy cập trực tiếp vào cơ sở dữ liệu. Đây là kiến ​​trúc "hai tầng" cổ điển, đã không còn được ưa chuộng so với các ứng dụng web. Giới thiệu một lớp REST cho phép bạn tập trung logic truy cập dữ liệu và đặc biệt là nó cho phép kiểm soát an ninh chặt chẽ hơn, vì sẽ có nhiều rủi ro khi có nhiều máy khách phân tán truy cập trực tiếp vào cùng một cơ sở dữ liệu.

  • Nếu bạn có mã JavaScript trực tiếp tìm nạp dữ liệu từ máy chủ, thì bạn cần một cái gì đó giống như API REST trong mọi trường hợp.


1
Tôi thích câu trả lời của bạn nhưng tôi có thêm vài câu hỏi đi kèm. Giống như những gì về mất hiệu suất với việc giới thiệu một lớp trừu tượng khác? Ngoài ra, không làm cho nó trở thành một điểm thất bại duy nhất (nếu điều này làm mọi thứ khác đi xuống) và tắc nghẽn có thể xảy ra (mỗi ứng dụng đang chờ kết nối DB từ nhóm)?
sactiw

@satich: Tôi không hiểu chính xác những gì bạn đang hỏi, bạn có thể cụ thể hơn không? Bạn đang hỏi về một điểm thất bại có hoặc không có lớp REST?
JacquesB

Lớp bổ sung có thể có cách sử dụng nếu bạn có nhiều hơn một ứng dụng giao tiếp với nó
Ewan

@Ewan: Vâng, đây là những gì tôi nêu trong gạch đầu tiên.
JacquesB

1
@JacquesB Giả sử nhiều ứng dụng web chia sẻ cùng một DB nhưng không phải cùng một dữ liệu, tức là mỗi ứng dụng CRUD thực hiện trên một tập hợp dữ liệu riêng biệt trong DB đó, về cơ bản không có chia sẻ dữ liệu theo đúng nghĩa. Vì vậy, việc đặt các ứng dụng đằng sau một khung kiên trì Restful có ý nghĩa gì không (cũng giả sử DB cung cấp mức độ tương tranh tốt trong các truy vấn)? Hơn nữa, khung đó sẽ không phải là nút cổ chai cũng như điểm thất bại duy nhất cho rất nhiều ứng dụng web tương tác thông qua nó?
sactiw

12

Cảnh báo: bài đăng lớn, một số ý kiến, mơ hồ 'hãy làm những gì tốt nhất cho bạn'

Nói chung, điều này được thực hiện như một phương tiện để thực hiện 'kiến trúc lục giác' xung quanh cơ sở dữ liệu của bạn. Bạn có thể có các ứng dụng web, ứng dụng di động, ứng dụng máy tính để bàn, nhà nhập khẩu số lượng lớn và xử lý nền đều tiêu thụ cơ sở dữ liệu của bạn một cách thống nhất. Chắc chắn bạn có thể hoàn thành điều tương tự ở một mức độ nào đó bằng cách viết một thư viện phong phú để truy cập cơ sở dữ liệu của bạn và có tất cả các quy trình của bạn sử dụng thư viện đó. Và thực sự, nếu bạn đang ở trong một cửa hàng nhỏ với một hệ thống rất đơn giản, đó thực sự có lẽ là một con đường tốt hơn để đi; Đó là một cách tiếp cận đơn giản hơn và nếu bạn không cần các khả năng tiên tiến của một hệ thống phức tạp hơn, tại sao phải trả tiền cho sự phức tạp? Tuy nhiên, nếu bạn đang làm việc với một bộ hệ thống lớn, tinh vi, tất cả đều cần tương tác với cơ sở dữ liệu của bạn ở quy mô, thì '

Độc lập và bảo trì nền tảng

Nếu bạn có cơ sở dữ liệu và bạn viết thư viện Python để tương tác với cơ sở dữ liệu đó và mọi người kéo vào thư viện đó để tương tác với cơ sở dữ liệu, điều đó thật tuyệt. Nhưng giả sử đột nhiên bạn cần viết một ứng dụng di động và ứng dụng di động đó bây giờ cũng cần nói chuyện với cơ sở dữ liệu. Và các kỹ sư iOS của bạn không sử dụng Python và các kỹ sư Android của bạn không sử dụng Python. Có thể các chàng trai iOS muốn sử dụng ngôn ngữ của Apple và các kỹ sư Android muốn sử dụng Java. Sau đó, bạn sẽ bị kẹt viết và duy trì thư viện truy cập dữ liệu của mình bằng 3 ngôn ngữ khác nhau. Có thể các nhà phát triển iOS và Android quyết định sử dụng một cái gì đó như Xamarin để tối đa hóa mã họ có thể chia sẻ. Hoàn hảo, ngoại trừ có lẽ bạn vẫn sẽ phải chuyển thư viện truy cập dữ liệu của mình sang .NET. Và sau đó công ty của bạn vừa mua một công ty khác, người ' Ứng dụng web là một sản phẩm khác nhau nhưng có liên quan và doanh nghiệp muốn tích hợp một số dữ liệu từ nền tảng của công ty bạn vào nền tảng của công ty con mới mua. Chỉ có một vấn đề: Công ty con là một công ty mới thành lập và quyết định viết phần lớn đơn đăng ký của họ bằng tiếng Anh. Ngoài ra, vì bất kỳ lý do gì (lý do có thể nằm ngoài tầm kiểm soát của bạn), nhóm di động đang điều khiển Xamarin đã quyết định không dành cho họ và họ muốn sử dụng các công cụ và ngôn ngữ dành riêng cho thiết bị di động mà họ sẽ phát triển. Nhưng trong khi bạn ở giai đoạn đó, nhóm của bạn đã cung cấp một phần lớn thư viện truy cập dữ liệu của bạn bằng .NET và một nhóm khác trong công ty đã viết một số nội dung tích hợp Salesforce điên rồ và quyết định thực hiện tất cả điều đó trong .NET kể từ đó đã là một thư viện truy cập dữ liệu cho.

Vì vậy, bây giờ, do có một sự kiện rất thực tế, bạn có thư viện truy cập dữ liệu của mình được viết bằng Python, .NET, Swift, Java và Dart. Chúng cũng không đẹp như bạn muốn. Bạn không thể sử dụng ORM hiệu quả như bạn muốn, vì mỗi ngôn ngữ có các công cụ ORM khác nhau, vì vậy bạn phải viết nhiều mã hơn bạn muốn. Và bạn đã không thể dành nhiều thời gian cho mỗi lần hóa thân như bạn muốn, bởi vì có 5 người trong số họ. Và phiên bản Dart của thư viện đặc biệt nhiều lông vì bạn phải tự tạo ra các công cụ giao dịch của riêng mình cho một số thư viện vì các thư viện và hỗ trợ chỉ thực sự không có ở đó. Bạn đã cố gắng giải thích rằng vì điều này, ứng dụng Dart chỉ có chức năng chỉ đọc cho cơ sở dữ liệu của bạn, nhưng doanh nghiệp đã quyết định rằng bất kỳ tính năng nào họ đang lên kế hoạch đều đáng để nỗ lực thêm. Và hóa ra có một lỗi trong một số logic xác thực tồn tại trong tất cả các hóa thân của thư viện truy cập dữ liệu của bạn. Bây giờ bạn phải viết bài kiểm tra và mã để sửa lỗi này trong tất cả các thư viện này, nhận đánh giá mã cho các thay đổi của bạn cho tất cả các thư viện này, nhận QA trên tất cả các thư viện này và phát hành các thay đổi của bạn cho tất cả các hệ thống bằng cách sử dụng tất cả các hệ thống những thư viện này. Trong khi đó, khách hàng của bạn không hài lòng và đã đưa lên Twitter, kết hợp các kết hợp thô tục mà bạn không bao giờ có thể tưởng tượng được, có thể được nhắm mục tiêu vào sản phẩm hàng đầu của công ty bạn. Và chủ sở hữu sản phẩm quyết định không hiểu lắm về tình hình.

Xin hiểu rằng trong một số môi trường, ví dụ trên là bất cứ điều gì ngoài kế hoạch. Cũng xem xét rằng chuỗi các sự kiện này có thể diễn ra trong một vài năm. Nói chung, khi bạn đến điểm mà các kiến ​​trúc sư và doanh nhân bắt đầu nói về việc kết nối các hệ thống khác với cơ sở dữ liệu của bạn, đó là khi bạn sẽ muốn "đặt API REST trước cơ sở dữ liệu" lên lộ trình của mình. Hãy xem xét nếu sớm, khi rõ ràng cơ sở dữ liệu này sẽ bắt đầu được chia sẻ bởi một vài hệ thống, rằng một dịch vụ web / API REST đã được đặt trước nó. Sửa lỗi xác nhận của bạn sẽ nhanh hơn và dễ dàng hơn nhiều vì bạn đang thực hiện một lần thay vì 5 lần. Và phát hành bản sửa lỗi sẽ dễ dàng hơn rất nhiều để phối hợp, bởi vì bạn '

TLDR; Việc tập trung logic truy cập dữ liệu dễ dàng hơn và duy trì các máy khách HTTP rất mỏng so với việc phân phối logic truy cập dữ liệu tới từng ứng dụng cần truy cập dữ liệu. Trên thực tế, máy khách HTTP của bạn thậm chí có thể được tạo từ siêu dữ liệu. Trong các hệ thống lớn, API REST cho phép bạn duy trì ít mã hơn

Hiệu suất và khả năng mở rộng

Một số người có thể tin rằng nói chuyện trực tiếp với cơ sở dữ liệu thay vì thông qua dịch vụ web trước sẽ nhanh hơn. Nếu bạn chỉ có một ứng dụng, điều đó chắc chắn đúng. Nhưng trong các hệ thống lớn hơn, tôi không đồng ý với tình cảm. Cuối cùng, ở một mức độ quy mô nào đó, sẽ rất có lợi khi đặt một số loại bộ đệm trước cơ sở dữ liệu. Có thể bạn đang sử dụng Hibernate và muốn cài đặt lưới Infinispan làm bộ đệm L2. Nếu bạn có một cụm gồm 4 máy chủ mạnh mẽ để lưu trữ dịch vụ web của bạn tách biệt với các ứng dụng của bạn, bạn có thể đủ khả năng để có một cấu trúc liên kết nhúng với sao chép đồng bộ được bật. Nếu bạn cố gắng đặt nó trên một cụm gồm 30 máy chủ ứng dụng, thì chi phí cho việc sao chép trong thiết lập đó sẽ quá nhiều, vì vậy bạn sẽ phải chạy Infinispan ở chế độ phân tán hoặc trong một loại cấu trúc liên kết chuyên dụng nào đó và đột nhiên Hibernate phải truy cập mạng để đọc từ bộ đệm. Thêm vào đó, Infinispan chỉ hoạt động trong Java. Nếu bạn có ngôn ngữ khác, bạn sẽ cần các giải pháp bộ đệm khác. Chi phí mạng phải đi từ ứng dụng của bạn đến dịch vụ web của bạn trước khi tiếp cận cơ sở dữ liệu sẽ nhanh chóng được bù đắp bởi nhu cầu sử dụng các giải pháp bộ nhớ đệm phức tạp hơn nhiều thường đi kèm với chi phí của chính họ.

Ngoài ra, lớp HTTP của API REST của bạn cung cấp một cơ chế bộ đệm có giá trị khác. Các máy chủ của bạn cho API REST có thể đặt các tiêu đề bộ đệm vào các phản hồi của chúng và các phản hồi này có thể được lưu trong bộ đệm ở lớp mạng, có tỷ lệ đặc biệt tốt. Trong một thiết lập nhỏ, với một hoặc hai máy chủ, cách tốt nhất của bạn là chỉ sử dụng bộ nhớ cache trong ứng dụng khi nói chuyện với cơ sở dữ liệu, nhưng trong một nền tảng lớn có nhiều ứng dụng chạy trên nhiều máy chủ, bạn muốn tận dụng mạng để xử lý bộ nhớ đệm của bạn, bởi vì khi được cấu hình đúng cách, một cái gì đó như mực hoặc véc ni hoặc nginx có thể mở rộng đến mức điên rồ trên phần cứng tương đối nhỏ. Hàng trăm ngàn hoặc hàng triệu yêu cầu mỗi giây thông lượng rẻ hơn rất nhiều để thực hiện từ bộ đệm HTTP so với từ máy chủ ứng dụng hoặc cơ sở dữ liệu.

Trên hết, việc có rất nhiều máy khách chỉ vào cơ sở dữ liệu của bạn, thay vì tất cả chúng đều chỉ vào một vài máy chủ, lần lượt trỏ đến cơ sở dữ liệu, có thể khiến việc điều chỉnh cơ sở dữ liệu và kết nối khó khăn hơn rất nhiều. Nói chung, hầu hết khối lượng công việc thực tế trên một máy chủ ứng dụng là công cụ ứng dụng; chờ đợi dữ liệu quay trở lại từ cơ sở dữ liệu thường tốn thời gian, nhưng nhìn chung không tốn kém lắm về mặt tính toán. Bạn có thể cần 40 máy chủ để xử lý khối lượng công việc của ứng dụng, nhưng có lẽ bạn không cần 40 máy chủ để sắp xếp tìm nạp dữ liệu từ cơ sở dữ liệu. Nếu bạn dành nhiệm vụ đó cho một dịch vụ web, dịch vụ web có thể sẽ chạy trên các máy chủ ít hơn nhiều so với phần còn lại của ứng dụng, điều đó có nghĩa là bạn sẽ cần ít kết nối hơn tới cơ sở dữ liệu. Điều này rất quan trọng, vì cơ sở dữ liệu thường không

TLDR; Điều chỉnh, chia tỷ lệ và lưu trữ bộ nhớ truy cập dữ liệu của bạn dễ dàng hơn khi đó là điều xảy ra bên trong một dịch vụ web chuyên dụng duy nhất so với khi nó xảy ra trên nhiều ứng dụng khác nhau sử dụng các ngôn ngữ và công nghệ khác nhau

Suy nghĩ cuối cùng

Xin đừng thoát khỏi suy nghĩ này "Ôi chà, tôi nên luôn luôn sử dụng API REST để lấy dữ liệu của mình" hoặc "Tên ngốc này đang cố nói rằng chúng tôi đã làm sai vì ứng dụng web của chúng tôi nói chuyện trực tiếp với cơ sở dữ liệu, nhưng công cụ của chúng tôi hoạt động tốt! " . Điểm chính tôi đang cố gắng thực hiện là các hệ thống khác nhau và các doanh nghiệp khác nhau có các yêu cầu khác nhau; Trong rất nhiều trường hợp, việc đặt API REST trước cơ sở dữ liệu của bạn thực sự không có ý nghĩa. Đó là một kiến ​​trúc phức tạp hơn đòi hỏi phải chứng minh sự phức tạp đó. Nhưng khi sự phức tạp được bảo đảm, sẽ có rất nhiều lợi ích khi có API REST. Có thể cân nhắc các mối quan tâm khác nhau và chọn phương pháp phù hợp cho hệ thống của bạn là điều tạo nên một kỹ sư giỏi.

Ngoài ra, nếu API REST đang cản trở mọi thứ, có thể có gì đó sai hoặc thiếu trong bức tranh đó. Tôi không tin rằng có thêm lớp trừu tượng về bản chất làm cho việc gỡ lỗi khó hơn. Khi tôi làm việc với các hệ thống n-tier lớn, tôi muốn đảm bảo rằng tôi có bối cảnh ghi nhật ký phân tán. Có lẽ khi người dùng bắt đầu một yêu cầu, hãy tạo GUID cho yêu cầu đó và đăng nhập tên người dùng của người dùng đó và yêu cầu họ đã thực hiện. Sau đó, chuyển GUID đó khi ứng dụng của bạn nói chuyện với các hệ thống khác. Với tính năng tổng hợp và lập chỉ mục nhật ký thích hợp, bạn có thể truy vấn toàn bộ nền tảng của mình để người dùng báo cáo sự cố và có thể nhìn thấy tất cả các hành động của họ và họ lướt qua hệ thống để nhanh chóng xác định nơi xảy ra sự cố. Một lần nữa, nó là một kiến ​​trúc phức tạp hơn,

Nguồn: http://alistair.cockburn.us/Hexagonal+arch architecture https://github.com/brettwooldridge/HikariCP/wiki/ về -Pool- Sizing


Câu trả lời rất hay, đáng đọc. Cảm ơn đã dành thời gian để viết trả lời tuyệt vời này!
Đaminh

6

Nếu tôi hiểu chính xác DBAL là gì , thì câu trả lời là giao diện REST cho phép bạn sử dụng bất kỳ ngôn ngữ nào cho các máy khách của nó, trong khi DBAL là một thư viện cho phép bạn sử dụng một ngôn ngữ cho các máy khách của nó.

Điều này, đến lượt nó, có thể là một lợi thế cho một công ty nơi có nhiều nhóm phát triển và không phải tất cả họ đều thành thạo cùng một ngôn ngữ. Cho phép phần mềm của họ truy vấn trực tiếp DB sẽ có chức năng tương đương, nhưng như bạn nói "tốt hơn là để lộ API REST giới hạn so với DB đầy đủ".

Nói một cách trừu tượng hơn, chính bạn đang trả lời câu hỏi:

Vì vậy, nó là một lớp bổ sung làm chậm quá trình chẩn đoán

... Vì có câu cách ngôn nổi tiếng này nói rằng: "Tất cả các vấn đề trong khoa học máy tính có thể được giải quyết bằng một mức độ không xác định khác". :)


6

Chỉ vì bạn ở trong cùng một công ty không có nghĩa là bạn nên phơi bày mọi thứ cho mọi người. API REST là một cách để xác định mối quan hệ người tiêu dùng / nhà cung cấp hạn chế giữa các nhóm trong một công ty, với một hợp đồng rõ ràng. Amazon đã đi tiên phong trong hình thức tổ chức này.

API cũng cung cấp một lớp trừu tượng, cho phép bạn sử dụng một nhóm thành ngữ cụ thể - bạn không nhất thiết muốn nói chuyện với người tiêu dùng của mình theo cùng một thuật ngữ được sử dụng trong cơ sở dữ liệu của bạn. Bạn cũng không nhất thiết muốn nói chuyện với từng người tiêu dùng theo cùng một cách.


3

Bạn đang nghĩ rằng REST dành cho các truy vấn cơ sở dữ liệu và nó thì không. REST đại diện cho trạng thái của một cái gì đó tại thời điểm này. Sử dụng REST thay đổi hoặc truy xuất một đại diện nhưng đó là tất cả. Nếu trạng thái đó có sẵn bởi cơ sở dữ liệu, điều đó không thành vấn đề và không ai quan tâm bởi vì CÁCH đại diện đó không phải là một phần của REST và cũng không phải là truy vấn cơ sở dữ liệu.


Tôi không gợi ý rằng các truy vấn cơ sở dữ liệu == REST. Chắc chắn REST có khả năng nhiều hơn một lớp trừu tượng cơ sở dữ liệu, nhưng trong hai công ty trước đây tôi đã làm việc về cơ bản đó là tất cả những gì nó là - một lớp trừu tượng hóa cơ sở dữ liệu. Nó không làm gì khác ngoài việc dịch các yêu cầu HTTP sang các truy vấn DB. Và nếu đó là tất cả những gì bạn đang làm thì dường như tôi sẽ được DBAL phục vụ tốt hơn. Thật vậy, dường như đối với tôi, lý do duy nhất một số người đang sử dụng REST hiện nay là vì nó hợp thời trang - không phải vì đó là giải pháp tốt nhất hiện có cho nhiệm vụ trong tay.
neubert 30/03/2015

@neubert DBAL có hoạt động trực tiếp qua internet như REST không?
Rob

Chắc chắn rồi. Bạn có thể yêu cầu MySQL sử dụng địa chỉ IP / tên miền / cổng thuộc về một máy tính khác trên internet. Bạn cũng có thể sử dụng SSH đường hầm cũng như (tôi tin) SSL auth. Có lẽ các DBMS khác hoạt động tương tự.
neubert 30/03/2015

@neubert: trong trường hợp đó, API REST DBAL, phải không?
RemcoGerlich

2
@RemcoGerlich - chắc chắn, nhưng sử dụng API REST làm DBAL của bạn có thể thêm một lớp giữa không cần thiết và cản trở chẩn đoán các vấn đề. Ý tôi là, nếu bạn sẽ sử dụng một định nghĩa đủ rộng về DBAL thì bạn có thể coi Google SERP là của DBAL. Bạn chỉ cần phân tích cú pháp HTML để lấy dữ liệu được phân trang từ các máy chủ của Google ...
neubert
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.