2017-06-12 76 views
2

我認爲我有一個簡單的問題,但我無法回答: 我該如何一次運行多個消費者? 比如我有3名消費者Symfony RabbitMQ:在控制檯上運行很多消費者

consumers: 
    rename_image_folder: ... 
    update_customer: ... 
    create_protocol: ... 

,我怎麼能同時運行呢?我必須打開3個控制檯窗口並運行它們?但在我們的項目中,我們有10個微服務API,每個微服務API至少有一個消費者。我如何使用它?

我相信,我認爲我們有辦法如何做到這一點。例如,我有不同的routing_key,我必須編寫不同的方法(或服務)來處理隊列。也許有另一種方式來處理它。

如果你申請一個例子,請這將是非常好的。謝謝!

+0

消息總線可能是MOA的一個不錯的選擇,當你想建立一個異步通信。以下是關於如何連接不同的PHP應用程序的文章https://blog.forma-pro.com/message-bus-to-every-php-application-42a7d3fbb30b –

回答

1

您需要使用捆綁像this one和安裝supervisord在你的服務器上。該捆綁包將處理從您的rabbitmq設置創建supervisord配置文件,讓您的不同客戶自動保持活動狀態。 我已經得到它非常穩定的工作包和php-amqplib/rabbitmq-bundle

+0

非常感謝!我今天會檢查一下! –

1

不同的消費會說不同的PHP的過程,這意味着你可以擴展增加了消耗的隊列的消息消費者增加更多的PHP程序的數量。

我建議你爲了控制PHP程序的數量和採取的過程的狀態小心使用像Supervisord的工具。

作爲例子,你可以配置一個簡單的supervisord過程與PHP程序的次數(numprocs元素):

[supervisord] 
logfile = /tmp/supervisord.log 
logfile_maxbytes = 10MB 
directory = %(here)s 
pidfile = /tmp/supervisord.pid 
[program:todo] 
command = php /var/www/symfony/bin/console rabbitmq:consumer -w sync 
autostart = true 
autorestart = true 
numproc=5 

希望這有助於

+0

每個隊列的進程一直都不好。它有缺點。如果你100個隊列,你需要100個進程來至少爲他們提供全部服務。一個典型的Symfony應用需要100Mb的內存剛剛開始,所以你需要的10Gb內存 –

+0

@MaksimKotlyar肯定,但它是一個設計問題:你不能從多個隊列 – Matteo

+0

消耗其實,你可以從多個隊列消費,但你必須重新配置應用程序,並且無法在運行時配置它。解決方案不夠靈活。我喜歡EnqueueBundle是如何做到的。有關如何處理隊列的更多選項。 –