Message Broker Nedir? RabbitMQ
Günümüzde, uygulamalar arası iletişim ve veri transferi giderek karmaşık hale gelmektedir. Bu noktada, mesaj kuyrukları ve broker’lar, sistemler arasında güvenilir bir iletişim sağlamak için önemli bir rol oynamaktadır. İşte bu yazıda, Message Broker kavramını anlamaya ve popüler örnekleri arasında olan RabbitMQ üzerine odaklanacağız.
Message Broker Nedir?
Message Broker, bir uygulamadan diğerine veri iletimini kolaylaştıran bir ara yazılımdır. Bu, sistemler arasında asenkron mesajlaşma, güvenilir veri transferi ve sistemlerin birbiriyle entegrasyonunu sağlama amacını taşır.
RabbitMQ:
RabbitMQ, orijinal olarak AMQP (Advanced Message Queuing Protocol) uygulayan ve o zamandan beri Streaming Text Oriented Messaging Protocol, MQ Telemetri Aktarımı ve diğer protokolleri destekleyecek bir eklenti mimarisiyle genişletilen açık kaynaklı bir message-broker yazılımıdır.
- RabbitMQ, AMQP (Advanced Message Queuing Protocol) standardını destekleyen bir açık kaynaklı mesaj kuyruğu yazılımıdır.
- Yüksek performans, esneklik ve geniş protokol desteği sunar.
Docker Üzerine RabbitMQ Kurulumu
Docker, yazılım uygulamalarını çevrelerinden bağımsız olarak çalıştırmak için kullanılan bir konteynerleme platformudur. RabbitMQ’yu Docker üzerinde çalıştırmak, geliştirme ve test süreçlerini hızlandırır ve uygulamamızın bağımlılıklarını izole ederek sistem uyumluluğunu artırır.
Adım 1: RabbitMQ Docker İmajını İndirme
Docker üzerinde RabbitMQ kullanabilmek için, ilk adım olarak RabbitMQ Docker imajını indirmemiz gerekmektedir. Aşağıdaki komutu kullanarak RabbitMQ’nun resmi Docker imajını çekebiliriz:
docker pull rabbitmq:3.12-management
Adım 2: RabbitMQ Konteynerini Başlatma
Docker imajını indirdikten sonra, RabbitMQ konteynerini başlatmak için aşağıdaki komutu kullanabiliriz:
docker run -it -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.12-management
Bu komut, RabbitMQ’yu “guest” kullanıcı adı ve “guest” şifresiyle localhost:15672 adresinden erişilebilir bir şekilde başlatır. Ayrıca, RabbitMQ’nun yönetim ara yüzüne erişim için http://localhost:15672 adresini kullanabiliriz.
Adım 3: RabbitMQ Yönetim Arayüzünden Exchange ve Queue Oluşturma
Docker üzerinde çalışan RabbitMQ’yu tarayıcı üzerinden yönetim ara yüzüne giderek kontrol edebiliriz. http://localhost:15672/ adresine giderek kullanıcı adı “guest” ve şifre “guest” ile giriş yapabiliriz.
Yönetim ara yüzünde “Exchanges” kısmından yeni bir exchange (örneğin “fanout-example”) oluşturabilir ve “Queues” kısmından yeni bir kuyruk (queue) tanımlayabiliriz.
Tanımladığımız fanout-example’a tıkladıktan sonra çıkan ekranda tanımladığımız queue bilgilerini girebilriz. Bu sayede bu exchange gelen mesajları bu kuyruğa aktarmış olacaktır.
Sonrasında Exchange ksımındaki Publish Message bölümünden bir mesaj yayınlayabiliriz.
Görüldüğü üzere bu mesajı oluşturduğumuz Queue’ye tıkladıktan sonra Get Message kısmından görüntüleyebiliyoruz.
Adım 4: Golang ile RabbitMQ Bağlantısı
RabbitMQ’yu Docker üzerinde başlattıktan ve gerekli ayarları yaptıktan sonra, Golang uygulamanızı RabbitMQ ile iletişim kuracak şekilde ayarlayabiliriz.
Öncelikle, RabbitMQ ile bağlantı kurmak için kullanacağımız github.com/rabbitmq/amqp091-go
kütüphanesini indirmemiz gerekecek:
go get github.com/rabbitmq/amqp091-go
Ardından, Golang kodumuzu aşağıdaki gibi düzenleyerek RabbitMQ’ya bağlanabilir ve mesajları işleyebiliriz:
package main
import (
"context"
"log"
amqp "github.com/rabbitmq/amqp091-go"
)
var (
ch *amqp.Channel
q amqp.Queue
)
func failOnError(err error, msg string) {
if err != nil {
log.Panicf("%s: %s", msg, err)
}
}
func main() {
// RabbitMQ'ya bağlanma
conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
failOnError(err, "Failed to connect to RabbitMQ")
defer conn.Close()
ch, err = conn.Channel()
failOnError(err, "Failed to declare a example")
// Yeni bir bağlam oluşturma
ctx := context.Background()
if err := ch.ExchangeDeclare("fanout-example", "fanout", true, false, false, false, nil); err != nil {
failOnError(err, "Failed to declare a example")
}
// yeni bir kuyruk oluşturma
queue, err := ch.QueueDeclare(
"queue1", // name
false, // durable
false, // delete when unused
false, // exclusive
false, // no-wait
nil, // arguments
)
if err := ch.QueueBind(queue.Name, "", "fanout-example", false, nil); err != nil {
failOnError(err, "Failed to bind to %s"+queue.Name)
}
failOnError(err, "Failed to declare a queue")
// Bir exchange ile mesaj gönderme
body := "Hello RabbitMQ!"
err = ch.PublishWithContext(ctx,
"fanout-example", // exchange
"", // routing key
false, // mandatory
false, // immediate
amqp.Publishing{
ContentType: "text/plain",
Body: []byte(body),
})
failOnError(err, "Failed to publish a message")
log.Printf(" [x] Sent %s\n", body)
consumer()
}
func consumer() {
msgs, err := ch.Consume(
q.Name, // queue
"", // consumer
true, // auto-ack
false, // exclusive
false, // no-local
false, // no-wait
nil, // args
)
failOnError(err, "Failed to register a consumer")
var forever chan struct{}
go func() {
for d := range msgs {
log.Printf("Received a message: %s", d.Body)
}
}()
log.Printf(" [*] Waiting for messages. To exit press CTRL+C")
<-forever
}
Bu kod parçası, RabbitMQ’ya bağlanmayı, bir exchange’e mesaj göndermeyi, gönderilen mesajı kuyruktan okuyan bir consumer’ı ve başarılı bir şekilde gönderilen mesajı loglamayı içerir. Uygulamanızın ihtiyaçlarına göre kodu özelleştirebilirsiniz.
Sonuç
Bu yazıda, RabbitMQ’nun Docker üzerinde nasıl kurulacağını ve Golang ile nasıl kullanabileceğimizi öğrendik. Docker sayesinde RabbitMQ’nun hızlı bir şekilde başlatılması, geliştirme süreçlerinizi kolaylaştırabilir ve uygulamalarınızı daha modüler hale getirebilir. 🐇🐳
Sosyal Medya ve Bağlantılar:
- GitHub: MuharremCandan
- LinkedIn: Muharrem Candan
- Twitter: @mhrrm_cndn