ev charging management
elektrikli şarj istasyonu projesi, 2024 ortalarında başladığımız ve 1.5 yıldan uzun süre çalıştığımız bir elektrikli araç şarj istasyonu yönetim platformuydu. şirkette mevcut monolit bir sistem vardı, fakat biz bu yapıdan bağımsız olarak sıfırdan yeni bir mikroservis tabanlı platform geliştirdik. amaç; şarj istasyonları, charge point’ler, şarj oturumları, fiyatlandırma, mobil uygulama ve portal ihtiyaçlarını daha esnek bir backend mimarisiyle yönetebilmekti.
bu projede cihaz haberleşmesi için aws iot core kullandık. şarj cihazları doğrudan aws iot core ile haberleşiyordu. biz de aws tarafına düşen mesajları sqs kuyrukları üzerinden consumer servisleriyle alıp sistem içinde işliyorduk.
consume ettiğimiz mesajları log ve takip ihtiyaçları için elasticsearch’e yazıyorduk. cihazların son durumlarının platform üzerinden takip edilebilmesi için de bu mesajları rabbitmq direct exchange üzerinden ilgili mikroservislere yönlendiriyorduk.
ayrıca son kullanıcıların aktif şarj oturumlarını mobil uygulama ve portal üzerinden anlık takip edebilmesi gerekiyordu. bunun için ilgili charge point mesajlarını, charge point’e ait exchange üzerinden rabbitmq fanout ile broadcast ediyorduk. mobil ve portal uygulamaları ise kendi bff servislerine websocket bağlantısı açarak bu mesaj akışını anlık olarak alıyordu.
tenant bazlı bir yapı kurguladık. farklı whitelabel’lar kendi alt operatörleriyle birlikte aynı platforma dahil olabiliyor, aynı mobil uygulamayı farklı logo, marka bilgisi ve kullanıcı havuzlarıyla kullanabiliyordu.
authentication tarafında duende identityserver kullandık. kullanıcı yönetimini tenant ve client bazlı ayırarak farklı whitelabel’ların kendi kullanıcı havuzlarıyla çalışabilmesini sağladık. portal ve mobil kullanıcıları farklı kullanıcı gruplarında tutulabilse de, aynı tenant hiyerarşisi üzerinden yetkili oldukları şarj istasyonu ve charge point verilerine erişebiliyordu.
harita listeleme tarafında aws opensearch kullandık. elasticsearch tabanlı bu yapıyı özellikle nosql veri ihtiyacı olan senaryolarda tercih ettik. kullanıcı haritayı açtığında, şarj ünitelerine ait pin verilerini hızlı şekilde listeleyebilmemizi sağladı.
servisler arası iletişimde rabbitmq direct exchange kullanıyorduk. her mikroservisin kendi veritabanı vardı ve veritabanı olarak postgresql kullanılıyordu.
distributed cache tarafında redis kullandık. özellikle şarj başlatma ve bitirme akışlarında bizim için kritik bir rolü vardı. bu akışlar büyük ölçüde asenkron ilerlediği için idempotency, doğru kullanıcıyı doğru connector ve transaction ile eşleştirme gibi konularda redis’ten faydalandık.
şarj başlatma sürecinde charge point, connector, rfid kart ve kullanıcı ilişkisini doğru şekilde yönetmek gerekiyordu. redis üzerinde geçici state tutarak, cihazdan gelen asenkron mesajlarla sistemde oluşturulan transaction bilgisini eşleştirebiliyorduk. böylece şarjın doğru connector’da başlaması ve doğru kullanıcıya ait transaction ile ilişkilendirilmesi sağlanıyordu.
bu akışların merkezinde corebff adında bir servis vardı. corebff, mobilbff ve portalbff gibi servislerden gelen istekleri karşılıyor, gerektiğinde diğer mikroservislerden senkron olarak veri topluyor ve cihazlarla ilgili transaction akışlarında aracı katman olarak çalışıyordu. cihazdan gelen bazı mesajlar lambda fonksiyonları üzerinden dinleniyor, ardından corebff aracılığıyla sistemde oluşturulan transaction bilgileri ilgili cihaza iletiliyordu.