Что быстрее? Использование REST API или прямой запрос к базе данных?

16

Что быстрее по производительности? Создание REST API и использование вашего веб-приложения с помощью REST API для всех взаимодействий с вашей базой данных ИЛИ непосредственное выполнение запросов к вашей базе данных (т. Е. Использование любого типичного объекта, который ваш язык использует для запроса базы данных, такого как JDBC для Java)?

То, как я вижу это с REST:

  1. Вы делаете объект в своем коде для вызова метода REST
  2. Вызовите http метод
  3. Код внутри вашего REST API запрашивает базу данных
  4. База данных возвращает некоторые данные
  5. Код API REST упаковывает данные в Json и отправляет их вашему клиенту
  6. Клиент получает ответ Json / XML
  7. Ответ карты на объект в вашем коде

С другой стороны, запрос к базе данных напрямую:

  1. Вы делаете объект со строкой запроса для запроса базы данных
  2. База данных возвращает некоторые данные
  3. Ответ карты на объект в вашем коде

Не значит ли это, что использование REST API будет медленнее? Может быть, это зависит от типа базы данных (SQL против NoSQL)?

Микро
источник
3
REST API не является протоколом доступа к базе данных, поэтому вопрос является большой ошибкой категории. REST api - это хранилище документов. МОЖЕТ использовать базу данных на стороне сервера (а может и нет). Если вам не нужен REST API, то, очевидно, не используйте его. Но тогда это касается всего. Если вам не нужна база данных, не используйте ее, запись в файловую систему будет быстрее, чем в базу данных. Если вам не нужна файловая система, не используйте ее, запись в ОЗУ происходит быстрее, чем на диск. Если вам не нужна оперативная память, не используйте ее, запись в кэш-память ЦП выполняется быстрее и т. Д. И т. Д.
Cormac Mulhall
1
«С другой стороны» требует, чтобы вы подвергли свою базу данных большому дурному миру.
Питер Б
@PieterB: Нет, «с другой стороны» предоставляет базу данных доверенному веб-приложению.
JacquesB
@JacquesB и веб-приложение работает на клиентском компьютере. Поэтому не стоит доверять, потому что это может быть модифицированная версия.
Питер Б,
@PieterB: В вопросе ничего не говорится о веб-приложении, работающем на ненадежном сервере. Это было бы очень необычной установкой.
JacquesB

Ответы:

18

Когда вы добавляете сложность, код будет работать медленнее. Внедрение службы REST, если она не требуется, замедлит выполнение, поскольку система делает больше.

Абстрагирование базы данных является хорошей практикой. Если вы беспокоитесь о скорости, вы можете изучить кэширование данных в памяти, чтобы не обрабатывать базу данных для обработки запроса.

Прежде чем оптимизировать производительность, я хотел бы рассмотреть проблему, которую вы пытаетесь решить, и архитектуру, которую вы используете, я изо всех сил пытаюсь придумать ситуацию, когда параметры базы данных будут иметь прямой доступ по сравнению с REST.

Кли
источник
+1 за упоминание о кешировании. Хотя это делает extra work. Но на самом деле это может быть быстрее за счет кеширования повторного запроса.
Яна Агун Сисванто
3
@Klee Ваш ответ не совсем правильный. »Внедрение службы REST, если она не требуется, замедлит выполнение, так как система делает больше.« Не в каждом случае вообще существует трафик к конечной точке, если, например, обратный прокси-сервер может обрабатывать результаты с привязкой.
Томас Джанк
@klee Причина, по которой я задал этот вопрос, была из этого поста SO programmers.stackexchange.com/questions/277701/… - в одном ответе рассказывается о том, как Amazon добился больших успехов, используя полностью RESTful-систему вместо прямого доступа. Просто заставил меня задуматься ...
Микро
9

Если вас беспокоит скорость, то да, служба отдыха будет работать медленнее по причинам, указанным выше. Однако скорость описываемого вами типа редко является первостепенной задачей и, если она есть, может быть решена другими способами. Преждевременная оптимизация - корень всего зла .

Подумайте, если ваша основная задача - совместимость (мобильная связь, Интернет, B2B), теперь REST очень привлекателен, поскольку не зависит от технологий.

Предположим, вы код для базы данных. Что бы вы сделали, если решите изменить свое хранилище данных? Насколько сложно будет это сделать, если вы тесно связаны с основным магазином?

Реальный ответ - это зависит , но, надеюсь, я дал вам кое-что подумать!

Romski
источник
6

Если вам трудно ответить на этот вопрос.

Правильный общий ответ должен быть: это зависит.

То, как я вижу это с REST:

  1. Вы делаете объект в своем коде для вызова метода REST
  2. Вызовите http метод
  3. Код внутри вашего REST API запрашивает базу данных
  4. База данных возвращает некоторые данные
  5. Код API REST упаковывает данные в Json и отправляет их вашему клиенту
  6. Клиент получает ответ Json / XML
  7. Ответ карты на объект в вашем коде

В твоей мысли ошибка.

И эта ошибка связана с тем, что вы не до конца понимаете REST и его принципы. REST не был изобретен, потому что некоторым ботаникам было круто (конечно, так) отправлять объекты Javascript через HTTP по проводам. Основным преимуществом использования HTTP является возможность использования кэширования . Если вы сделаете ваши результаты кешируемыми , то к БД будет меньше запросов. И никакая сортировка не вовлечена. Ответ может быть доставлен напрямую.

Поскольку ответ @Klees не совсем верен :

Когда вы добавляете сложность, код будет работать медленнее. Внедрение службы REST, если она не требуется, замедлит выполнение, поскольку система делает больше.

Когда речь идет о результатах кэширования, это не влияет на ваше приложение: доставка известных ответов на известные вопросы может осуществляться через обратные прокси-серверы.

Томас Джанк
источник
4
Если данные кэшируются на уровне службы отдыха, то они кэшируются в веб-приложении, что значительно улучшит производительность.
JacquesB
Самый быстрый способ - совсем не попасть в веб-приложение.
Томас Джанк
1
И просто, чтобы сделать это более интересным, не все «попадания» в базу данных равны, если вы можете получить доступ в памяти v. Диск.
Джефф
@ThomasJunk: Если я правильно понимаю исходный вопрос, клиент - это веб-приложение, и вопрос в том, должно ли веб-приложение подключаться к БД напрямую или вызывать через службу отдыха.
JacquesB
1
Это ничего не меняет в моем ответе. Вызов REST-сервиса включает в себя обращение к веб-серверу, который может находиться за обратным прокси-сервером, где возможные ответы могут быть кэшированы - как я уже сказал.
Томас Джанк
2

Введение дополнительного уровня обслуживания всегда сопряжено со сложностями и накладными расходами. Существует несколько конкретных типов архитектуры, в которых введение общего уровня обслуживания (например, REST API) может улучшить производительность из-за совместного кэширования, но, похоже, это не та архитектура, которая у вас есть.

Рассмотрим архитектуру, в которой у вас есть несколько веб-приложений или несколько приложений для настольных компьютеров, подключающихся напрямую к одной базе данных. Если они часто выполняют одни и те же запросы, это может повысить производительность для кэширования результатов запросов в общей службе. Особенно, если, скажем, сотни настольных приложений обращаются к одной и той же базе данных напрямую (не через веб-приложение!) И выполняют одни и те же запросы, это может стать серьезным улучшением. Однако даже в этой архитектуре основной причиной внедрения совместно используемой службы, вероятно, будет безопасность и абстракция данных, а не производительность.

Но, похоже, у вас есть одно веб-приложение, которое напрямую подключается к базе данных. В этом случае нет смысла вводить дополнительный уровень обслуживания. Кэширование, абстракция базы данных и т. Д. Могут обрабатываться на уровне доступа к данным в том же приложении.

JacquesB
источник
1

По-разному.

Очевидно, что чем больше слоев в вашем коде, тем медленнее он идет. Но ... наступает момент, когда прямая сквозная производительность не так важна, как масштабируемость. Если у вас есть 1 пользователь, который обращается к вашей базе данных на локальном ПК, он может работать быстро. Если у вас есть тысяча пользователей, обращающихся к одной и той же БД на одном ПК, скорее всего, вы увидите, что все они разочарованы. Решение состоит в том, чтобы переместить БД в другое поле, добавить слой посередине, и хотя для 1 пользователя он будет работать медленнее, когда тысячи обращаются к нему, он будет работать быстрее. (это упрощенный ответ, но верно в принципе).

Есть и другие причины скрывать вашу БД за уровнем среднего уровня, например, безопасность.

gbjbaanb
источник
-2

Я не знаю, где вы заблудились, но совершенно ясно, что, когда вы используете REST API, вы делаете дополнительный шаг, а дополнительный шаг «всегда» означает медленнее, когда требуется программирование.

Есть плюсы и минусы, но если вы можете получить доступ к базе данных напрямую из своего приложения, всегда лучше вызывать ее напрямую, а не через Web API, конечно, если вы используете Web API, вы можете легко перенести свое приложение на другую платформу.

Кирие
источник
1
»Я не знаю, где вы заблудились, но совершенно ясно, что когда вы используете REST API, вы делаете дополнительный шаг, а дополнительный шаг« всегда »означает медленнее, когда происходит программирование.« Если это означает медленнее в выполнении, это неправильно.
Томас Джанк
1
Разве не бывает ситуаций, когда доступ к базе данных является плохой идеей помимо переносимости? Иногда наличие REST API и т. Д. Может сохранить больше логики (и лучшую безопасность?) На стороне сервера, верно?
J Trana
@JTrana, который может быть «да» или «нет», действительно зависит от того, как вы действуете, в то время как введение дополнительного слоя может обеспечить дополнительный уровень безопасности, добавление дополнительного слоя также означает, что у вас больше шансов что-то испортить и открыть дыру в безопасности. Я думаю, что смысл Web API заключается в том, чтобы раскрыть ваш «API». Большие приложения, такие как Facebook, Amazon, Google, которым необходимо предоставить доступ третьим сторонам и которые имеют большую платформу, должны иметь веб-API, но для небольших приложений необходимо дважды подумать, прежде чем делать это.
Кирие
-2

ОСТАЛЬНЫЕ :

  • открыт для нескольких интерфейсов и 1 бэкэнда
  • необходимо создать свой собственный API (или использовать такой как Loopback)
  • не работает в автономном режиме

Локальная БД:

  • не открыты для «уровней», они должны иметь доступ к вашему бэкэнду для синхронизации
  • не нужно создавать API, использовать интерфейс БД
  • работает в автономном режиме

ЭТО ОЧЕНЬ ОГРОМНАЯ РАЗНИЦА, ЛЮДИ ЧАСТО ЗАБЫЛИ

Бенджамин Фуэнтес
источник
2
-1. Хотя не нужно «создавать» API, отсутствие DAL часто приводит к огромным трудностям в случае необходимости изменения серверной части базы данных. Также нет причин, по которым, если у вас есть БД, находящаяся в автономном режиме, сервис Rest не может быть там доступен.
Джеймс Снелл