速いのは何ですか?REST APIを使用するか、データベースを直接照会しますか?


16

より速いパフォーマンスとは何ですか?REST APIを作成し、WebアプリでREST APIを使用してデータベースとのすべてのやり取りを行うか、データベースに直接クエリを実行します(つまり、JDBC for Javaなどのデータベースのクエリに使用する一般的なオブジェクトを使用します)?

RESTでの見方:

  1. コード内にオブジェクトを作成して、RESTメソッドを呼び出します
  2. HTTPメソッドを呼び出す
  3. REST API内のコードがデータベースを照会します
  4. データベースがデータを返します
  5. REST APIコードはデータをJsonにまとめてクライアントに送信します
  6. クライアントはJson / XML応答を受け取ります
  7. コード内のオブジェクトへの応答をマップする

一方、データベースを直接クエリする場合:

  1. データベースをクエリするクエリ文字列でオブジェクトを作成します
  2. データベースがデータを返します
  3. コード内のオブジェクトへの応答をマップする

これは、REST APIの使用が遅くなることを意味しないのでしょうか?たぶんそれはデータベースのタイプ(SQL vs NoSQL)に依存しますか?


3
REST APIはデータベースアクセスプロトコルではないため、質問はカテゴリエラーの大きなものです。REST APIはドキュメントストアです。サーバー側でデータベースを使用する場合があります(または使用しない場合があります)。REST APIが必要ない場合は、明らかに使用しないでください。しかし、それはすべてに当てはまります。データベースが必要ない場合は、データベースを使用しないでください。ファイルシステムへの書き込みは、データベースよりも高速になります。ファイルシステムが必要ない場合は、使用しないでください。RAMへの書き込みはディスクよりも高速です。あなたはRAMがそれを使用していない必要がない場合は、CPUのキャッシュへの書き込みが速いなどなどなどです
コーマックMulhall

1
「一方で」では、データベースを大きな悪い世界にさらす必要があります。
ピーターB

@PieterB:いいえ、「一方で」はデータベースを信頼できるWebアプリに公開しています。
ジャックB

@JacquesBとWebアプリはクライアントコンピューターで実行されます。したがって、変更されたバージョンである可能性があるため、信頼すべきではありません。
ピーターB

@PieterB:質問には、信頼できないサーバーで実行されているWebアプリについては何も記載されていません。それは非常に珍しい設定です。
ジャックB

回答:


18

複雑さを追加すると、コードの実行が遅くなります。不要なRESTサービスを導入すると、システムの処理が増えるにつれて実行速度が低下します。

データベースを抽象化することをお勧めします。速度が心配な場合は、リクエストを処理するためにデータベースに触れる必要がないように、データをメモリにキャッシュすることを検討できます。

パフォーマンスを最適化する前に、解決しようとしている問題と使用しているアーキテクチャを調べますが、データベースオプションが直接アクセスとRESTのどちらになるかを考えるのに苦労しています。


キャッシングについて言及する場合は+1。やっているけどextra work。しかし実際には、繰り返しクエリをキャッシュすることで、より高速になります。
ヤナアグンシスワント

3
@Kleeあなたの答えは正しくありません。»必要がない場合にRESTサービスを導入すると、システムの処理が増えるため、実行速度が低下します。«リバースプロキシが処理結果を処理できる場合など、エンドポイントへのトラフィックがまったくない場合があります。
トーマスジャンク

@klee私はこの質問をした理由は、このSOポストからだったprogrammers.stackexchange.com/questions/277701/... - Amazonが直接アクセスするのではなく、完全にRESTfulなシステムを使用して大きな成功を収めた方法についての答えは一つの話。ちょうど私に考えさせ
マイクロ

9

速度が心配な場合は、上記の理由により、休憩サービスは遅くなります。ただし、記述するタイプの速度が主な関心事になることはめったになく、もしそうであれば、他の方法で対処できます。時期尚早の最適化はすべての悪の根源です

相互運用性(モバイル、Web、B2B)が主な関心事であるかどうかを検討してください。RESTはテクノロジーに依存しないため、非常に魅力的です。

データベース用にコーディングするとします。基になるデータストアを変更する場合はどうしますか。基礎となる店舗と密接に結びついている場合、それはどれほど難しいでしょうか?

本当の答えはそれが依存するということですが、うまくいけば私はあなたに考えるべきいくつかのことを与えました!


6

この質問に答えるのが難しいと思うなら。

正しい一般的な答えは、次のとおりです。

RESTでの見方:

  1. コード内にオブジェクトを作成して、RESTメソッドを呼び出します
  2. HTTPメソッドを呼び出す
  3. REST API内のコードがデータベースを照会します
  4. データベースがデータを返します
  5. REST APIコードはデータをJsonにまとめてクライアントに送信します
  6. クライアントはJson / XML応答を受け取ります
  7. コード内のオブジェクトへの応答をマップする

あなたの考えには間違いがあります。

そして、この間違いは、RESTとその原則を完全に理解していないという事実に起因しています。一部のオタクは、Javascript-objectをHTTP経由でネットワーク経由で送信するのがクールだとわかったため、RESTは発明されませんでした。HTTPを使用する主な利点は、キャッシングを使用できることです。結果をキャッシュ可能にすると、DBへのリクエストが少なくなります。そして、マーシャリングは含まれません。回答は直接配信できます。

Insofar @Kleesの答えはまったく正しくありません

複雑さを追加すると、コードの実行が遅くなります。不要なRESTサービスを導入すると、システムの処理が増えるにつれて実行速度が低下します。

キャッシュ可能な結果を​​処理する場合、アプリケーションに影響はありません。既知の質問に対する既知の回答の配信は、リバースプロキシを介して実行できます。


4
データがレストサービスレイヤーでキャッシュ可能であれば、Webアプリでキャッシュ可能になり、パフォーマンスが大幅に向上します。
ジャックB

最速の方法は、Webアプリにまったくアクセスしないことです。
トーマスジャンク

1
さらに興味深いことに、メモリ対ディスクでアクセスできる場合、データベースへの「ヒット」がすべて同じというわけではありません。
ジェフ

@ThomasJunk:元の質問が正しいことを理解している場合、クライアントはWebアプリであり、Webアプリがデータベースに直接接続するか、レストサービスを介して呼び出すかという質問です。
ジャックB

1
それは私の答えに何も変わりません。RESTサービスの呼び出しには、Webサーバーへの呼び出しが含まれます。Webサーバーは、既に説明したように、可能な回答をキャッシュできるリバースプロキシの背後にある可能性があります。
トーマスジャンク

2

追加のサービス層を導入すると、常に複雑さとパフォーマンスのオーバーヘッドが発生します。共有キャッシュにより、共有サービス層(REST APIなど)を導入するとパフォーマンスが向上する特定の種類のアーキテクチャがありますが、それはあなたが持っている種類のアーキテクチャではないようです。

同じデータベースに直接接続する複数のWebアプリまたは複数のデスクトップアプリがあるアーキテクチャを検討してください。同じクエリを頻繁に実行する場合、クエリ結果を共有サービスにキャッシュするとパフォーマンスが向上する場合があります。特に、何百ものデスクトップアプリが(Webアプリを介さずに)同じデータベースに直接アクセスし、同じクエリを実行すると言う場合、大きな改善があります。ただし、このアーキテクチャでも、共有サービスを導入する主な理由は、パフォーマンスではなくセキュリティとデータの抽象化でしょう。

しかし、データベースに直接接続する単一のWebアプリがあるように思えます。その場合、追加のサービスレイヤーを導入してもメリットはありません。キャッシュ、データベースの抽象化などは、同じアプリケーションのデータアクセス層で処理できます。


1

場合によります。

明らかに、コード内のレイヤーが多いほど遅くなります。しかし...直接的なエンドツーエンドのパフォーマンスはスケーラビリティほど重要ではないという点があります。ローカルPCでデータベースにアクセスしているユーザーが1人いる場合、高速で実行できます。同じPCで同じDBにアクセスしている1,000人のユーザーがいる場合、それらすべてがイライラする可能性があります。解決策は、DBを別のボックスに移動し、真ん中にレイヤーを追加することです。1人のユーザーの場合は実行速度は遅くなりますが、1000人がアクセスした場合は高速になります。(それは単純な答えですが、原則としては真実です)。

セキュリティなど、DBを中間層の背後に隠す他の理由があります。


-2

どこで迷子になるかわかりませんが、REST APIを使用している場合は余分なステップを実行していることは明らかです。

長所と短所がありますが、アプリケーションからデータベースに直接アクセスできる場合は、Web APIを使用する代わりに直接呼び出すことをお勧めします。もちろん、Web APIを使用する場合は、アプリケーションを別のプラットフォームに簡単に移植できます。


1
»どこで迷子になるかわかりませんが、REST APIを使用している場合は余分なステップを実行していることは明らかです。それは違うの。
トーマスジャンク

1
移植性だけでなく、データベースへのアクセスが悪い考えではない状況はありませんか?REST APIなどを使用すると、サーバー側でより多くのロジック(およびセキュリティの向上)を維持できる場合があります。
Jトラナ

yesまたはnoになり得る@JTranaは、追加のレイヤーを導入する際の方法に本当に依存し、追加のセキュリティレイヤーを提供できます。追加のレイヤーを追加すると、何かを台無しにしてセキュリティホールを公開する機会が増えることも意味します。Web APIのポイントは、「API」を公開することだと思います。サードパーティへのアクセスを提供し、多くのプラットフォームを必要とするFacebook、Amazon、Googleのような大きなアプリケーションにはWeb APIが必要ですが、小さなアプリケーションの場合は実行前によく考える必要があります。
キリエ

-2

残り :

  • マルチフロントエンドと1つのバックエンドに対応
  • 独自のAPIを作成する必要があります(またはループバックのようなものを使用します)
  • オフラインで作業していない

ローカルDB

  • 「階層」に開かれていないため、同期するにはバックエンドにアクセスする必要があります
  • APIを作成する必要はありません。DBインターフェイスを使用します
  • オフラインで作業する

これはかなり大きな違いです。人々はしばしばこれらの点を忘れてしまいました。


2
-1。APIを作成する「必要性」はありませんが、DALを作成しないと、データベースバックエンドの変更が必要になった場合に多大な苦痛をもたらすことがよくあります。また、DBが「オフライン」である場合、Restサービスも利用できないという理由もありません。
ジェームズスネル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.