19 Kasım 2024 Salı

Socket Programlama ve GCP'deki Problemler

    Selamün Aleyküm Arkadaşlar,

    Bugün aslında uzun süre önce karşılaştığımız ama bir türlü yazıya dökemediğim bir problemden bahsediyor olacağım. Daha önce AWS'den GCP'ye geçişteki sancılardan bahsetmiştim. Yine benzer bir konu ancak bu seferki konumuz websocket ile imtihanımız. Bu imtihan gerçekten çok yıpratıcı oldu çünkü sitemin kalbinin attığı yerde timeout hatası alıp gerçekten can sıkıcı bir olaydı. Gelin birlikte ayrıntılarına bakalım.

     Yukarıda bahsettiğimiz yazıya şimdi tekrar göz attığımda bir yerde 1 iyi 1 kötü haberimiz var demişim. Bugün de tam o kötü haberden bahsedeceğim. O yazıyı yazdığımda problemin bu kadar ciddi olduğunu anlamamıştık maalesef. Çünkü test ortamında şarj işlemlerini başarıyla yapıyorduk. Sistemi canlıya aldığımızda da karşılaştığımız hataları çözmüştük. Her şey yolunda gibi gözüküyordu. Yani canlıdaki testlerimiz de güzel gidiyordu, ancak bahsettiğimiz gibi belirli dönemlerde birinci denemede işlemin başarısız olup ikincisinde veya sonraki denemelerde başarılı olmasını anlık kopmalar kaynaklı olabilir deyip yolumuza devam etmiştik (IoT ile çalışmak zor iş, fiziksel cihazlarda bazen böyle kabullenmeler yapıyoruz). Tüm cihazlar sahaya çıkınca cihazlar servis dışı olmuyor diye mutlu olduk ama müşterilerden başarısız işlemler şikayetleri artmaya başladı bu sefer de...

    Bu konuyu araştırmaya başladığımda ilk bu yazıyla karşılaştım. Hatta bu problemle karşılaşmadan bu yazıyı gördüm. İçimden ne kadar da iddialı bir başlık dedim. WebSocket için asla GCP kullanmayın demiş arkadaş, duyduğunuzda size de çok iddialı gelmiyor mu? Başlık dikkat çekici olsun diye yazılmıştır diye düşünmüştüm. Yazıyı okuduğumda zehri vermişti ama yok ya umarım yanılıyordur dedim, her ne kadar tamamen aynı konulardan müzdarip olmasak da biz de genel itibariyle çok memnun kalmadık...

    Ayrıca websocket scale etmenin farklı zorluklarıyla ilgili şu yazıya da göz atmanızı naçizane öneririm. Bu konun şöyle bir önemi var. Birden fazla instance ayağa kaldırdığınız socket bağlantısı koptuğunda aynı bağlantının aynı instance ile tekrar kuracağının garantisi verilmiyor. GCP bunu yapacağını söylüyor ama garanti veremem diyor. Oluşan kopma sonrası cihaz ile konuşan instance aynı cihazı alamadığında bizim süreçte sıkıntılar çıkmaktaydı. Bunu kendimiz de handle etmek için redis üzerinden bazı geliştirmeler yaptık, ancak bu taraftaki geliştirmeler askıya almak durumunda kalınca geçici çözüm olarak tek instance kullanmaya karar verdik (bu konu biraz eski, şimdi yazıyorum). Cihazlarımız ve gelen istekler çok yük altında olmadığı için bu bizim için çok büyük sorun oluşturmadı aslında ancak release çıktığımız durumlarda bütün cihazların socket bağlantısını koparmasını bekliyorduk. Gün içinde çıkılan releaseler yerini gece yapılan release'lere bıraktı maalesef.

    Konulardan ise Amazon tarafında varsayılan olarak ayarlanan ancak Google tarafında daha tasarruflu olsun diye bir instance istek gelmediğinde onu uyku moduna alıyordu. Şu ışıklarda bekleyen araçların kendilerini askıya aldığı mod benzeri bir şey olarak düşünebilrsiniz. İlk isteği attığımızda servislerden 3-5 saniye civarında bize cevap dönerken sonraki denemelerde milisaniye civarında cevaplar dönmeye başlıyordu. Her defasında aynı şeyler olunca burada bir konfigurasyon eksikliği olduğunu ısrarla söyledik. Platform ekibi ile birlikte konuya eğildiğimizde instance her zaman bize tahsis edilmesini ve ayakta olmasını sağlayarak bu problemi başarılı bir şekilde çözmüştük. Bu bize derin nefes aldırdı.

    Konu hareretlenmiş iken bizim asıl karşılaştığımız problem cihazların 5 dakika içinde timeout düşmesi idi. Socket bağlantısı koptuğunda tekrardan el sıkışmak için iki taraf hazır olması gerekirken, cihazların anlık kopma sonrası kendine gelmesi yaklaşık 2-3dk alıyordu, bazı durumlarda bu süre daha da artıyordu. Bunun sebebini üretici firma ile iletişime geçerek sorsak da bu konuyu maalesef netleştiremedik. Çünkü onlar kendilerinde bu hatayı repro edemediklerini söylüyorlardı, haklı olabilirler çünkü biz de Amazon'da karşılaşmıyorduk. Neyse konuya dönecek olursa 5dk'da bir timeout sürelerini loglardan görrünce bunu araştırdığımızda GCP tarafında timeout süresini 60dk'ya çıktığını gördük ve en azından bu problemi kısmen aştık. Google ile iletişime geçip bu süreyi uzatmanın mümkün olup olmadığını sorduğumuzda bunun mümkün olmadığını söylediler maalesef, ancak bu ayar Amazon'da sınırsız olarak ayarlanmıştı. O yüzden de bu bahsettiğimiz problemi orada görmüyormuşuz.     

    Peki çözüm olarak ne mi yaptık, dediğim gibi süresi 60 dakikaya çıkardık. 2-3 dakika içerisinde cihaz kendine geliyor demiştik ama bazen kullanıcılar ısrarla komut atmaya devam ettiğinde bu süre maalesef 8-10 dakika seviylerine çıkabiliyordu. Ekiple konuştuktan sonra kullanıcıdan gelen istekleri belirli sürelerle kendimiz yapamaya karar verdik ve belirli bir istekten sonra cevap gelmezse kullanıcı biraz bekletmenin en azındna kullanıcı deneyimi açısından daha doğru olacağına karar verdik. Çünkü aksi takdirde kullanıcı cihaz başında deneme yapmaya devam ediyor, hem şirkete olan güven sarsılabiliyor hem de cihazın bağlanma süresini uzatıyordu. Yukarıdaki geliştirmeleri tamamladıktan sonra başarısız işlemlerin sayısı çok önemli ölçüde azaltmayı başardık. Günün sonunda daha yapılacak şeyler vardır ancak genel olarak bu projedeki geliştirmeleri bu seviyede bırakma kararı aldığımız için biz de bu konuyu burada bitiriyoruz. Yarım kalan bir hikayemiz oldu diyebiliriz belki de, bir gün tamamlanacak...

    Toparlayacak olursak platform geçişlerinin kendilerine göre birçok derdi, tasası oluyor. Çok sık yapılan işler olmasa da bizler burada çok acılar çektik. Özellikle geliştirici ekip olarak Amazon ortamında çalışan kodun Google ortamında farklı problemler oluşturması bizim canımı çok sıkıyordu. Platform ekibi ile birlikte bunun için elimizdek geleni yaptık. Çok acı çeksek de sadece kodu yazmanın yetmediği bu gibi durumlara çok yakından şahitlik ederek çok farklı tecrübe edinme fırsatı bulmuş olduk. Acısıyla tatlısıyla tüm ekibe güzel bir deneyim oldu. Özellikle birlikte çokça yıprandığımız Ceyda'ya ayrıca teşekkürlerimi iletirim.

    Yazıyı aşağıdaki hadis-i şerif ile bitirelim.

"Hiçbir mümin yoktur ki başına bir dert, sıkıntı veya keder gelsin de Allah onun günahlarını bu sıkıntılar sayesinde affetmesin." (Buhârî, Merdâ, 1; Müslim, Birr, 52)



Hiç yorum yok:

Yorum Gönder