21/02/2016 - RABBITMQ, SYMFONY
Eğer symfony uygulamanızda RabbitMqBundle kullanıyorsanız, aşağıdaki RabbitMQ topic 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.
*
ve #
simgeleri içerirler.#
işaretinden oluşuyorsa, topic exchange fanout exchange gibi hareket edip, mesajları sıralara keyfiyen yönlendirir.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: topic }
consumers:
order_create:
connection: default
exchange_options: { name: 'order_create_ex', type: topic }
queue_options: { name: 'order_create_qu' }
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: topic }
consumers:
order_create_bmw:
connection: default
exchange_options: { name: order_create_ex, type: topic }
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: topic }
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: topic }
queue_options:
name: order_create_bmw_qu
routing_keys:
- 'bmw.#'
order_create_audi_mercedes:
connection: default
exchange_options: { name: order_create_ex, type: topic }
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: topic }
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: topic }
queue_options:
name: order_create_audi_mercedes_qu
routing_keys:
- 'audi.*'
- '#.mercedes.*'
callback: application_frontend.consumer.order_create_audi_mercedes