Go ile Event Driven Web Pushing (RabbitMQ & SSE)

Ömer Burak Demirpolat
2 min readMar 7, 2021

--

Selam.

Twitter’ı düşünüyorum, bir sayfayı yenilemeden beğeni sayıları değişiyor. Bunu yapmak için bir kaç yol var, web socket kullanılabilir, belirli aralıklarla istek gönderilebilir veya SSE kullanılıyor olabilir.

Bu yazıdaki örnek RabbitMQ’ya gelen mesajları dinleyen ve yeni bir mesaj geldiğinde bunu bağlı olan client’lara push eden SSE (Server Sent Event) içerecek. Başlayalım.

RabbitMQ kurulumu için ben docker kullanacağım, ister homebrew ile ister apt ile kurabilirsiniz.

docker pull bitnami/rabbitmq

Ardından indirdiğimiz bu imajdan bir container çalıştıralım.

docker container run -p 5672:5672 -p 15672:15672 -v rabbitmqvol:/bitnami bitnami/rabbitmq

Bu komut ile birlikte RabbitMQ web arayüzü 15672 portu üzerinden çalışacak, 5672 portundan ise Consumer yani RabbitMQ’yu dinleyen alıcılara mesajları iletecek. “-v rabbitmqvol:/bitnami” komutu ise bir volume oluşturacak ve RabbitMQ çalışırken sadece bu dizini kullanacak.

Şimdi localhost:15672 adresine gidelim ve RabbitMQ arayüzüne giriş yapalım. docker imajında default username “user” şifre ise “bitnami” ben bu bilgiler ile giriş sağladım.

Queues bölümüne giderek bir queue oluşturuyorum.

Şimdilik buradaki işimiz bitti şimdi RabbitMQ’yu dinleyen mesajları alıp client’lara push eden SSE yapısını Go ile oluşturalım.

İlk olarak eventleri yazacağım bir channel yaratıyorum.

var eventChan chan string
func main() {
eventChan = make(chan string)
}

Şimdi bir listener yazalım, bu listener RabbitMQ’yu dinleyecek ve yeni mesaj geldiğinde bu mesajı eventChan adlı channela yazacak.

Yukarıdaki kodu biraz özet geçecek olursak AMPQ protokolü ile 5672 portu üzerinden dinlemeye başlıyoruz ve “TEST_QUEUE” adındaki kuyruğa consumer olarak dahil oluyoruz. Bu kuyruğa gelen mesajlar “msgs” adındaki kanala yazılacak. En sondaki goroutine’de ise “msgs” kanalına gelen her mesajı yakalayayıp “eventChan” kanalına yazacağız.

Daha sonrasında bu “eventChan” kanalından okuduğumuz mesajları tarayıcıya, clientlara ileteceğiz.

Şimdi web sunucusunu ayağa kaldıralım, main fonksiyonu şu an aşağıdaki gibi.

“/get-info” adında bir adres oluşturduk ve getInfo fonksiyonuna adresledik. Şimdi bu fonksiyonu yazalım.

Burada sonsuz bir döngü var, “eventChan” kanalına gelen her mesajı dinleyecek ve ve “w.Write” ile stream edecek. HTML ile yazacağımız client anlık olarak bu mesajı yakalayabilecek.

Son olarak index.html adında küçücük, minimal bir client oluşturalım.

Yukarıdaki kod http://localhost:3001/get-info adresinde yayınlanan her bir yeni eventte gelen mesajı “data” id’sine sahip div’e basacak.

Test için hazırız. Şimdi oluşturduğumuz html dosyasını tarayıcımız ile açalım ve yeni bir sekme açıp tekrar en başa dönerek RabbitMQ arayüzüne gidiyoruz localhost:15672

Queues kısmından oluşturduğumuz “TEST_QUEUE” üzerine tıklıyoruz.

Burada publish message kısmında payload’a bir mesaj yazıp yayınlıyorum bum. Client’ımız gelen mesajı yakaladı ve ekrana bastı.

Uygulamanın tam haline https://github.com/bdemirpolat/event_driven_web_pushing adresinden ulaşabilirsiniz.

Bu kadardı, tşkkrlr.

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

--

--

No responses yet

Write a response