Daha hızlı olan nedir? REST API mi kullanıyorsunuz veya doğrudan bir veritabanını mı sorguluyorsunuz?


16

Daha hızlı performans akıllıca nedir? Bir REST API'si oluşturma ve web uygulamanızın veritabanınızla tüm etkileşimleri yapmak veya doğrudan veritabanınızı sorgulamak için REST API'sini kullanması (yani dilinizin Java için JDBC gibi bir veritabanını sorgulamak için kullandığı tipik nesneyi kullanarak)?

REST ile gördüğüm yol:

  1. Kodunuzda REST yöntemini çağırmak için bir nesne oluşturuyorsunuz
  2. Http yöntemini arayın
  3. REST API'nizin içindeki kod veritabanını sorgular
  4. Veritabanı bazı veriler döndürür
  5. REST API kodu verileri Json'a paketler ve istemcinize gönderir
  6. İstemci Json / XML yanıtı alır
  7. Yanıtınızı kodunuzdaki bir nesneye eşleme

Öte yandan, bir veritabanını doğrudan sorgulama:

  1. Veritabanını sorgulamak için sorgu dizesi olan bir nesne yaparsınız
  2. Veritabanı bazı veriler döndürür
  3. Yanıtınızı kodunuzdaki bir nesneye eşleme

Peki bu bir REST API kullanmanın daha yavaş olacağı anlamına gelmez mi? Belki veritabanı türüne bağlıdır (SQL vs NoSQL)?


3
Bir REST API bir veritabanı erişim protokolü değildir, bu nedenle soru büyük bir kategori hatasıdır. REST API'si bir belge deposudur. Sunucu tarafında bir veritabanı olabilir (ya da olmayabilir). Bir REST API'sine ihtiyacınız yoksa açıkçası kullanmayın. Ama sonra her şey için geçerli. Eğer bir veritabanına ihtiyacınız yoksa bir veritabanını kullanmayın, dosya sistemine yazmak bir veritabanından daha hızlı olacaktır. Bir dosya sistemine ihtiyacınız yoksa bir dosya sistemi kullanmayın, RAM'e yazmak diskten daha hızlıdır. RAM'e ihtiyacınız yoksa kullanmayın, CPU önbelleğine yazmak daha hızlı vb.
Cormac Mulhall

1
"Öte yandan" veritabanınızı büyük kötü dünyaya açığa vurmanızı gerektirir.
Pieter B

@PieterB: Hayır, "öte yandan" veritabanını güvenilir olan web uygulamasına maruz bırakıyor.
JacquesB

@JacquesB ve web uygulaması istemciler bilgisayarda çalışır. Bu yüzden değiştirilmemeli, çünkü değiştirilmiş bir versiyon olabilir.
Pieter B

@PieterB: Soru, güvenilmeyen bir sunucuda çalışan web uygulaması hakkında hiçbir şey ifade etmiyor. Bu çok sıradışı bir kurulum olurdu.
JacquesB

Yanıtlar:


18

Karmaşıklık eklediğinizde kod daha yavaş çalışır. Gerekmiyorsa bir REST hizmetinin sunulması, sistem daha fazla yaptığı için yürütmeyi yavaşlatacaktır.

Veritabanını çıkarmak iyi bir uygulamadır. Hız konusunda endişeleniyorsanız, veriyi belleğe önbelleğe almayı düşünebilirsiniz, böylece veritabanına isteği işlemek için dokunmanız gerekmez.

Performansı optimize etmeden önce, hangi sorunu çözmeye çalıştığınıza ve kullandığınız mimariye bakmadan önce, veritabanı seçeneklerinin REST'e karşı doğrudan erişim olacağı bir durum düşünmeye çalışıyorum.


Önbellekten bahsettiğiniz için +1. Yapmasına rağmen extra work. Ama aslında tekrarlanan sorguyu önbelleğe alarak daha hızlı olabilir.
Yana Agun Siswanto

3
@Klee Cevabınız tam olarak doğru değil. »Gerekmiyorsa bir REST hizmetinin sunulması, sistem daha fazla şey yaptığı için yürütmeyi yavaşlatacaktır.« Her durumda, örneğin bir ters-proxy, sonuçlandırılmış sonuçları işleyebiliyorsa, son noktaya hiç trafik gelmez.
Thomas Junk

@klee Bu soruyu sormamın nedeni bu SO post programcılar.stackexchange.com/ questions/277701/… - Bir cevap, Amazon'un doğrudan erişim yerine tamamen RESTful bir sistem kullanarak nasıl büyük bir başarıya sahip olduğunu anlatıyor. Beni düşündürdü ...
Micro

9

Endişeniz hız ise, evet bir Rest hizmeti yukarıda belirtilen nedenlerden dolayı daha yavaş olacaktır. Bununla birlikte, tanımladığınız türün hızı nadiren birincil kaygıdır ve öyleyse başka şekillerde ele alınabilir. Erken optimizasyon tüm kötülüklerin köküdür .

Öncelikli ilginizin birlikte çalışabilirlik (mobil, web, B2B) olup olmadığını düşünün, şimdi REST çok çekici çünkü teknoloji agnostik.

Bir veritabanı kodunu varsayalım. Temel veri deponuzu değiştirmeyi seçerseniz ne yapardınız? Eğer alttaki mağazaya sıkıca bağlıysanız ne kadar zor olurdu?

Asıl cevap buna bağlı , ama umarım size düşünecek bazı şeyler verdim!


6

Bu soruyu cevaplamakta zorlanırsanız.

Doğru genel cevap şu olmalıdır: duruma göre değişir.

REST ile gördüğüm yol:

  1. Kodunuzda REST yöntemini çağırmak için bir nesne oluşturuyorsunuz
  2. Http yöntemini arayın
  3. REST API'nizin içindeki kod veritabanını sorgular
  4. Veritabanı bazı veriler döndürür
  5. REST API kodu verileri Json'a paketler ve istemcinize gönderir
  6. İstemci Json / XML yanıtı alır
  7. Yanıtınızı kodunuzdaki bir nesneye eşleme

Düşüncenizde bir hata var.

Ve bu hata, REST'i ve ilkelerini tam olarak anlamadığınız gerçeğinden kaynaklanmaktadır. REST icat edilmedi, çünkü bazı inekler, Javascript nesnelerini tel üzerinden HTTP üzerinden göndermenin havalı olduğunu (tabii ki) buldu. HTTP kullanmanın ana avantajı, Önbellek kullanma olasılığıdır . Sonuçlarınızı önbelleğe alınabilir yaparsanız , DB'ye daha az istekte bulunulur. Ve hiçbir sıralama söz konusu değildir. Cevap doğrudan teslim edilebilir.

Insofar @Klees yanıtı tam olarak doğru değil :

Karmaşıklık eklediğinizde kod daha yavaş çalışır. Gerekmiyorsa bir REST hizmetinin sunulması, sistem daha fazla yaptığı için yürütmeyi yavaşlatacaktır.

Önbelleğe alınabilir sonuçlarla uğraşırken, uygulamanız üzerinde bir etkisi yoktur: bilinen sorulara bilinen yanıtların iletilmesi ters proxy üzerinden yapılabilir.


4
Veriler bir dinlenme hizmeti katmanında önbelleğe alınabiliyorsa, web uygulamasında önbelleğe alınabilir ve bu da performans için çok daha iyi olur.
JacquesB

En hızlı yol, web uygulamasına hiç vurmamaktır.
Thomas Junk

1
Ve sadece daha ilginç hale getirmek için, bellekte v. Diske erişebiliyorsanız, veritabanına yapılan tüm "isabet" değerleri eşit değildir.
JeffO

@ThomasJunk: Orijinal soruyu doğru anlarsam, istemci bir web uygulamasıdır ve soru, web uygulamasının doğrudan db'ye bağlanıp bağlanmaması veya bir dinlenme hizmetinden mi çağrılacağıdır.
JacquesB

1
Bu benim cevabımdaki hiçbir şeyi değiştirmiyor. Bir REST Hizmetini çağırmak, daha önce de söylediğim gibi, olası yanıtların önbelleğe alınabileceği bir ters proxy'nin arkasında olabilecek bir Web Sunucusuna çağrı yapılmasını içerir.
Thomas Junk

2

Ekstra bir hizmet katmanının sunulmasının her zaman karmaşıklık ve performans ek yükü maliyeti vardır. Paylaşılan bir hizmet katmanının (REST API gibi), paylaşılan önbellekleme nedeniyle performansı artırabileceği bazı belirli mimari türler vardır - ancak sahip olduğunuz mimari türü gibi görünmüyor.

Doğrudan aynı veritabanına bağlanan birden çok web uygulamanız veya birden çok masaüstü uygulamanızın olduğu bir mimari düşünün. Aynı sorguları sık sık yaparlarsa, paylaşılan bir hizmette sorgu sonuçlarını önbelleğe almak için performansı artırabilir. Özellikle aynı veritabanına doğrudan erişen (bir web uygulaması üzerinden değil!) Ve aynı sorguları gerçekleştiren yüzlerce masaüstü uygulaması varsa, büyük bir gelişme olabilir. Bununla birlikte, bu mimaride bile, paylaşılan bir hizmet sunmanın başlıca nedeni muhtemelen performanstan ziyade güvenlik ve veri soyutlaması olacaktır.

Ancak, veritabanına doğrudan bağlanan tek bir web uygulamanız olduğu anlaşılıyor. Bu durumda, ilave bir servis katmanı getirmenin bir yararı yoktur. Önbellekleme, veritabanı soyutlama vb. Aynı uygulamada veri erişim katmanında işlenebilir.


1

Değişir.

Açıkçası, kodunuzdaki katman sayısı arttıkça yavaşlar. Ancak ... doğrudan uçtan uca performansın ölçeklenebilirlik kadar önemli olmadığı bir nokta var. Yerel bir PC'de veritabanınıza erişen 1 kullanıcınız varsa, hızlı bir şekilde ilerleyebilir. Aynı PC'de aynı DB'ye erişen bin kullanıcınız varsa, bunların hepsinin hayal kırıklığına uğradığını görme şansınız vardır. Çözüm DB'yi başka bir kutuya taşımak, ortasına bir katman eklemek ve 1 kullanıcı için daha yavaş performans göstermesine rağmen, bin eriştiğinde daha hızlı gidecek. (bu basit bir cevap ama prensipte doğrudur).

DB'nizi güvenlik gibi orta katman katmanının arkasına gizlemenin başka nedenleri de vardır.


-2

Nerede kaybolduğunuzu bilmiyorum, ancak oldukça açık, REST API'yi kullanırken ekstra adım yapıyorsunuz ve ekstra adım "her zaman", programlama sırasında daha yavaş demektir.

Artıları ve eksileri vardır, ancak veritabanına doğrudan uygulamanızdan erişebiliyorsanız, Web API kullanmak yerine doğrudan aramak daha iyidir, elbette Web API kullanıyorsanız, uygulamanızı farklı bir platforma kolayca taşıyabilirsiniz.


1
»Nerede kaybolacağınızı bilmiyorum, ancak oldukça açık, REST API kullandığınızda ekstra adım yapıyorsunuz ve ekstra adım" her zaman "programlama sırasında daha yavaş demektir.« Bu, yürütme sırasında daha yavaş demektir, bu doğru değil.
Thomas Junk

1
Veritabanına erişmenin yalnızca taşınabilirlik dışında kötü bir fikir olduğu durumlar yok mu? Bazen bir REST API'ye sahip olmak, sunucu tarafında daha fazla mantık (ve daha iyi güvenlik?) Tutabilir, değil mi?
J Trana

@JTrana, evet veya hayır olabilir, ekstra katmanı eklerken ekstra bir güvenlik katmanı sunarken, bir şeyleri nasıl yaptığınıza bağlıdır, ekstra katman eklemek, bir şeyi batırmak ve güvenlik deliğini ortaya çıkarmak için daha fazla şansınız olduğu anlamına gelir. Web API'nin amacının "API" nızı ortaya çıkarmak olduğunu düşünüyorum. Facebook, Amazon, Google gibi 3. tarafa erişim sağlaması ve çok fazla platformu olması gereken büyük bir uygulamanın Web API'sı olması gerekir, ancak küçük uygulama için bunu yapmadan önce iki kez düşünmeniz gerekir.
kirie

-2

DİNLENME :

  • çoklu ön uçlara ve 1 arka uca açık
  • kendi API'nizi oluşturmanız (veya Loopback gibi bir tane kullanmanız) gerekir
  • çevrimdışı çalışmıyor

Yerel DB:

  • 'katmanlara' açılmadıysa senkronize etmek için arka ucunuza erişmeleri gerekir
  • API oluşturmaya gerek yok, DB arayüzü kullanın
  • çevrimdışı çalışma

BU ÇOK BÜYÜK FARK, İNSANLAR BU NOKTALARI UNUTTUR


2
-1. Bir API oluşturmak için "ihtiyaç" olmamasına rağmen, bir DAL oluşturulmaması, veritabanı arka ucunun değiştirilmesi gerektiğinde genellikle büyük bir acıya yol açar. Ayrıca DB "çevrimdışı" varsa geri kalanı hizmeti de orada kullanılabilir olamazdı neden yok.
James Snell
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.