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 ve Golang ile pub/sub pattern yapacağız.
Pub/Sub Tasarım Modeli (Design Pattern) Nedir?

Pub/sub pattern, yayıncı (publisher) ve aboneler (subscriber) arasında asenkron bir mesajlaşma modelidir. Yayıncı, belirli bir konu ü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.
Bir örnek ile bu durumu anlatalım.
Elon Musk’ın sahibi olduğu Tesla’nın araçları, pub/sub pattern’ı kullanarak birbirleriyle ve Tesla’nın bulut tabanlı hizmetlerle 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ır. 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 durum, yazılımcıların daha fazla dikkat ve çaba harcamasını gerektirir.
Güvenlik sorunları: Pub/Sub modeli, mesajların birçok noktada işlenmesini içerir. Bu durum, 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 durum, 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 durum, 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ırılması, avantajları ve dezavantajları çok daha fazla ayrıntı gerektirir. Peki bu teknolojileri kullanmadan kendimiz neler yapabiliriz? 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.
1. İlk 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.
2. İkinci adım olarak “Publisher
” larımızı oluşturalım. Bunun için bir struct tanımlayarak içerisine Subscriber arrayı ekliyoruz.

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.

3. Publisher kısmını tamamladıktan sonra geriye birkaç 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.
5. Şimdi yazdığımız kodu çalıştırma zamanı.

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. ❤
Kaynaklar:
Özetle;
Pub/Sub Tasarım Modeli (Design Pattern) nedir?
Pub/Sub Tasarım Modeli (Design Pattern) dezavantajları nelerdir?
Popüler Pub/Sub teknolojileri nelerdir?
Yazan: Baran Can Atbaş
Yayınlanma Tarihi: 07.04.2023
