Bağlam
Kariyerimin erken döneminde, bir IoT şirketinin ana ürünü olan platformun ön yüz mimarisini kurdum, geliştirdim ve devreye aldım. Bu vaka analizini burada tutuyorum çünkü bugün danışmanlıkta kullandığım birkaç ilkeyi ilk defa orada öğrendim.
Problem
IoT sistemlerinde veri sorunu değil, veri fazlası sorunu vardır. Sahadaki sensörler durmadan ölçüm gönderir. Ham haliyle bu veri kimseye bir şey söylemez; birisinin bakıp “burada bir sorun var” diyebilmesi gerekir.
Ön yüzün işi bu yüzden grafik çizmek değil, sürekli akan bir veri akışını insanın karar verebileceği bir şekle sokmaktır.
Yaklaşım
Akan veriyi arayüzden ayırmak
Gerçek zamanlı veri akışını doğrudan arayüz bileşenlerine bağlamak, çalışan ama kısa sürede yönetilemez hale gelen bir yapı üretir. Veri akışını ayrı bir katmanda topladık; arayüz o katmandan okur. Yeni bir sensör tipi eklendiğinde arayüzün tamamına dokunmak gerekmez.
Kuyruk, arayüzü korur
Sensörden gelen yükün doğrudan panele vurması, yoğun anda arayüzü kilitler. RabbitMQ ile araya kuyruk konması, sistemin yük altında yavaşlamasını sağladı, çökmesini değil. Bu ikisi arasındaki fark, üretimde çalışan sistemle demo arasındaki farktır.
Sıcak veriyi ayrı tutmak
Anlık gösterilecek son değerler Redis üzerinde tutuldu, tarihsel veri MongoDB’de. Kullanıcı panele girdiğinde bekleyeceği yer, veritabanının geçmiş kayıtları taraması değil.
Öğrenilenler
Mimari kararı erken vermek gerekir. Gerçek zamanlı veri akışının nasıl yönetileceği, ilk ekran çizilmeden önce kararlaştırılmalı. Sonradan düzeltmek, yazılanın büyük kısmını atmak demek.
Devreye almak, geliştirmenin yarısıdır. Projeyi yazmak kadar sunucuya kurmak, çalışır halde tutmak ve bozulduğunda görebilmek de işin parçası. Bunu erken öğrenmiş olmam, sonraki bütün projelerde işime yaradı.
Kullanıcı grafiği değil, cevabı arar. “Sıcaklık eğrisi” değil “bu makinede sorun var mı” sorusunun cevabı gösterilmeli. İyi arayüz, veriyi değil kararı sunar.
Bu proje 2019 yılında Skysens bünyesinde yazılım geliştirici olarak yürütülmüştür.
Kullanılan teknolojiler
- React.js
- Node.js
- Express.js
- MongoDB
- Redis
- RabbitMQ