18 Ağustos 2023 Cuma

Web Socket ve AWS ELB/ALB Problemi

    S.A. Arkadaşlar,
    Bugün farklı sayılabilecek bir konu ile ilgili bazı notlarımızı paylaşmak istiyorum. Elektrikli şarj istasyonu projesini geliştirdiğimiz süreçte IoT ile yakından çalışma fırsatımız oldu. Cihaz ile web socket üzerinden OCPP protokolü ile konuşuyorduk, fakat belirli aralıklarla socket tarafında kesinti olduğunu fark ettik, bunu nasıl çözdüğümüz ilginizi çekiyorsa buyurun başlayalım.

    Fiziksel cihazlarla çalışmanın birçok zorluğu vardır. Bu zorluklarından bir tanesi de cihaz ile ilgili testler yaptığınızda cihazın yanında bulunmanız veya en azından ulaşacağınız birilerinin yanında olması gerekir. Biz de buradaki bağımlılığı minimize etmek için node-red kullanmaya karar verdik. Node-red en basit haliyle cihazı mock'luyor gibi düşünebilirsiniz (Aslında sanal bir istasyon görevi görüyor). Bizler fiziksel cihaza belirli komutlar gönderdiğimizde aldığımız cevapları node-red üzerinden işletiyoruz. Gerçek cihazın bize davrandığı gibi davranmasını sağlıyoruz. Bu da bizim cihaza olan bağımlılığımızı azaltıyor.

https://github.com/node-red/node-red

    Bizler node-red üzerinden gerekli ayarları yapıp akışı simüle etmeye çalıştığımızda yukarıda da belirttiğimiz gibi belirli aralıklarla bağlantının koptuğunu tespit ettik. Bildiğiniz üzere socket mantığına göre bağlantının kesilmemesi gerekiyor, fakat node-red üzerinde bir yerleri gözden kaçırmış olabiliriz diye üzerinde çok durmadık. Node-red'i yeniden başlatarak bu problemi geçici olarak çözüyorduk. Cihazla testlere başladığımız ise aynı problemle yeniden karşılaştık, burada da cihazı yeniden başlattığımızda problemin çözüldüğünü fark ediyorduk, fakat bu tabii ki gerçek hayatta bizim için çözüm olmayacaktı. 

    Problemi çözmek için ekipçe toplandık. Masstransit ile asenkron bir iletişim kurgulamıştık, problemin rabbitmq yüzünden olabileceğini düşündük, çünkü burada dönem dönem verilerin istenildiği gibi akmadığını fark ettik. Bunu managed olarak AWS üzerinden çalıştırmaya başladık, fakat maalesef bu da bizim için bir çözüm olmadı (aslında bir problemimizi çözmüştü ama asıl odaklandığımız problemi çözmedi). Bu arada bu sorunların local'de değil, sadece test ortamında olduğunu fark ettik. Bunun network yüzünden olabileceğinden şüphelendik. Diğer tüm projelerimizde olduğu gibi bu projemizde de AWS ELB (Elastic Load Balance) kullanıyorduk. Orada olmayan problem burada neden yaşanıyor olabilirdi dediğimizde ise diğer projeler REST API iken bu projemizin ise socket projesi olduğu gerçeğini ve bunun probleme sebep olup olmayacağını araştırmaya karar verdik. Yaptığımız araştırmalar sonucu AWS ALB (Application Load Balance)'nin socket desteği olduğunu öğrenmiş olduk ve bu yöndeki değişiklikler platform ekibimiz tarafından tamamlandı. Ve tam da istediğimiz gibi oldu. Artık socket ile ilgili herhangi bir kopma vs gerçekleşmeden cihazımız ile sürekli olarak iletişim halinde kalabiliyorduk. Zor ve stresli bir süreci bu şekilde atlatarak rahatça bir nefes almış olduk.

    Yazıyı bir ayet-i kerime ile bitirelim.

"Zorlukla beraber kolaylık vardır. Evet, zorlukla beraber kolaylık vardır." (İnşirah, 94/5-6)


Hiç yorum yok:

Yorum Gönder