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.


Topic exchange gerçekleri



Hatırlatıcı


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.


1 Producer & 1 Exchange & 1 Queue & N Worker & 1 Consumer


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



1 Producer & 1 Exchange & 2 Queue & N Worker & 2 Consumer


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




2 Producer & 1 Exchange & 2 Queue & N Worker & 2 Consumer


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