24 puan yazan GN⁺ 2024-09-30 | 2 yorum | WhatsApp'ta paylaş

Go 1.22’den itibaren standart kütüphanede daha iyi routing desteği sunuluyor

  • Önceden routing işlemleri elle yapılıyordu, ancak artık mux.HandleFunc kullanılarak daha basit şekilde routing yapılabiliyor
  • Login middleware eklenerek güvenlik artırılabiliyor

Yerleşik router’da dikkat edilmesi gereken nokta: sondaki slash nedeniyle yönlendirme

  • /records/ yolu oluşturulursa /records isteği /records/ adresine yönlendirilir
  • Bu nedenle POST isteğinin gövdesi silinip istek GET’e dönüşebilir
  • Çözüm olarak POST /records/ yerine POST /records gibi API endpoint’leri kullanmak gerekir

sqlc ile veritabanı sorgu kodunun otomatik üretilmesi

  • ORM öğrenmeden SQL sorguları yazmayı sağlayan sqlc aracı keşfedildi
  • SQL sorguları yazıldığında bunlar otomatik olarak Go koduna dönüştürülüyor
  • ORM dokümantasyonuna bakmadan gerekli SQL sorgularını kolayca yazmak mümkün

sqlite optimizasyon ipuçları

  • Veritabanına yazma için ayrı bir nesne kullanın ve db.SetMaxOpenConns(1) ayarını uygulayın
  • Okuma hızını artırmak için yazma ve okuma amaçlı ayrı DB nesneleri kullanın
  • JOIN gerektirmeyen iki tabloyu ayrı veritabanlarına koyup bağımsız bağlantılarla kullanmak mümkün

Go 1.19’da GC bellek sınırı ayarlama

  • 256MB veya 512MB gibi görece düşük belleğe sahip VM’lerde tüm Go projelerini çalıştırınca uygulamanın sürekli OOM nedeniyle kapanması sorunu yaşandı
  • Garbage collector’ın varsayılan ayarı, mevcut heap boyutunun 2 katına kadar bellek ayrılmasına izin veriyor
  • Go 1.19’da, uygulama belirli bir bellek kullanımına ulaştığında GC çalıştırılmasını söyleyen bir yöntem eklendi
  • GC bellek sınırı 250MB olarak ayarlandıktan sonra OOM kapanmalarının sıklığı azaldı export GOMEMLIMIT=250MiB

Go ile web sitesi yapma nedenleri

  • Tek bir statik binary olarak dağıtım yapmak kolaydır
  • Production’da kullanılabilecek yerleşik bir web sunucusu vardır; WSGI vb. kurmaya gerek yoktur
  • Go toolchain’inin kurulumu ve kullanımı kolaydır
  • HTTP yanıtı göndermek basittir, bu da projeyi bakım açısından kolaylaştırır
  • Standart kütüphanede net/http bulunduğu için ek kütüphane kurmadan web sitesi yapılabilir
  • Sistem seviyesindeki işler de kolayca yapılabilir
  • Her şey projeyi kolay yönetilebilir kılacak şekilde tasarlanmış gibi görünüyor

Hâlâ çözülemeyen sorunlar

  • Go’da henüz çok yapılmamış şeyler var
    • HTML template render etme
    • Gerçek bir login sistemi uygulama
    • CSRF uygulama
  • Genel olarak güvenlik açısından hassas özelliklerin nasıl uygulanacağı iyi bilinmediği için login/CSRF gerektiren projelere başlanmıyor

Go’nun yeni özelliklerini görmek güzel

  • Bu yazıda bahsedilen iki Go özelliği (GOMEMLIMIT ve routing) son birkaç yıl içinde eklendi
  • Yeni Go sürümlerinin release note’larına daha fazla dikkat etmek gerekiyor gibi görünüyor

2 yorum

 
secret3056 2024-09-30

sqlc gerçekten harika.

 
GN⁺ 2024-09-30
Hacker News görüşleri
  • Go dili, bir proje üzerinde 5 gün çalışıp sonra onu 2 yıl boyunca bırakmış olsanız bile, geri dönüp sorunsuzca yeniden kod yazabilmenizi sağlıyor
  • Go dilini birkaç yıl önce öğrenmeye başladım ama pek değişmediği için uzun zaman geçse de hâlâ kullanışlı
  • Go ile web geliştirme yazısında embed paketinden bahsedilmemesi üzücü
    • Statik kaynakları tek bir binary içinde paketlemek çok kullanışlı
  • Veritabanı transaction'ları başarısız olacak şekilde tasarlandığı için her zaman retry loop kullanılmalı
    • Transaction loop'una iptal edilebilmesi için Context eklemek iyi olur
  • sqlc bazı önemli kısıtlar ve küçük kullanım zorlukları içeriyor; kullanmadan önce issue listesini kontrol etmekte fayda var
    • Dinamik sorgular, bire-çok ilişkiler, embedded CTE'ler, bileşik tipler vb. desteklenmiyor
    • Basit ihtiyaçlar için uygun ama karmaşık işler için manuel yaklaşım gerekiyor
  • Go'yu container içinde çalıştırırken CPU throttling'den kaçınmak için GOMAXPROCS doğru ayarlanmalı
  • GOMEMLIMIT kullanmak GC konusunda daha az endişe duymanızı sağlayabilir
    • Kubernetes veya Docker kullanırken bunu otomatik ayarlamak mümkün
  • html/template garip ve birçok sorunu var, bu yüzden kullanmamak daha iyi
    • Onun yerine Templ tercih ediliyor
  • Routing'den bahsedilmesi sevindirici
    • Uzun zamandır mux kullanmaya alışmıştım ama yeni sürüm özelliklerine dikkat etmemiştim
  • Yeni iş yerinde bir aydır Go kullanıyorum ama sevmiyorum
    • Go sanki son 20 yıldaki dil geliştirmelerinden hiçbir şey öğrenmemiş gibi
    • nil sorunu yüzünden basit işler bile karmaşıklaşıyor
  • SQLite kullanırken tek thread'li bir writer pool ve ayrı bir read pool kullanmak iyi olur
    • Eşzamanlılığı artırmak için BEGIN CONCURRENT kullanılabilir
  • Go'nun sadeliğini ve framework bağımlılığı olmamasını seviyorum
    • Sadece standart kütüphane ve kendini kanıtlamış üçüncü taraf kütüphanelerle bile harika şeyler yapılabilir
    • Web uygulaması ya da CLI aracı geliştirirken Go uygun bir seçim
    • Açık hata işlemeyi seviyorum
    • Büyük bir Go hayranıyım