Bir web hizmetinin arka ucunu optimize etmek her zaman performansını artırmayı amaçlar; bunun önemli bir yönü de veri işlemeyi hızlandırmaktır. Bu süreç, kaynakların daha verimli kullanılmasına ve sistemin isteklere yanıt verme süresinin en aza indirilmesine yönelik birçok önemli iyileştirmeyi içermektedir. Bu makalede, web hizmetinizi önemli ölçüde hızlandırabilecek kanıtlanmış birkaç tekniği paylaşacağım.
Birçok programcı, bir uygulamayı daha hızlı hale getirme arayışında, kodu ve algoritmaları optimize etmeye, uygun veri yapılarını seçmeye ve en uygun operasyonlara odaklanır. Bu genellikle performansın artmasına yol açar, çoğunlukla optimize edilmiş kodun hızını artırır, ancak bu önemli ölçüde değildir.
Mütevazı artış, bellek işlemlerinin doğasında olan hızdan kaynaklanmaktadır ve orijinal kod çok verimsiz olmadığı sürece önemli gelişmeler beklenmemelidir. Ancak optimizasyon için, özellikle girdi-çıktı işlemleri olmak üzere, zaman alan bazı işlemlere öncelik verilmelidir.
İster dosyalarla çalışın ister bir veritabanıyla etkileşimde bulunun, bu görevlerin yürütme süresi, bellek içi işlemlerle karşılaştırıldığında her zaman dikkate değerdir. Bir dosyadan veri okuma sürecini önemli ölçüde etkileyemezsiniz, ancak veritabanıyla çalışmak doğrudan kontrolünüz altındadır. Bir geliştirici olarak bu etkileşimi önemli ölçüde iyileştirecek tüm yeteneklere sahipsiniz.
Veritabanınızla çalışmayı daha verimli hale getirmek ve böylece arka uç hizmetinizin performansını önemli ölçüde artırmak için aşağıdaki stratejileri inceleyelim.
Günümüzde veritabanı etkileşimleri için Nesne İlişkisel Haritalama (ORM) sistemini kullanmayan bir arka uç web hizmeti bulmak nadirdir. Birinci sınıf sonuçları hedefliyorsanız ORM'yi özelleştirmeyi düşünün. ORM'ler verimli ve hatasız olmasına rağmen genel kullanım için tasarlanmıştır. Bu geniş uygulanabilirlik çoğu zaman yüksek performansın pahasına gelir.
ORM'lerin çeşitli veritabanlarıyla uyumlu olacak şekilde oluşturulduğunu unutmayın; bu, projeniz için seçtiğiniz veritabanının belirli avantajlarını kaçırmak anlamına gelebilir. Örneğin, burada gösterildiği gibi, benzersiz veritabanı özelliklerinden yararlanmak, veritabanı etkileşimlerinin hızını 30 kata kadar önemli ölçüde artırabilir.
Yalnızca bir ORM tarafından sağlanan varsayılan sorgulara bağlı kalmak yerine, kendi optimize edilmiş sorgularınızı oluşturmanız faydalı olacaktır. Özel sorgular, özellikle birden çok birleştirme içeren senaryolarda genellikle daha iyi performans gösterir.
Aşağıda, Spring JPA'da bir birleştirme sorgusu kullanarak performansı nasıl artırabileceğinizi gösteren basit bir örnek verilmiştir:
@Transactional @Lock(LockModeType.PESSIMISTIC_READ) @Query(value = """ SELECT e FROM EmployeeRecord e LEFT JOIN DepartmentRecord d ON e.departmentId = d.id WHERE e.departmentId = :departmentId; """) List<EmployeeRecord> findEmployeesByDepartmentId(Integer departmentId);
İç içe nesnelerle ve derin hiyerarşik bir sistemle karmaşık sınıfların kullanılması, sistem performansında önemli bir kayba yol açabilir. Özellikle yapıdaki tüm sınıflar tam olarak kullanılmadığında, iç içe geçmiş yapının tamamı için veritabanını sorgulamak genellikle gereksizdir.
Tembel başlatma, iç içe geçmiş nesneler üzerindeki gereksiz sorguların azaltılmasına yardımcı olurken, iç içe geçmiş bir nesneye ihtiyaç duyulduğunda ancak bu nesnenin tüm verilerinin gerekli olmadığı durumlarda zorluklar ortaya çıkar. Bu ikilemin çözümü düz veri sınıflarını kullanmaktır.
Veritabanından yalnızca gerekli alan verilerini toplamak için tasarlanmış bir sınıf oluşturmalısınız. Ardından, gerekli tüm birleştirmeleri içeren özel bir veritabanı sorgusu ile yalnızca gerçekten ihtiyaç duyulan alanları seçin.
Bu yaklaşım yalnızca sorgu hızını artırmakla kalmayacak, aynı zamanda veritabanından hizmetinize giden veri trafiğini de azaltacaktır.
Örneğin, Spring JPA'dan NamedParameterJdbcTemplate kullanılarak gerekli alanlara sahip düz bir sınıf oluşturulabilir:
public record EmployeeDepartment(Integer employeeId, String employeeName, String departmentName) { }
Daha sonra basit bir komut dosyası kullanılarak ana ve birleştirilmiş tablolardan yalnızca gerekli alanlar toplanır:
public List<EmployeeDepartment> employeeDepartments() { return template.query(""" SELECT employees.employee_id, employees.employee_name, departments.department_name FROM employees LEFT JOIN departments ON employees.department_id = departments.department_id; """, new MapSqlParameterSource(), employeeDepartmentMapper); }
Bu yaklaşım yükü önemli ölçüde azaltacak ve verilerle çalışmayı çok daha verimli hale getirecek.
Verilerle çalışmanın bir sonraki önemli adımı, ana tür Sıcak Veri olmak üzere veri türlerini tanımlamaktır.
Sıcak Veri, hizmetin gerçek zamanlı olarak işlediği verilerdir. Bu veriler önbelleğe alınamaz çünkü web hizmetinin yanıtının uygunluğu, anında yanıt verme yeteneğine bağlıdır. Bu nedenle bu verilerin her zaman güncel olması gerekmektedir. Hizmet sürekli olarak Sıcak Veri ile çalışır, sürekli olarak yeni değerleri kaydeder ve zamanında güncellemeler için bilgileri çıkarır.
Sıcak Verilerle mümkün olduğunca verimli çalışmak için, bu verilerin depolandığı tablonun mümkün olduğunca kompakt kalmasını sağlamak çok önemlidir.
Mümkün olduğunca az sütun tutun
Tablonuz yalnızca aktif olarak kullanılan alanları içermeli ve diğer tüm verileri ayrı bir tabloda, yalnızca ilgili satırın ID'si kalacak şekilde saklamalıdır. Bu yaklaşım, gerektiğinde, örneğin raporlama amacıyla, kullanılmayan tüm alanlara, ana tabloyu bu verilerle aşırı yüklemeden erişmenize olanak tanır.
Mümkün olduğunca az satır tutun
Artık ihtiyacınız olmayan hatları saklamayın. Bunun yerine bunları arşiv tablosuna taşıyın. Bu yaklaşım, tüm geçmiş verileri bir arşivde korurken sorgularınızın gerekli satırları daha hızlı bulmasını sağlar. Bu süreci basit bir iş ile otomatikleştirmek, veri arşivleme sürecine katılımınızı en aza indirir.
Dizinleri güncel tutun
Dizinler oluşturmayı unutmayın. Dizinler hızlı veri aramaları için çok önemlidir ve genellikle programcılar tarafından gözden kaçırılır. Doğru indeksleme, veritabanınızın arama sürelerini ve bellek tüketimini önemli ölçüde azaltabilir. Bileşik dizinler dahil, birleştirmelerde yer alan hem koşullar hem de sütunlar için dizinler oluşturduğunuzdan emin olun.
Yabancı anahtarları kullanmaktan vazgeçin
Yabancı anahtarların kullanılması, anahtarın ilişkili tabloda bulunmasını sağlamak için veritabanına ek bir yük getirir ve bu da özellikle veri yazarken veri işlemlerini yavaşlatır. Beni yanlış anlamayın; Böyle bir tabloda yabancı anahtarın saklanması mümkündür ve hatta bazen gereklidir, ancak anahtarı basit bir değer olarak saklamak daha iyidir.
Bu basit yöntemler masanızın verimliliğini ve kullanışlılığını en üst düzeye çıkarmanızı sağlayacaktır.
Sıcak Veriler, alaka düzeyinin kritik bir etkisi olmamasına rağmen bir yanıt hazırlamak için kullanılan verilerdir. Örnekler ürün açıklamalarını veya mevcut aksesuarların listesini içerir. Bu tür verileri saklarken tablonun boyutunu yakından takip etmenize artık gerek yok. Ancak bu tablolarda indekslerin oluşturulmasını gözden kaçırmamak önemlidir çünkü bunlar sıklıkla birleştirme için kullanılır.
Sıcak Verileri Önbelleğe Al
Warm Data'nın önemli bir avantajı önbelleğe alınabilmesidir. Bir istek yapıldığında verileri hafızada saklayabilir, veritabanı çağrılarının sayısını azaltabilir ve hesaplamaları hızlandırabilirsiniz. Ancak önbelleğin düzenli güncellemelere ihtiyacı olduğunu unutmayın.
Makul bir TTL (Yaşam Süresi) ayarlayın
Düzgün çalışma için doğru Yaşam Süresini (TTL) ayarlayın. Genellikle yaklaşık 90 saniyelik bir TTL yeterlidir; bu, kullanıcının karar vermesi ve bir web sitesinde sipariş vermesi için harcadığı ortalama süreye uygundur. TTL'yi her zaman hizmetinizin gereksinimlerine göre ayarlayın.
Sıcak Verileri depolamak için daha küçük sınıflar kullanın
Önbelleğe alma için kompakt sınıfları kullanın. Tam kapsamlı sorgular yapıldığında ve tablolardaki tüm veriler toplandığında bile her şeyi önbellekte saklamaktan kaçının. Yalnızca gerekli verileri saklayın. Bu yaklaşım, arka uç hizmetinizin bellek tüketimini önemli ölçüde azaltır.
Warm Data'nın kurulumu fazla zaman gerektirmeyecek ve sonuçta somut sonuçlar elde edeceksiniz.
Soğuk veriler, nadiren değişen ancak bir yanıt için gerekli olan verileri ifade eder. Bu tür verilere örnek olarak bir mağazanın adı veya adresi verilebilir. Bu veriler çok nadiren değişir ve müdahalenin uygunluğu üzerinde minimum etkiye sahiptir.
Soğuk Verileri önbelleğe alın veya bir dosyada saklayın
Bu veri türü her zaman önbelleğe alınmalıdır. Bu tür verileri belleğe sığdırmak, boyutunun büyük olması nedeniyle mümkün değilse, veri tabanından kaldırmayı ve kullanıma hazır formatta dosyalar halinde saklamayı düşünün. Kategorilere ayırıp yalnızca en sık kullanılanları seçmek bellek kullanımını azaltmaya yardımcı olacaktır. Ayrıca bu yaklaşım, ağ üzerinden çalışma ihtiyacını ortadan kaldırdığı için veri tabanından veri almaya kıyasla hızı belirgin şekilde artırır.
Tetiklendiğinde Önbelleği Güncelle
Böyle bir önbellek için yaşam süresi (TTL) genellikle 24 saat olarak ayarlanır. Önbelleği güncel tutmak için, bu verilerdeki değişiklikleri izleyen ve önbellek güncellemesini başlatan bir görev planlamalı veya bir tetikleyici oluşturmalısınız. Örneğin, Soğuk Verileri göndermek veya güncellemek için bir uç nokta çağrılırsa, önbelleği güncellemek için bir tetikleyicinin etkinleştirilmesi gerekir.
Soğuk Verilerin etkili bir şekilde yönetilmesi, yanıt verimliliğinin optimize edilmesinin ve dolayısıyla genel sistem performansının artırılmasının da önemli bir parçasıdır.
Sonuç olarak, bir web hizmetinin arka ucunu optimize etmek yalnızca kod ve algoritma optimizasyonuna bağlı değildir. Veritabanı etkileşimlerinin geliştirilmesi, hizmetin daha fazla verimliliğe ve genel performansa sahip olmasını sağlayacaktır. ORM (Nesne-İlişkisel Haritalama) sorgularına ince ayar yapmak, düz veri sınıflarını kullanmak, veri türlerini doğru bir şekilde tanımlamak ve önbelleğe alma stratejilerini benimsemek gibi tekniklerin uygulanması, hizmet performansını önemli ölçüde artırabilir. Bu önlemler sayesinde, web hizmeti sonuçta gelişmiş verimlilik, yanıt verme yeteneği ve geliştirilmiş genel işlevsellik elde edecektir.
Anahtar adımlar :