Go ile Event-Driven Architecture - RabbitMQ Part 1

Burak Tabakogluu
GoTurkiye
Published in
3 min readOct 26, 2023

Event-Driven Architecture (EDA), bir uygulamanın olaylara tepki verme ve bu olaylar aracılığıyla iletişim kurma yeteneği üzerine kurulu bir mimari desenidir. Bu yazımda, Golang kullanarak EDA’nın temellerini nasıl uygulayabileceğinizi anlatacağım. Basit bir mikroservis örneği üzerinden örnekleme yapacağız.

EDA Nedir?

EDA, uygulamanın olayları üretme, iletimi ve tüketme süreçlerini temel alır. Birçok uygulama bu tür olayları kullanarak farklı servisler arasında iletişim kurar. EDA, uygulamanızın daha esnek, ölçeklenebilir ve sürdürülebilir olmasını sağlar.

Golang ile EDA Kullanımı

Aşağıda, bir Go uygulamasında EDA kullanarak bir olayı üreten bir kaynak (producer) ve bu olayı işleyen bir tüketici (consumer) oluşturma adımlarını ve örnek kodları göstereceğim.

Adım 1: Gerekli Kütüphaneleri İçe Aktarın

İlk olarak, github.com/streadway/amqp kütüphanesini kullanarak RabbitMQ gibi bir mesaj kuyruğu sistemine bağlanmak için gerekli paketleri içe aktarmanız gerekecektir.

RabbitMQ yerine Apache Kafka , Google Cloud Pub/Sub vb. kullanabilirsiniz

Apache Kafka : github.com/confluentinc/confluent-kafka-go

Google Cloud Pub/Sub: cloud.google.com/go/pubsub

import (
"log"
"github.com/streadway/amqp"
)

Adım 2: Olay Üretme (Producer)

Olayları üretmek için bir üretici (producer) oluşturun. Aşağıdaki gibi bir örnek gösterebiliriz:

func produceEvent(eventData string) {
conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/") // RabbitMQ adresi
if err != nil {
log.Fatalf("RabbitMQ bağlantısı kurulamadı: %v", err)
return
}
defer conn.Close()

ch, err := conn.Channel()
if err != nil {
log.Fatalf("Kanal açılamadı: %v", err)
return
}
defer ch.Close()

// Olayı gönder
err = ch.Publish(
"events-exchange", // Değişim adı
"event-routing-key", // Routing key
false, // Mandatory
false, // Immediate
amqp.Publishing{
ContentType: "text/plain",
Body: []byte(eventData),
},
)
if err != nil {
log.Fatalf("Olay gönderilemedi: %v", err)
}
}

Adım 3: Olay Tüketme (Consumer)

Olayları işlemek için bir tüketici (consumer) oluşturuyoruz. Aşağıda, bir olayı işleyen basit bir consumer örneği verilmiştir:

func consumeEvent() {
conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/") // RabbitMQ adresi
if err != nil {
log.Fatalf("RabbitMQ bağlantısı kurulamadı: %v", err)
return
}
defer conn.Close()

ch, err := conn.Channel()
if err != nil {
log.Fatalf("Kanal açılamadı: %v", err)
return
}
defer ch.Close()
q, err := ch.QueueDeclare(
"event-queue", // Kuyruk adı
false, // Kalıcı
false, // Otomatik sil
false, // Exclusive
false, // No-wait
nil, // Argümanlar
)
if err != nil {
log.Fatalf("Kuyruk oluşturulamadı: %v", err)
return
}
// Olayları dinle
msgs, err := ch.Consume(
q.Name, // Kuyruk adı
"", // Tüketici etiketi
true, // Otomatik onaylama
false, // Exclusive
false, // No-local
false, // No-wait
nil, // Argümanlar
)
if err != nil {
log.Fatalf("Olay tüketilemedi: %v", err)
return
}
for msg := range msgs {
// Gelen olayı işle
log.Printf("Alınan Olay: %s", msg.Body)
}
}

Bu kod örneklerinde, Go ile EDA uygulamalarını oluşturmanız için temel bir başlangıç ​​noktası sunmaktayız. Producer, olayları bir mesaj kuyruğuna gönderirken, tüketici bu olayları dinleyip işleyebilir.

Sonuç

Go kullanarak Event-Driven Architecture uygulamaları oluşturmak oldukça güçlü ve etkili bir yöntemdir. Bu yazımda verilen örnekler, EDA’nın temel prensiplerini anlamanıza umarım yardımcı olmuştur. Event-Driven mimariyi daha fazla geliştirmek ve özelleştirmek için projemizin gerekliliklerine göre şekillendirmemiz gerekmektedir.

Son olarak Event-Driven Architecture uygulamamızı daha esnek ve ölçeklenebilir hale getirerek karmaşık sistemlerdeki işbirliği ve iletişimi kolaylaştırabilir.

Part 2'de, microservisler arasındaki iletişimi asenkron bir şekilde event tabanlı yöntemlerle nasıl gerçekleştirebileceğimizi öğrenmek için bir örnek inceleyeceğiz. Bu örnek, eventlar kullanarak asenkron veri ve işlem paylaşımının nasıl sağlandığını ayrıntılı bir şekilde açıklayacaktır.

Başka bir yazıda görüşmek üzere…

Photo by Chinmay B on Unsplash

Daha fazla bilgi için faydalanabileceğiniz bir kitap

--

--