Go, ayakta kalması gereken servisler için.
Küçük ikili dosyalar, öngörülebilir gecikme, bir işi yapmanın tek bir yolu. Yüksek işlem hacimli API’ler, olay tüketicileri, ağ geçitleri ve Kubernetes çevresindeki platform araçları için AI-native Go mühendisleri.
- Go
- gRPC
- Kafka
- PostgreSQL
- Redis
- Kubernetes
Tek işi olan ve bunu yıllarca yüksek hacimde yapan servisler için.
Go, bir servisin tek bir işi olduğunda ve bu işi yıllarca yüksek hacimde yapması gerektiğinde seçtiğimiz dildir: bir API ağ geçidi, sürekli bir olay akışını işleyen bir Kafka tüketicisi, kümedeki her pod’un yanında duran bir exporter. Tek bir statik ikili dosyaya derlenir, hızlı başlar, bellek kullanımı öngörülebilirdir ve eşzamanlılık modeli — goroutine’ler ve kanallar — bu iş yüklerinin gerçekte nasıl davrandığına uyar.
Daha az göze çarpan avantajı, Go kod tabanlarının okunabilir kalmasıdır. Dil küçüktür, biçimlendirici isteğe bağlı değildir ve bir şeyi yazmanın genellikle tek bir yerleşik yolu vardır. Kıdemli bir mühendis, daha önce hiç görmediği bir Go servisini okuyup riskin nerede olduğunu görebilir. Kendisini yazan ekipten daha uzun ömürlü olan sistemlerde bu, ifade gücünden daha önemlidir.
Kullanmadığımız yerler: Go; yüzlerce varlık tipi ve zengin doğrulama içeren, alan ağırlıklı iş uygulamaları için zayıf bir seçimdir — orada Java ya da .NET daha az kodla daha fazla yapı verir; React ve Next.js alanı olan web ön yüzü için de öyledir; veri bilimi ve ML ise Python tarafında kalır.
Go ile geliştirdiğimiz altı iş.
Yüksek işlem hacimli API’ler
net/http veya connect-go ile yazılan, yüksek istek hacimlerini karşılayacak biçimde kurgulanan REST ve gRPC servisleri; p99 gecikmesi test edilen bir gereksinim olarak tanımlı.
Olay tüketicileri ve akış işleyicileri
Açık offset yönetimi, idempotent işleyiciler, dead-letter konuları ve geri basınç içeren Kafka tüketicileri — kurduğumuz olay tabanlı yapıların kalbi.
API ağ geçitleri ve edge proxy’leri
Hazır bir proxy’nin ihtiyacınız olan politikayı ifade edemediği yerlerde özel ağ geçitleri, kimlik doğrulama sidecar’ları ve hız sınırlayıcılar.
Kubernetes operatörleri ve platform araçları
DevOps & Cloud kapsamında birlikte çalıştığımız platform ekipleri için client-go ve controller-runtime ile geliştirilen denetleyiciler, admission webhook’ları, CLI’lar ve dahili araçlar.
Entegrasyon adaptörleri
SAP’ye, telematik akışlarına, ödeme altyapılarına ve taşıyıcı API’lerine bağlanan uzun ömürlü bağlayıcılar — karşı taraf bir süreliğine kaybolup birikmiş bir iş listesiyle geri döndüğünde de ayakta kalır.
Geçiş köprüleri
Bir yeniden mühendislik programı boyunca legacy sistemle onun yerini alacak sistemin yan yana çalışmasını sağlayan strangler deseni cepheleri ve CDC tüketicileri.
Ne zaman seçmeli.
Servis altyapı niteliğindeyse Go’yu seçin: yüksek istek hacmi, sıkı gecikme hedefleri, uzun süre çalışan süreçler, öğrenilecek bir framework olmadan işletmesi gereken küçük ekipler. Ağ geçitlerine, tüketicilere, zamanlayıcılara, exporter’lara, CLI’lara ve bir Kubernetes kümesinin içinde ya da yanında yaşayan her şeye uyar. Hafif konteyner isteyen kurumlara da uyar — bir Go servisinin bellek kullanımı düşüktür.
Sistem ağırlıklı olarak iş kurallarından ve ekranlardan oluşuyorsa — bir sigorta poliçe yönetimi, bir sadakat kuralları motoru, bir satın alma iş akışı — başka bir yere bakın; orada daha zengin bir tip sistemi ve olgun bir ORM işi kolaylaştırır. Ekibinizin Go deneyimi yoksa ve servis performans açısından kritik değilse de başka bir yere bakın; ekibin hâlihazırda hâkim olduğu bir dil, teslim baskısı altında öğrenmek zorunda kalacağı daha hızlı bir dile üstün gelir.
Context’i ve bütçesi olan bir tüketici döngüsü.
func (c *Consumer) Run(ctx context.Context) error {
for {
msg, err := c.reader.FetchMessage(ctx)
if err != nil { return fmt.Errorf("fetch: %w", err) }
// Each message gets its own deadline; a stuck handler cannot stall the partition
hctx, cancel := context.WithTimeout(ctx, 2*time.Second)
err = c.handle(hctx, msg)
cancel()
if errors.Is(err, ErrUnprocessable) { c.deadLetter(ctx, msg, err); err = nil }
if err != nil { return err }
+ c.metrics.Processed.WithLabelValues(msg.Topic).Inc()
if err := c.reader.CommitMessages(ctx, msg); err != nil { return err }
}
}Olay tabanlı bir yapıda Go nerede durur.
Teslim ettiğimiz Go servislerinde bulunanlar.
- Her yerde context. Her G/Ç çağrısı, süre sınırı olan bir
context.Contextalır; böylece iptal ve zaman aşımları goroutine sızdırmak yerine zincir boyunca yayılır. - CI’da tablo tabanlı testler ve race detector. Entegrasyon testleri, veritabanı taklitlerine değil, Testcontainers içindeki gerçek bağımlılıklara karşı çalışır.
- Hatalar sarmalanır, yutulmaz. Çağıranların dallandığı durumlar için sentinel hatalarla
%wsarmalama ve göz ardı edilen bir hatada build’i düşüren bir lint kuralı. - Yerleşik gözlemlenebilirlik: OpenTelemetry izleri, makul kardinaliteye sahip Prometheus metrikleri ve istek kimliğini taşıyan
slogile yapılandırılmış loglar. - SIGTERM geldiğinde devam eden işi boşaltan düzgün kapanma; böylece kademeli bir devreye almada istek düşmesi ve olayların iki kez işlenmesi riski azalır.
- Statik, distroless imajlar. Çok aşamalı build’ler, root olmayan kullanıcı, shell yok, üretilen SBOM ve bir registry’ye ulaşmadan taranan imajlar.
- Sabitlenmiş yapılandırmayla golangci-lint — vet, staticcheck, errcheck, gosec ve küçük bir proje kuralları kümesi, her pull request’te zorunlu tutulur.
- Belirtilen bir hedefe göre yük testi. Depoda, servisin README dosyasında yazan p99 ve işlem hacmi hedeflerini doğrulayan bir k6 senaryosu.
Kodun yanında genellikle ne teslim edilir.
- Belgelenmiş paket düzeni ve bağımlılık yönüyle servis başına tek bir Go modülü
- Tüketen ekipler için üretilmiş istemcilerle birlikte Protobuf veya OpenAPI sözleşmeleri
- Dockerfile, Helm chart veya Kustomize overlay’leri ve bunları yayımlayan CI hattı
- Dört altın sinyal için panolar ve uyarı kuralları, kod olarak dışa aktarılmış
- Yük testi senaryoları ve servisin kapasitesini belirleyen sonuçlar
- Devreye alma, geri alma, tüketicileri yeniden dengeleme ve bir konuyu yeniden oynatmayı kapsayan bir runbook
Sık sorulan sorular
net/http paketi HTTP servislerinin çoğunu karşılıyor; chi veya Echo’yu yalnızca proje onların middleware ekosistemine ihtiyaç duyduğunda ekliyoruz. gRPC için resmi kütüphaneleri ya da connect-go’yu kullanıyoruz. İstek yaşam döngüsünü gizleyen framework’ler, hataları da gizleme eğilimindedir.Komşu teknoloji yığınları ve onları kullanan hizmetler.
Hızlı ve öngörülebilir olmak zorunda olan servis için.
Bize işlem hacmini ve gecikme hedefini söyleyin. Bir Go mühendisi okur ve nasıl yaklaşacağımızı yazılı olarak iletir.