Go ile TCP üzerinde In Memory Database
Bu yazı Go ile TCP üzerinden konuşan iki uygulama içerecek.
İlk uygulamamız server olacak. Server basit bir veri tabanı olacak ve client’lardan gelen istekleri işleyecek. Client’lar veri tabanında bir kayıt eklemek/güncellemek etmek ister ise “SET” tipinde bir mesaj gönderecek veya veri tabanından bir kayıt almak isterler ise “GET” tipinde bir mesaj gönderip yanıt bekleyecekler. Kısacası bir rediscik yapacağım diyebiliriz.
Uygulamada kullanacağım iki modeli model dizini altında message.go adındaki dosyada barındıracağım.
Şimdi server tarafını yazmaya başlayalım.
Server’ımız 9091 portunu dinleyecek ve gelen her yeni bağlantıyı handleConnection fonksiyonuna gönderecek. handleConnection fonksiyonu ise gelen veriyi parçalayıp SET işlemimi yoksa GET işlemimi buna göre bir yanıt gönderecek.
server/server.go
Şimdi yukarıdaki kodu biraz inceleyelim. main içerisinde 9091 portunu dinlemeye başlıyoruz ve gelen her yeni bağlantıyı yeni bir goroutine ile yakalıyoruz.
handleConnection fonksiyonunda bağlantının datasını Read ile okuyoruz ve okunan data’nın uzunluğu kadarını alıyoruz. Bunu yapmamızın sebebi boş boş byte’ları kırpmak. Ben TCP iletişiminde veri yapısı olarak JSON kullanmayı tercih ettim çünkü canım öyle istedi. Bu nedenle gelen veriyi daha önce model.go içerisinde oluşturduğum Message modeline cast ettim.
Buradan sonra yapılacak tek şey mesajın tipini belirleyip istenilen işlemi yapmak ve bir mesaj göndermek. response fonksiyonu ile işlemin yanıtını client’a gönderiliyor.
Şimdi bir de client tarafına bakalım.
client/client.go
Client tarafımız da oldukça minimal. Veri tabanına bir veri yazılacağı zaman veya veri tabanından bir değer okunacağı zaman process fonksiyonu 9091 portuna yeni bir TCP bağlantısı yaratıyor ve SET/GET işlemine göre Message modelini doldurarak servera bu istei iletiyor. 44. satırda serverdan gelen isteği aynı server tarafındaki gibi parse ediyoruz ve yanıtı dönüyoruz.
Uygulamanın tam haline buradan ulaşılabilir.
https://github.com/bdemirpolat/inmemorydb
Çalıştırmak için ilk önce
go run server/server.go
Sonrasında
go run client/client.go
Client uygulamamız şu çıktıyı üretiyorsa tamamdır
{true }
{true AHMET}
{true }
{true MEHMET}