Açık kaynak topluluk oluşturucu TSBOARD’un yeni backend’i: GOAPI
(github.com/sirini)Yaklaşık 7 ay önce TSBOARD projesini ilk kez tanıtmıştım.
O zaman hem frontend hem de backend TypeScript ile yazılmıştı ve backend’i çalıştırmak için Bun runtime’ı kullanılıyordu.
Ancak çeşitli nedenlerle backend’i baştan yeniden yapmak zorunda kaldım ve mevcut TSBOARD projesinden ayrılmış bir GitHub deposuna yükleyip yayımlıyorum. Bu yeni backend Go diliyle yazıldı ve TSBOARD’un resmi sürümünde ikili dosya biçiminde birlikte sunulacak.
Backend’i neden yeniden yaptım?
- Bun runtime gerçekten etkileyici bir performans gösteriyor. Ancak hepsi bir arada araç seti olarak tanıtılmasına rağmen paket yönetimi hâlâ npm’in seviyesine ulaşmış değil.
- Bu yüzden TSBOARD’u kullanmak için Node.js ve Bun olmak üzere iki ayrı runtime gerekiyordu. Hem karmaşıktı hem de kullanıcı açısından rahatsız ediciydi.
- Şimdi düzeltilmiş olsa da, ilk dönemlerde sanal CPU’da çalışmama sorunu yüzünden geliştirici olarak ben bile başka bir sunucuya taşıyamıyordum; bu ciddi bir sorundu.
- (Başkalarının da belirttiği gibi) orkestrasyon yapılabilir deniyor ama tek iş parçacığı kısıtını doğası gereği taşıyan bir JS runtime’ının sınırlarını aşarak birden fazla thread kullanmak istedim.
- Daha fazla tipe ihtiyacım vardı. TypeScript tek başına bu açlığı gidermeye yetmedi.
Neden Go dilini seçtim?
- Yeni backend’in 1) derlenebilir olması, 2) bellek yönetimini kendi başına halletmesi ve 3) ayrıca runtime benzeri bir şey kurmayı gerektirmemesi gerekiyordu.
- Rust, Kotlin, Python, PHP ve Go arasında düşündükten sonra, bu üç koşulun hepsini karşılayan ama benim için yeni olan Go dilini seçtim. (Üzgünüm PHP)
- En çok Go’nun sadeliğini beğendim; ayrıca TypeScript ile benzerlikleri de seçimde önemli bir etkendi. Özellikle eşzamanlılık yönetimi ve bellek yönetimi açısından diğer alternatiflere göre iyi bir tercih olduğunu düşünüyorum.
Go dilini kullanmak nasıldı?
- Sadece avantajlardan oluşan bir dil olmadığını Go da kanıtlıyor, bunu fark ettim.
if err != nil { }kesinlikle gerekli ama gerçekten çok yorucu. Bazentry catch finallyözlüyorum. - Muhtemelen
go-mysql-driverkaynaklı bir sorun ama DB I/O gibi darboğazların bulunduğu gerçek geliştirme ortamında o kadar da hızlı çalışmadı. (Burada GeekNews’e gönderdiğim yazıya bakın: https://tr.news.hada.io/topic?id=18048) - Örtük arayüz uygulaması hâlâ bana biraz garip geliyor.
implementsya daextendsgibi anahtar sözcükleri kullanmak istemediler mi? - Pointer’lar hoşuma gitti. Özellikle de belleğin ne zaman serbest bırakılacağını düşünmek zorunda olmamak!
- Çeşitli tipler, basit ama güçlü struct’lar ve slice’lar harika. Anahtar sözcük sayısı az olduğu için hızla öğrenip kullanabilmek en sevdiğim tarafı.
goanahtar sözcüğüyle sihir gibi hafif thread’ler kullanabilmek...! Çok mutluyum!
Backend’i JS runtime tabanından Go’ya geçirmenin ardından...?
- Böyle bir şeyi bir kez yapmak yeter de artar.
- DB I/O kısmını benchmark ederken çeşitli testler yaptım ama performans açısından bakınca aslında JS runtime ile Go ikilisi arasında büyük bir fark hissetmek zor. Örneğin JS tarafında çok kullanılan
sharpgörüntü kütüphanesi de sonuçtalibvipskullanıyor ve DB I/O’su olmayan web uygulaması da yok denecek kadar az. - Buna rağmen, çok zorlanmış olsam da iyi ki bu değişikliği yaptım diye düşünüyorum ve bundan sonra backend’de yalnızca Go kullanmayı planlıyorum.
- Bellek kullanımı gerçekten anlamlı ölçüde azalıyor. Elbette Rust ile geliştirilse daha fazla optimizasyon yapılabilir ama GC kullanabilmenin karşılığında bu seviye benim için fazlasıyla tatmin edici.
- Dilin sadeliği gerçekten çılgın seviyede iyi. Ezberlenmesi gereken anahtar sözcük sayısı az, kullanım kalıpları da çoğunlukla belli; bu yüzden öğrenmesi kolay. (Tabii iyi kullanmak ayrı mesele.) Çeşitli primitive type’ların hazır sunulmuş olması da çok hoşuma gitti.
- En tatmin edici nokta ise, derleme sonrasında yalnızca binary dosya varsa çalışmasının yeterli olması. Backend’i ayağa kaldırmak için ayrıca bir şey kurup sonra kodu onunla tekrar çalıştırmak zorunda kalmak artık istemediğim bir şey.
Nasıl kullanılır?
- Ne yazık ki Windows ortamı desteklenmiyor. Linux/Mac ortamında binary dosyayı çalıştırmanız gerekiyor.
- Kullandığınız sunucuda
libvipskütüphanesinin önceden kurulmuş olması gerekiyor. Çünkü binary, görüntü işleme için bu kütüphanenin işlevlerini kullanıyor. - Ayrıntılı bilgiler
README.mddosyasında açıklanmıştır.
Hâlâ çok eksiği var ve diğer geliştiricilerin değerli görüşlerini beklemeyi sürdürüyorum. GeekNight etkinliğinde çekingen davranmış olmam yüzünden kendime kızacak kadar oldum. Hata bildirimi, iyileştirme önerisi ya da farklı görüşlerin hepsi memnuniyetle karşılanır.
Bu yıl Aralık ayı özellikle ağır geçiyor ama yine de yeni yılda daha iyi bir geleceğin olmasını diliyorum. Uzun yazıyı okuduğunuz için teşekkür ederim. Son olarak, TSBOARD v1.0.0 sürüm notları bağlantısını aşağıda paylaşıyorum.
12 yorum
Damoang'da gördüm.
Umut vadeden bir CMS. Teşekkürler.
Ben de Damoang'da beni hatırlayan birilerinin olmasına şaşırdım. haha Beklentileri karşılayabilmek için daha çok çalışacağım! 😊
Faydalı!
Geç oldu ama yorumunuz için teşekkür ederim! 😃
Artıları ve eksileri var ama artı tarafında, standart/harici kütüphane kodunu değiştirmeden, başka birinin yaptığı bir implementasyonu kullanırken onun bir kısmını benim oluşturduğum bir
interfacegibi ele alabilmek bazen gerçekten avantajlı hissettiriyor. Tıpkı Java'dakiFunctionalInterfacegibi ya da duck typing'in derlemeli bir dile uygulanmış hâli gibi. Buna karşılıkimplements/extends'in mutlaka bildirildiği bir yöntemde, benim oluşturduğuminterfacee bağlamak için araya birAdapterimplementasyonu eklemek gerekiyor.Eksi tarafında ise,
interfacee metot eklerken/silerken/değiştirirken, diğer statik tiplemeli dillere kıyasla hatanın gösterildiği yer farklı olduğu için biraz kullanışsız oluyor.Ah, öyleymiş! Hiç aklıma gelmeyen bir avantajı varmış. Neyse ki hata mesajlarını sanırım
goplsmuydı? VS Code’un Go dil eklentisi iyi yakaladığı için, atladığım ya da yanlış uyguladığım şeyleri hızlıca bulabildim. Biraz daha alışınca ben de bir gün daha iyi kullanabileceğimi düşünüyorum. haha Yorumda açıklama yaptığınız için teşekkür ederim! Mutlu yıllar, yeni yılda bol şanslar~!Emeğinize sağlık! Ben de test sunucuma kurup deneyeceğim! 2025 yeni yılında da bol başarılar dilerim!
Teşekkürler! Test edin; eğer bir şey düzgün çalışmazsa ya da merak ettiğiniz bir nokta olursa lütfen istediğiniz zaman söyleyin! Mutlu yıllar~!
Destekliyorum~ 👍🏻
Desteğiniz için teşekkürler!!! Mutlu yıllar~!
Destekliyorum!
Teşekkürler!!! Mutlu yıllar!!