Golang ile Pub/Sub Pattern
Herkese merhabalar, microservis’in önemli konularını incelemeye devam ediyoruz.
Bu yazımızda pub/sub pattern nedir, nasıl çalışır sorularına cevap arayacağız. Golang ile kendimize ufak bir pub/sub pattern yapacağız.
Pub/Sub Deseni Nedir?
Pub/sub pattern, yayıncı (publisher) ve aboneler (subscriber) arasında asenkron bir mesajlaşma modelidir. Yayıncı, belirli bir konu (topic) üzerinde mesaj yayınlar ve aboneler bu konulara abone olur.
Yayıncı, mesajları doğrudan belirli bir aboneye göndermek yerine, ilgili konulara yayınlar. Aboneler, ilgilendikleri konulara abone olarak sadece bu konulara ait mesajları alırlar. Bu sayede mesaj trafiği azalır ve daha etkili bir iletişim sağlanır.
Pub/sub pattern, özellikle dağıtık sistemler ve mikro servislerde yaygın bir şekilde kullanılır. Bu pattern, birbirleriyle bağlantılı olan sistemler arasındaki mesajlaşmayı kolaylaştırır ve iletişim kanallarının yönetimini basitleştirir.
Birkaç örnek ile bunu pekiştirelim.
Elon Musk’ın sahibi olduğu Tesla’nın araçları, pub/sub pattern’ı kullanarak birbirleriyle ve Tesla’nın bulut tabanlı arka plan hizmetleriyle iletişim kurarlar. Örneğin; bir Tesla aracı, şarj seviyesi hakkında bilgiyi bulut hizmetine gönderir ve diğer Tesla araçları da bu bilgiyi ilgili konuya abone olarak alırlar. Bu sayede, araçlar arasında gerçek zamanlı bir şarj seviyesi güncellemesi sağlanır.
Dezavantajları
İletişim karmaşıklığı: Pub/Sub mimarisi, birçok bileşenin birbiriyle iletişim kurduğu karmaşık bir yapıya sahiptir. Bu yazılımcıların daha fazla dikkat ve çaba harcamalarını gerektirir.
Güvenlik sorunları: Pub/Sub modeli, mesajların birçok noktada işlenmesini içerir. Bu güvenlik açıklarına neden olabilir.
Performans sorunları: Yoğun trafik durumunda, Pub/Sub modelinin performansı düşebilir ve sistem daha az verimli hale gelebilir.
Kaynak tüketimi: Pub/Sub modeli, birçok kaynağın kullanımını gerektirebilir. Bu maliyetleri artırabilir ve kaynakların daha yoğun kullanımına neden olabilir.
Yönetim zorlukları: Pub/Sub modeli, birçok bileşeni içeren karmaşık bir yapıya sahiptir. Bu yönetim ve bakım konusunda zorluklar yaratabilir.
Popüler pub/sub teknolojileri
Apache Kafka:
Apache Kafka, yüksek performanslı, dağıtılmış bir pub/sub mesajlaşma sistemi olarak bilinir. Kafka, büyük ölçekli uygulamalar için tasarlanmıştır ve milyarlarca mesajı güvenli bir şekilde işleyebilir.
RabbitMQ:
RabbitMQ, açık kaynaklı bir mesajlaşma yazılımıdır ve AMQP (Advanced Message Queuing Protocol) protokolünü kullanır. RabbitMQ, birçok programlama diliyle uyumludur ve farklı türde mesajların iletilmesini destekler.
Google Cloud Pub/Sub:
Google Cloud Pub/Sub, Google Cloud Platform’un bir parçası olarak sunulan bir pub/sub aracıdır. Yüksek performans, düşük gecikme süresi ve yüksek ölçeklenebilirlik özellikleri ile bilinir.
Amazon Simple Notification Service (SNS):
Amazon SNS, Amazon Web Services’in bir parçası olarak sunulan bir pub/sub aracıdır. SNS, yüksek performans, düşük gecikme süresi ve ölçeklenebilirlik özellikleri ile bilinir.
En çok kullanılan pub/sub teknolojileri hakkında kısa bilgiler öğrendik, bu teknolojilerin karşılaştırması, avantajları ve dezavantajları çok daha detaylıdır. Peki biz bu teknolojileri kullanmadan kendimiz bir şeyler yapabilir miyiz ?
Ufak bir örnek ile devam edelim
Bu örnekteki senaryomuz şu şekilde, kullanıcıdan gelen bir mesajı hem mail hemde sms servisi dinliyor ve ikisi de kendi içlerinde gönderme işlemlerini tamamlıyorlar.
Bir pub/sub
pattern yazacaksanız golang de bulunan channel
ve context
ile çok daha efektif işler yapabilirsiniz channellar ile yaptığım bir pub/sub reposunu buradan inceleyebilirsiniz.
ilk olarak bir “Subscriber” interface tanımlayalım.
“Notify()
” metodunu barındıran ve publisher a abone olan tüm servisler bu method sayesinde gelen eventleri handle edebilecekler.
Ikinici adım olarak “Publisher
” larımızı oluşturalım. Bunun için bir struct tanımlıyorum ve içerisinde Subscriber arrayı olacak.
Publisher nesnesine ait 3 adet metodumuz bulunmaktadır. Yeni bir subscriber ekler, var olan subscriber ı siler ve bütün subscriber lara event gönderir.
Publisher kısmını tamamladıktan sonra geriye bir kaç tane subscriber servis yazmak kalıyor.
Yukarıdaki kodda 2 adet subscriber servisimiz bulunuyor. Bunlardan birisi EmailSubscriber diğeri SMSSubscriber. Her iki servis de “Notify()” metodunu implement ettiğinden gelen mesajları handle edebilirler.
Herşey çok güzel sıra geldi yazdığımız kodu çalıştırmaya.
main.go
dosyamızda oluşturduğumuz subscriber nesnelerimizi publisher servisimize subscriber olarak ekliyoruz ve gönderilen mesajları iki servis de handle ediyor.
Go dilinde pub/sub pattern’i, yayıncı ve aboneler arasında etkili bir iletişim sağlar ve veri paylaşımı ve olay tabanlı senaryolarda sıklıkla kullanılır. Bu deseni uygulamak, güçlü ve esnek sistemler oluşturmanıza olanak tanır ve Go dilinin kolaylığı sayesinde oldukça basittir. Umarım bu yazı, pub/sub pattern’inin Go dilinde nasıl kullanılabileceği hakkında size fikir vermiştir. ❤