18/02/2016 - RABBITMQ, SYMFONY
Eğer symfony uygulamanızda RabbitMqBundle kullanıyorsanız, aşağıdaki RabbitMQ direct exchange konfigürasyonlar işinize yarayabilir. Eğer konfigürasyonunuz içinde birden fazla consumer kullanıyorsanız, size multiple_consumers konfigürasyon seçeneğini kullanmanızı tavsiye ederim. Bir tane örnek yazım var ama arayıp bulmanız lazım.
Mesajları uygulamanızın producer classı ile sıraya koyarken, $this->producer->publish(json_encode($message, 'xxxxx');
methodunda belirlenen xxxxx
(routing_key) parametresinin, konfigürasyon dosyanızda tanımladığınız routing_key bilgisi ile uyuşması gereklidir. Örnek: order_create, bmw, audi, mercedes. Ayrıca, aşağıdaki resimlerde gördüğümüz RK, "routing_key" BK ise, "binding_key" demektir.
binding key
değeri ile sıranın routing key
değerleri arasında eşitliğin olduğu sıraya verir.binding key
ve routing key
belirlenmemiş ise, direct exchange fanout gibi hareket edip, mesajları ilişkide olduğu tüm sıralara gönderecektir.Sisteminizde queue/exchange konfigürasyonlarını yarattığınız veya yenilediğiniz zaman, rabbitmq sunucusuna yenilikler ve değişikliklerle ilgili haber vermek için $ bin/console rabbitmq:setup-fabric
komutunu her zaman çalıştırmanız gerekir. Aksi taktirde yayınlanan mesajların işlenmeme durumu oluşabilir.
Tüm "create" mesajları aynı sıraya gider.
# You can run many workers like commands below.
$ app/console rabbitmq:consumer -m 100 order_create
$ app/console rabbitmq:consumer -m 100 order_create
old_sound_rabbit_mq:
connections:
default:
host: 127.0.0.1
port: 5672
user: guest
password: guest
vhost: /
lazy: true
producers:
order_create:
connection: default
exchange_options: { name: order_create_ex, type: direct }
queue_options:
name: order_create_qu
routing_keys:
- order_create
consumers:
order_create:
connection: default
exchange_options: { name: order_create_ex, type: direct }
queue_options:
name: order_create_qu
routing_keys:
- order_create
callback: application_frontend.consumer.order_create
Bu örnekte, "bmw", "audi" ve "mercedes" mesajları tek bir producerden gelirler ama, "bmw" mesajları, "audi" ve "mercedes" mesajlarına göre farklı bir şekilde işlenirler.
# You can run many workers like commands below.
$ app/console rabbitmq:consumer -m 100 order_create_bmw
$ app/console rabbitmq:consumer -m 100 order_create_bmw
$ app/console rabbitmq:consumer -m 100 order_create_audi_mercedes
$ app/console rabbitmq:consumer -m 100 order_create_audi_mercedes
old_sound_rabbit_mq:
connections:
default:
host: 127.0.0.1
port: 5672
user: guest
password: guest
vhost: /
lazy: true
producers:
order_create:
connection: default
exchange_options: { name: order_create_ex, type: direct }
consumers:
order_create_bmw:
connection: default
exchange_options: { name: order_create_ex, type: direct }
queue_options:
name: order_create_bmw_qu
routing_keys:
- bmw
callback: application_frontend.consumer.order_create_bmw
order_create_audi_mercedes:
connection: default
exchange_options: { name: order_create_ex, type: direct }
queue_options:
name: order_create_audi_mercedes_qu
routing_keys:
- audi
- mercedes
callback: application_frontend.consumer.order_create_audi_mercedes
Bu örnekte, "bmw", "audi" ve "mercedes" mesajları iki farklı producerlerden gelirler. Producer X'in "bmw" mesajları, producer Y'nin "audi" ve "mercedes" mesajlarına göre farklı bir şekilde işlenirler.
# You can run many workers like commands below.
$ app/console rabbitmq:consumer -m 100 order_create_bmw
$ app/console rabbitmq:consumer -m 100 order_create_bmw
$ app/console rabbitmq:consumer -m 100 order_create_audi_mercedes
$ app/console rabbitmq:consumer -m 100 order_create_audi_mercedes
old_sound_rabbit_mq:
connections:
default:
host: 127.0.0.1
port: 5672
user: guest
password: guest
vhost: /
lazy: true
producers:
order_create_bmw:
connection: default
exchange_options: { name: order_create_ex, type: direct }
queue_options:
name: order_create_bmw_qu
routing_keys:
- bmw
order_create_audi_mercedes:
connection: default
exchange_options: { name: order_create_ex, type: direct }
queue_options:
name: order_create_audi_mercedes_qu
routing_keys:
- audi
- mercedes
consumers:
order_create_bmw:
connection: default
exchange_options: { name: order_create_ex, type: direct }
queue_options:
name: order_create_bmw_qu
routing_keys:
- bmw
callback: application_frontend.consumer.order_create_bmw
order_create_audi_mercedes:
connection: default
exchange_options: { name: order_create_ex, type: direct }
queue_options:
name: order_create_audi_mercedes_qu
routing_keys:
- audi
- mercedes
callback: application_frontend.consumer.order_create_audi_mercedes