Merhaba,

 

Bu yazıda Node.js ile RabbitMQ kullanımından bahsedeceğim. RabbitMQ ile ilgili detaylı bilgiye buradan ulaşabilirsiniz.

 

Örnek projemiz için şöyle bir senaryo düşünelim; Kullanıcı kaydı alan bir web sitemiz var ve 10 kullanıcı kayıt olmuş. Biz de bu kullanıcıların mail adreslerine “kayıt olduğunuz için teşekkür ederiz" şeklinde toplu bir mail atmak istedik. İşte bu toplu mail işlemini RabbitMQ üzerinden gerçekleştireceğiz. Pek mantıklı bir örnek olmasa da amacımız kullanımı görmek :)

 

RabbitMQ'yu ayağa kaldırmak için elimizde bir çok seçenek mevcut. İşletim sistemimize uygun olarak bilgisayara kurabilir veya bir Docker container'ı üzerinden kullanabiliriz. Ancak ben RabbitMQ için daha az zahmetli olacak şekilde bir Cloud çözümü olan CloudAMQP'yi kullanmayı tercih ettim. Detaylı bilgiye buradan ulaşabilirsiniz.

 

İlk olarak CloudAMQP üzerinden ücretsiz şekilde kayıt oluyoruz ve Team oluşturuyoruz. Sonrasında Create New Instance butonuna basıyoruz. Instance için bir isim girip ücretsiz olan Little Lemur planını seçiyoruz :)

 

Select Region butonuna basıp gelen ekranda bir bölge seçiyoruz. Ben varsayılan olarak gelen bölgeyi seçtim. 

 

Sonrasında Review ve Create Instance butonlarına basarak işlemi tamamlıyoruz.

 

Oluşturulan Instance'ın adına tıklayarak detayına ulaşıyoruz. Buradaki AMQP URL kısmını Node.js projemizde kullanmak üzere kopyalıyoruz.

 

Sonrasında terminalde istediğimiz bir dizine gelerek Node.js projesi oluşturuyoruz.

npm init -y

 

Gerekli kütüphaneleri kuruyoruz:

npm install amqplib dotenv

 

Proje dizinimiz üzerinde .env dosyası oluşturuyoruz. Az önce kopyalamış olduğumuz AMQP URL'i .env dosyamız içerisinde tanımlıyoruz.

 

Yine proje dizinimiz üzerinde publisher.js ve consumer.js şeklinde iki adet dosya oluşturuyoruz. publisher.js ile mail adreslerini kuyruğa gönderip, consumer.js ile de gelen adresleri işleyeceğiz.

 

publisher.js dosyamızın içeriği şu şekilde olacak;

const amqp = require("amqplib")

require('dotenv').config()

connect_rabbitmq()

async function connect_rabbitmq() {
  const connection = await amqp.connect(process.env.AMQP_URL)
  const channel = await connection.createChannel()
  await channel.assertQueue("emailQueue")

  for (let i = 1; i <= 10; i++) {
    let email = `test${i}@mail.com`

    console.log("Kayıt olan mail adresi: ", email)

    channel.sendToQueue("emailQueue", Buffer.from(JSON.stringify(email)))  
  }
}
  • dotenv paketi ile .env dosyamızda tanımladığımız veriye ulaşabildik.
  • amqp bağlantısını yapıp bir channel oluşturduk. O channel üzerinden de bir queue tanımladık ve 10 adet mail adresini kuyruğa gönderdik.

 

consumer.js dosyamızın içeriği ise şu şekilde olacak;

const amqp = require("amqplib")

require('dotenv').config()

connect_rabbitmq()

async function connect_rabbitmq() {
  const connection = await amqp.connect(process.env.AMQP_URL)
  const channel = await connection.createChannel()
  await channel.assertQueue("emailQueue")

  channel.consume("emailQueue", email => {
    let mail_address = email.content.toString()
    let content = `${mail_address} ile kayıt olduğunuz için teşekkür ederiz.`
    console.log("Giden mail: ", content)

    channel.ack(email)
  })
}
  • publisher kısmında tanımlamış olduğumuz queue'yi consume ederek gelen mail adreslerini işledik. Elbette bu kısımda gerçek bir mail gönderme işlemi de yapabilirdik ancak konumuz o değil :)

 

package.json dosyamızda iki adet script tanımlıyoruz;

"scripts": {
  "publisher": "node publisher",
  "consumer": "node consumer"
}

 

Son olarak terminalde script'leri çalıştırıp sonuca bakıyoruz:

npm run publisher
npm run consumer

 

Projenin Github reposuna buradan ulaşabilirsiniz.

 

Umarım yararlı olmuştur.

 

İyi çalışmalar.