PostgreSQL ile Dinamik API'ler için Hasura GraphQL Engine'e Giriş

Yayınlanan: 2019-11-07

Genel olarak, son yıllarda, REST API'leri hızla değişen teknoloji gereksinimleriyle uğraşırken esnek olmadığı için eleştirilere maruz kaldı. Geçmişe bakıldığında, çoğu kişi GraphQL'nin API geliştirmede ek esneklik ve verimlilik ihtiyacıyla başa çıkmak için yaratıldığına inanıyor. Böylece, REST API'lerinin eksikliklerini azaltmak. Facebook'un HTML5 uygulamalarından daha sağlam ve yerel kurulumlara geçişinin bir sonucu olarak, GraphQL'in popülerliği ve benimsenmesi son beş yılda iyi bir nedenle arttı. Bu blogda, GraphQL fenomeni PostgreSQL'i inceleyeceğiz ve daha sonra Hasura GraphQL motoruna kapsamlı bir giriş yapacağız. Bir pasajda, Hasura GraphQL motoru-PostgreSQL ilişkisi ve eko sistem.

GraphQL: Bir Facebook İsyanı

Birçoğu GraphQL'nin REST API'lerine bir isyan olarak yaratıldığına inansa da, bu gerçeklerden daha uzak olabilir. İronik olarak, sadece Facebook'ta bir iç ihtiyaca hizmet etmek için yaratıldı. Aslen Facebook Ekibi tarafından tasarlanan ve açık kaynaklı olan GraphQL, genellikle bir veritabanı teknolojisi olarak karıştırılır. Esasen, yanlış anlaşılmaya rağmen, GraphQL teknik olarak veritabanları için değil API'ler için bir sorgu dilidir . Sonuç olarak, tüm istekleri tek bir uç noktaya soyutlayarak API oluşturmanın karmaşıklığını azaltır. Geleneksel REST API'lerinden farklı olarak, GraphQL bildirimseldir, yani istenen her şey iade edilir. Biraz daha bağlam elde etmek için bir adım geri atıp REST API'lerini tekrar gözden geçirmemiz gerekecek.

REST Mimarisi

Tipik olarak API'ler, yazılım bileşenlerinin nasıl etkileşime girmesi gerektiğini belirten kurallar, rutinler veya protokollerdir. Temsili Durum Aktarımı (REST), temelde her şeyin bir 'kaynak' olarak kabul edildiği web hizmetlerinin uygulanmasında kullanılan bir API tasarım mimarisidir. Ne yazık ki, RESTful metodolojisi sürekli olarak tek kaynaklarla uğraşmakla sınırlıydı. Bu nedenle, verilere ihtiyaç duyulduysa ve örneğin gönderiler ve kullanıcılar gibi iki veya daha fazla kaynaktan geliyorsa, gereken her şeyi toplamak için sunucuya çok yönlü geziler yapılması gerekir. Ek olarak, REST 'fazla' ve 'az' alma ile ilgili sorunlarla karşı karşıya kaldı. Tüm bunlar, özellikle ilgili kaynakları birleştiren büyük veri kümelerini işleyen daha fazla veriye dayalı uygulamaların ortaya çıkmasıyla ideal değildi. Bu, Facebook'un karşılaştığı çıkmazı açıklayabilir.

Bu nedenle, daha esnek ve ilerici bir yaklaşım benimseyecek bir API mimarisine ihtiyaç duyulmaktadır.

Bir Alternatif Yaratmak

Alternatif olarak, GraphQL verileri kaynak URL'leri, ikincil anahtarlar veya tablolar açısından değil, nesnelerin grafiği ve NSObjects veya JSON kullanan modeller açısından düşünür. Spesifik olarak, farklı yetenekler ve kullanım durumları tek bir “Grafik”te gösterilebildiğinden, GraphQL her kullanım durumu için ayrılmış uç noktalara ihtiyaç duymaz. GraphQL sorgu dilini kullanarak, yanıtın tam olarak nasıl görünmesi gerektiğini tanımlayabilirsiniz, bu nedenle ek sunucu gidiş dönüşlerine gerek yoktur. Bir uygulama katmanı sorgulama dili olarak, bir sunucudan/istemciden gelen bir dizgiyi yorumlamak ve bu verileri kararlı, anlaşılır ve tahmin edilebilir bir biçimde döndürmek için tasarlanmıştır . Verileri daha iyi birleştirmek için basit bir araçtır.

Sadelik, Kararlılık ve Verimlilik.

Gerçek şu ki, iyi tanımlanmış şemasına rağmen tüm projeler GraphQL gerektirmez, bu nedenle aşırı getirmeyeceğimizden eminiz. Yine de, örneğin MySQL, Postgres ve diğer API'ler gibi birden çok kaynaktan gelen verilere dayanan bir kurumsal ürünümüz varsa, GraphQL daha iyi bir seçenektir. GraphQL, veriler ortak bir uç nokta veya çağrı altında toplandığından, özellikle veri alımıyla ilgili basitlikten gurur duyar. Esasen, istemciler tam olarak ihtiyaç duyduklarını elde ettiğinden, bu, istemci tarafından yapılan her isteğin boyutunu etkin bir şekilde azaltır ve yüksek performanslı uygulamalarla sonuçlanır. GraphQL, aksi takdirde birden çok uç nokta gerektirecek verileri birleştirdiğinden, karmaşık tekrar alımlarını kolaylaştırır, böylece daha iyi sorgu verimliliği sağlar. Sonuç olarak, basitliği ile zaman içinde daha fazla arka uç istikrarı, planlama, inşaat, yürütme ve sürekli operasyon gelir.

GraphQL'nin Avantajları

Özetle, GraphQL, verilerin kolayca anlaşılabilir sorgularla çıkarılmasına izin verir, verilere bir sunucu yerine daha doğrudan erişildiği için hafif ve hızlı uygulamaların hızlı bir şekilde geliştirilmesine olanak tanır. Ayrıca, tüm veriler için tek bir uç nokta kullanırken, birden fazla URL veya kaynak zinciri kullanmadan tek bir sorgu ile birden fazla kaynağın alınmasına izin verir. Unutmayın, veriler sunucuda grafik tabanlı bir şema ile tanımlanır, bu nedenle çoklu çağrılar yerine paket olarak teslim edilir. Bu, API geliştirme sırasında API yanıtlarının toplanmasında operasyonel bir artış sağlar.

Bu da ön uç geliştirme ekipleri üzerindeki yükü azaltır, API sürüm oluşturmayı kolaylaştırır, bakımı basitleştirir ve veri aktarımı taleplerinden tasarruf sağlar. Ayrıca, veri alırken daha fazla öngörülebilirlik sağlar, bildirime dayalı veri alımını destekler ve aşırı ve eksik getirmeyi azaltır. Esasen, aşırı getirme, bir istemci uygulamada gerçekte gerekenden daha fazla bilgi indirdiğinde meydana gelirken, eksik getirme, belirli bir uç noktanın yeterince bilgi sağlamadığı anlamına gelir ve bu nedenle müşterinin ihtiyaç duyduğu şeyi almak için ek isteklerde bulunmasını gerektirir.

Teknik olarak GraphQL, bir REST sistemini tamamen değiştirmeniz gerekmediği anlamına gelen tanımlanabilen bir sarmalayıcıdır. Esasen bu, GraphQL'nin REST merkezli API'lerin uyumlu olduğu sistemlerle uyumlu olduğu anlamına gelir. Ek olarak, GraphQL, ön ve arka ucun sorunsuz ve bağımsız geliştirilmesine olanak tanır. Bunun nedeni, şema iyi tanımlandığında, ön uç ve arka uç üzerinde çalışan ekiplerin her ikisinin de verilerin kesin yapısının farkında olmalarıdır. Tüm bu avantajlar, birçok full-stack mühendisi tarafından avantajlı olarak görülüyor. Son olarak, GraphQL kapsamlı iç gözlem ve kendi kendini belgeleme için inanılmaz bir kapasiteye sahiptir.

the-faydaları-of-graphql

API geliştirmede GraphQL Kullanım Örnekleri

Son derece güçlü olduğu düşünülen GraphQL, hızlı hız ve indeksleme ile istikrarlı okunabilirlik arayan Full-stack geliştiriciler tarafından kullanılır. Özellikle GraphQL, yüksek veri çıkışı gerektiren API geliştirmede kullanışlıdır. Nitekim, bir ağ üzerinden aktarım için gereken veri miktarını en aza indirir. Bu, mobil kullanıcılar, düşük güçlü cihazlar ve özensiz ağlar için oldukça faydalıdır. Bu, Facebook'un GraphQL'yi tasarlamasının ilk nedenleri arasında yer alıyor. Sanıldığının aksine, GraphQL yalnızca devasa karmaşık veritabanlarına uygulanamaz, aynı zamanda daha yüksek verimlilikle nispeten basit veritabanları oluşturabilir.

Ek olarak, çeşitli benzersiz ön uç çerçeveler ve platformlara uygulanabilir ve tüm kullanıcı gereksinimlerine uyacak tek bir API ile sürdürülen heterojen bir ortam sağlar. Ayrıca, tam yığın geliştirici ekipleri için özellik hızını önemli ölçüde artırdığı için hızlı özellik geliştirmeyi kolaylaştırır. Bunu, ön uç geliştiriciler, örneğin arka uç geliştiricilerin teslim etmesini beklemek zorunda kalmadan yeni özellikler tanıtmak veya mevcut olanları değiştirmek için API isteklerinde bulunabildiğinden, yeni özellikler geliştirirken ekipler arasında gereken iletişimi azaltarak yapar. Hasura GraphQL motoruna giriş yaptığımız için bu hızlı GraphQL özeti şimdilik yeterli olacaktır. Yine de biraz daha bağlam için PostgreSQL'e dokunalım.

PostgreSQL nedir?

Topluluk tarafından yönlendirilen ücretsiz bir ilişkisel veritabanı yönetim sistemi olan PostgreSQL, tek bir şirkete ait değildir. Mevcut en güçlü, dahili olarak tutarlı RDBMS olarak kabul edilen Postgres, C dilinde yazılmıştır ve C/C++, JavaScript, Java, Python, R, Go, Lisp, .Net vb. gibi bir dizi programlama dilini destekler. Çoğu arasında giderek daha fazla tercih edilmektedir. tam yığın geliştiriciler, PostgreSQL, kardeş MySQL'den daha zengin özelliklere sahiptir ve özellikleri, ölçeklenebilirliği ve performansı nedeniyle popülerlik kazanır. PostgreSQL, gereksinimlerin karmaşık prosedürler, karmaşık tasarımlar, ısmarlama entegrasyon ve veri bütünlüğü etrafında döndüğü projelerde popülerdir.

Full-Stack geliştiriciler için Postgres'in Avantajları

Genel olarak, tam metin arama, JSON sütunları, mantıksal çoğaltma gibi özellikler Postgres'e MySQL'de üstünlük sağlar. Bu, tipik ticari veritabanlarının performans talepleri için en uygunudur ve daha az ek yük ve maliyet için birkaç veritabanı sisteminin tek bir sistemde konsolidasyonuna izin verir. Ayrıca, Anahtar-Değer-Depolama (JSON / JSONB sütun türleri) için daha yeni özellikleri, onu NoSQL veritabanlarına uygun bir alternatif haline getirir. Ek olarak, kümelemeyi veya bir ana-bağımlı-mimariyi destekler ve bu da onu bulut benzeri ortamlar için çok uygun hale getirir. Ayrıca, popüler yabancı veri sarmalayıcı uzantısı, gerektiğinde harici kaynakların doğrudan PostgreSQL içinden sorgulanmasına olanak tanır. Özellikle karmaşık sorguların yürütülmesini, veri ambarını ve dinamik veri analizini gerektiren sistemler için en uygunudur.

Nitekim PostgreSQL, MySQL'in desteklemediği bazı özellikleri daha iyi destekler. Örneğin, kısıtlamaları, zengin veri türlerini (diziler, haritalar, JSON gibi), daha zengin jeo-uzamsal Desteği (PostGIS) ve daha zengin tam metin desteğini kontrol edin. Ek olarak, engellenmeyen dizin oluşturma, kısmi Dizinler, ortak tablo İfadeleri ve daha dinamik analiz işlevlerini destekler. Bununla birlikte, PostgreSQL, istemci/sunucu iletişimlerinin şifrelenmesi için bağlantılar için yerel SLL desteğinin yanı sıra SELinux ilkesine dayalı ek erişim kontrolleri sağlayan SE-PostgreSQL adlı yerleşik bir geliştirme sunar.

Kurumsal sınıf ürünler için birçok zengin özellik ile PostgreSQL, verilerin kimlik doğrulama gerektirdiği ve okuma/yazma hızlarının proje başarısı için kritik olduğu büyük sistemler için uygundur. Ayrıca, normalde tescilli çözümlerde bulunan çoklu performans geliştiricileri de destekler. Bunlar arasında şunlar yer alır: okuma kilitleri olmadan eşzamanlılık, SQL sunucusu ve Geospatial veri desteği bunlardan birkaçıdır.

Postgres mimarisinin bir diğer ana avantajı, benzersiz genişletilebilirliğidir. Kullanıcıların, çekirdek sistem kodunu değiştirmeden veri türleri, dizin erişim yöntemleri, sunucu programlama dilleri, yabancı veri sarmalayıcılar (FDW) ve yüklenebilir uzantılar gibi özellikler eklemesine olanak tanır. Modern bir çok çekirdekli işlemci mimarisinden yararlanır, böylece çekirdek sayısı arttıkça performansının neredeyse doğrusal olarak artmasına izin verir. Bu önemlidirGenel olarak, tam metin arama, JSON sütunları, mantıksal çoğaltma gibi özellikler Postgres'e MySQL'de üstünlük sağlar. Bu, tipik ticari veritabanlarının performans talepleri için en uygunudur ve daha az ek yük ve maliyet için birkaç veritabanı sisteminin tek bir sistemde konsolidasyonuna izin verir. Ayrıca, Anahtar-Değer-Depolama (JSON / JSONB sütun türleri) için daha yeni özellikleri, onu NoSQL veritabanlarına uygun bir alternatif haline getirir. Ek olarak, kümelemeyi veya bir ana-bağımlı-mimariyi destekler ve bu da onu bulut benzeri ortamlar için çok uygun hale getirir. Ayrıca, popüler yabancı veri sarmalayıcı uzantısı, gerektiğinde harici kaynakların doğrudan PostgreSQL içinden sorgulanmasına olanak tanır. Özellikle karmaşık sorguların yürütülmesini, veri ambarını ve dinamik veri analizini gerektiren sistemler için en uygunudur.

postgreSQL özellikleri

PostgreSQL'in Eksileri

Genel olarak, ANSI SQL standartlarından hoşlanıyorsanız, PostgreSQL'i düşünün, ancak ODBC standartlarını tercih ediyorsanız MySQL'i seçin. Ne yazık ki, Postgres zaman zaman canlı, "her zaman yüksek" üretim ortamlarında performansta yetersiz kalıyor. Postgres'in ek bir dezavantajı, replikasyonunun depolama motoru düzeyinde uygulanmasıdır. Bu, MySQL'in daha olgun ve “sorgu motoru düzeyinde” uygulanan replikasyonundan daha pahalı hale getirir.

Hasura GraphQL motoruna giriş

GraphQL API geliştirme ve PostgreSQL'i kısaca ele aldığımızdan, Hasura GraphQL motoruna giriş için yeterli içeriğe sahip olmalıyız. Temel olarak Hasura, PostgreSQL RDBMS için basitleştirilmiş bir önyükleme ve GraphQL API geliştirme yöntemi sağlayan bir GraphQL motorudur. Geriye dönüp bakıldığında, Hasura şu anda mevcut PostgreSQL tabanlı uygulamalara anında Hizmet olarak GraphQL ekleyen tek hazır çözümdür. Esasen, GraphQL'yi işleyen arka uç kodu yazmanın zaman alıcı görevini atlayarak.

Basitleştirilmiş Hasura

Hasura'yı daha da basitleştirmek için bir dakikanızı ayıralım. Temel olarak API'ler, bilgi istemenize (bir sorgu) ve dolayısıyla JSON veya XML verileri göndererek yanıt vermenize izin veren arabirimlerdir. Bu veritabanı normalde barındırılır ve bir sunucudan alınır. Hasura'nın işleri basitleştirmek için geldiği yer burasıdır. Geriye dönüp bakıldığında, Hasura GraphQL motoru, bir Postgres veritabanı üzerinden GraphQL sorgularınızı işleyen bir sunucudur. Bu, uygulamanızın üretime hazır olması için geçen süreyi etkili bir şekilde azaltır ve yalnızca birkaç tıklamayla veritabanınızın tablolarını oluşturmanıza, görüntülemenize ve değiştirmenize olanak tanır. Sonuç olarak bu, tam yığın geliştiricilerin daha kısa sürede PostgreSQL üzerinde ölçeklenebilir GraphQL uygulamaları oluşturmasına olanak tanır. Bu, geliştiricilere haftalarca önceden kodlama yapmaktan tasarruf sağlar ve sorunlu veri sızdıran hataların üretime geçmesini önleyebilir.

Hasura, API geliştirmede hangi sorunu çözüyor?

Genel olarak Hasura, özellikle karmaşık API'ler için büyük ölçekli üretim kullanımı sırasında API yaşam döngüsü yönetimini basitleştirir. Her şeyden önce, GraphQL Engine, mevcut PostgreSQL veritabanlarını kullanan kurumsal API geliştirme projeleriyle birikmiş tam yığın geliştiricileri kendine çekiyor. İdeal olarak, GraphQL ışık hızında API geliştirme döngülerine izin verdiğinden, Hasura, kuruluşların mevcut uygulamaları, veritabanlarını veya kullanıcıları etkilemeden aşamalı olarak GraphQL'ye geçmeleri için basitleştirilmiş bir yol sağlar. Hafif ve yüksek performansının yanı sıra motor, GraphQL API'lerinizi keşfetmenize ve veritabanı şemanızı ve verilerinizi görsel olarak yönetmenize olanak tanıyan bir yönetici kullanıcı arayüzü ile birlikte gelir.

Hasura'nın Avantajları

İlk olarak, Hasura'nın veritabanı değişiklikleri veya "taşıma" işlemlerini yönetmek için sağlam ve istikrarlı bir modeli vardır. Veritabanı şeması yönetimi genellikle zor olduğundan bu avantajlıdır. Örneğin; zaman içindeki değişikliklerin izlenmesi ve şema değişikliklerinin API geliştirmeleriyle ilişkilendirilmesi (şema yönetimi). Ayrıca, yeni bir veritabanı dağıtabilen veya değişiklikleri geri alabilen komut dosyalarının bakımı gibi rutin işler sıkıcı olabilir ve teşhis edilmesi zor hatalara veya kesintiye neden olabilir. Olumlu bir yan not olarak, Hasura veritabanı geçiş bileşenleri düz SQL'dir, dolayısıyla Hasura araç setinin dışında taşınabilir. Sonuç olarak, Hasura harika şema yönetim özelliklerine sahiptir ve web soket bağlantılarını işlemek için kod yazmanıza gerek yoktur.

İkincisi, Hasura GraphQL motoru, gerekli verilerin tek bir sorgu ile alınmasını kolaylaştırır. Bunu, tablolara veya diğer görünümlere ilişkiler olarak görünümler eklemenize izin vererek yapar. Ayrıca, şema birleştirme ile özel çözümleyicilerin yazılmasına ve veritabanı olaylarında tetiklenen sunucusuz işlevlerin veya mikro hizmet API'lerinin entegrasyonuna olanak tanır. Bu kullanışlı olabilir ve 3 faktörlü uygulamaların oluşturulmasını kolaylaştırır. Nitekim Hasura son derece hafif bir motordur. Geriye dönüp bakıldığında, saniyede 1000'den fazla istek sunarken bile yalnızca 50 MB'a kadar RAM tüketir. Parlak bir yatırım getirisi!

Özellikle Hasura, ayrıntılı API veri düzeyinde yetkilendirmeyi ve kimlik doğrulamayı iyi bir şekilde kolaylaştırır. Webhook, JWT, Auth0 veya özel uygulamalar aracılığıyla tercih edilen bir kimlik doğrulama sağlayıcısına bağlantı sağlar. Ve böylece, kullanıcılar için rollerin belirtilmesi, örneğin yönetici, anonim kullanıcılar vb. gibi farklı verilere kimlerin erişebileceğinin tanımlanması. Genel olarak, ayrıntılı erişim kontrol sistemi, GraphQL şemasına benzer veritabanı tablosu yapısına dayanır. Ek olarak, özel izin kuralları, veritabanı işlemlerine ve değerlerine göre kesin olarak tanımlanır.

Son olarak, Hasura, SQL benzeri basit bir ofset/limit modeliyle verimli sayfalamayı mükemmel bir şekilde destekler. Örneğin, belirli bir sorgu için döndürülen satır sayısını kısıtlamak için erişim kontrol modelini kullanır. Modeli, limitlerin role göre ayarlanmasına izin verir. Örneğin, çok daha yüksek bir istek oranı uygulayan kullanıcılar, daha küçük satır sınırlarıyla sınırlıdır. Bu, veritabanını ve GraphQL motorunu strese sokmaktan kaçınır. Ek olarak, özellikle Hasura sizi yalnızca GraphQL ile kısıtlamaz. Hasura'nın yönettiği Postgres tablolarına karşı REST veya diğer GraphQL olmayan mikro hizmetleri yine de çalıştırabilirsiniz. Bu Hasura'nın otomatik şema birleştirmesi ile mümkündür. Bu, Hasura tarafından yönetilen yeni API'leri eski API'ler ve verilerle birleştirerek, tek bir birleşik şema için Hasura GraphQL hizmeti ve arka ucun birleştirilmesine olanak tanır.

Hasura Kullanım Örnekleri

Yüksek performanslı ortamlar için uygun olan Hasura Motoru, mevcut veritabanlarında GraphQL-Postgres uygulamasını otomatikleştirirken hız sunar. Sonuç olarak, bu, halihazırda Postgres kullanan şirketlere, mevcut tabloları bir "grafiğe" bağlayarak GraphQL'e geçmenin daha az stresli ve aşamalı bir yolunu sağlar. Hasura, özel iş mantığını kolayca uygulamanıza olanak tanıyan şema birleştirme ile verimli bir şekilde ilgilenir. Remote GraphQL şemaları ile Hasura, GraphQL sunucularına en sevdiğiniz dilde yazmanıza ve daha sonra verileri tek bir uç noktaya sunmanıza olanak tanıyan özel iş mantığı için bir ağ geçidi olarak kullanılabilir. Ayrıca Hasura, GraphQL'de abonelik adı verilen yerleşik canlı sorgularla sorgular ve mutasyonlar için harika bir sözdizimine sahiptir.

Birkaç Hasura Sınırlaması

Ne yazık ki, Hasura'nın erişim kontrol sistemi modeli her uygulama için tam olarak çalışmayacaktır. Örneğin, bireysel giriş parametreleri düzeyinde API erişim yetkilendirmesini tam olarak desteklemez. Çoğu durumda geçiş gerektiren Postgres veritabanıyla sınırlı olduğu gerçeğinden bahsetmiyorum bile. İhmal edilebilir olsa da, GraphQL API'sinin hatalı biçimlendirilmiş istekler için döndürdüğü hata mesajları Hasura'da oldukça düşmancadır. Aksi takdirde, Hasura GraphQL Engine'in bu girişinde gördüğümüz gibi Hasura'nın yapamayacağı çok az şey vardır.

Çözüm

Sonuç olarak, GraphQL büyüdükçe, işletmelerde web ölçeğinde oluşturulacak API geliştirmeyi özünde daha da basitleştirecektir. GraphQL'nin çeşitli endüstrilerde geniş ölçekte hızlı bir şekilde benimsenmesiyle Hasura, endüstri standardı tercih edilen teknolojiler olan GraphQL ve Postgres ile API'lerin oluşturulmasını ve yönetimini daha da otomatikleştirme potansiyeline sahiptir. Hasura , CRUD (Oluştur, oku, güncelle ve sil) GraphQL arka uçlarının oluşturulmasını basitleştirir. Daha da önemlisi, arka uç kodu yazmadan GraphQL merkezli bir API ve Postgres ile sıfırdan başlıyorsanız Hasura açık ara en iyi ve tek seçenektir. GraphQL ve Hasura kurumsal olanaklarıyla ilgili herhangi bir soru veya danışma için bize ulaşmaktan çekinmeyin. Hasura GraphQL Engine'e girişimiz bu kadar.