PHP ile RabbitMQ Kullanımı

RabbitMQ popüler bir mesaj kuyruğu sistemidir. Mesaj kuyruğu yazılımlarının genel çalışma şekli şöyledir; yapılacak işler bir kuyruğa aktarılır ve işi yapacak olan worker’lar sırasıyla kuyruktan iş alıp yaparlar. Uygulama akışı sırasında kullanıcının, tamamlanmasını beklemesine gerek olmayan işleri arka planda gerçekleştirmek ya da bir işi birden fazla worker’a dağıtarak daha kısa sürede tamamlamak gibi işler için kullanılır. Mainstream bir örnek vermek gerekirse; başarılı bir kayıt işleminden sonra kullanıcıya hoşgeldiniz mail’i gönderileceğini varsayalım. Mail gönderme işlemi, bir mail sunucuna bağlanma ya da bir web servis kullanma süreçlerinden geçeceği için zaman alacaktır fakat kullanıcının başarılı kayıt sayfasını görmek için mail gönderiminin tamamlanmasını beklemesine gerek yoktur. O nedenle mail gönderme işlemi bir mesaj kuyruk sistemine yazılır ve bir consumer tarafından gönderim arka planda gerçekleşir.

RabbitMQ dökümantasyon sayfasında PHP ile nasıl kullanacağı anlatılmakta. Bu repo‘da hazırladığım örnek, php-amqplib kütüphanesi kullanarak publish/consume işlemlerinin kullanılmaya hazır ve daha anlaşılır bir hali:

consumer.php: RabbitMQ sunucusuna exchange, kuyruk ve routing key bilgilerini kullanarak bağlanıyor. Ardından, -mevcut consumer sayısını bakıp maximum sayıya ulaşılmadıysa- işlerin kuyruk sisteminden gelmesini beklemeye başlıyor. İşleri, consume callback içinde yapabilir ya da ayrı bir process’e gönderebilirsiniz. Bu PHP dosyası, her dakika çalışan bir cron ile CLI’dan çalıştırılabilir. Mevcut TTL süresi dolduktan sonra restart için kapanır.

publish.php: Kuyruğa bir mesaj gönderim örneği yer alıyor. Mesaj olarak encode edilmiş bir JSON string gönderebilir, işlerin yapıldığı kısımda ise decode ederek işi yapmak için gerekli detaylı veriye ulaşabilirsiniz.

worker.php: Eğer işler CLI üzerinden başka bir process’de yapmak istenirse -ki tavsiye ederim- kullanılabilir. RabbitMQ’ye gönderilen mesaj, CLI’da serialize ve encode edilmiş bir argüman olarak geldiği için unserialize ve decode işlemi gerçekleştiriliyor.