我正在使用RabbitMQ实施Notifications系统,并希望听听有关以下问题的最佳实践。
RabbitMQ服务器安装在本地主机上。
我的生产者代码:
// ... Initialize connection
$this->channel->exchange_declare('my_exchange', 'direct', false, false, false);
// Detect routing key
$parameters = $notification->getParameters();
$routing_key = !empty($parameters['consumer']) ? $parameters['consumer'] : 'admin.0';
$message = new AMQPMessage($notification->getMessage(), ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]);
$this->channel->basic_publish($message, 'my_exchange', $routing_key);
// ... Close connection
我的消费者代码:
// ... Initialize connection
$channel->exchange_declare('my_exchange', 'direct', false, false, false);
list($queue_name, ,) = $channel->queue_declare("", false, false, true, false);
// Bind admin routing key
$channel->queue_bind($queue_name, 'my_exchange', "admin.0");
// Bind seller routing keys
foreach ($sellers_ids_from_db as $seller_id) {
$channel->queue_bind($queue_name, 'my_exchange', "seller.{$seller_id}");
}
// Bind customer routing keys
foreach ($customers_ids_from_db as $customer_id) {
$channel->queue_bind($queue_name, 'my_exchange', "customer.{$customer_id}");
}
echo " [*] Waiting for logs. To exit press CTRL+C\n";
$channel->basic_consume($queue_name, '', false, false, false, false, function ($msg) {
echo ' [x] ', $msg->delivery_info['routing_key'], ':', $msg->body, "\n";
});
while (count($channel->callbacks)) {
$channel->wait();
}
// ... Close connection
根据文档,使用者应存储在单独的php脚本中,并应从终端调用(例如php Consumer.php
),但是如果我们无法访问它,该怎么办?共享主机)?首先想到的解决方案是从代码中执行php(使用exec('php Consumer.php')
),但这是一个好习惯吗?尽管如此,高管也可能被禁止,那么解决方案是什么?
或者也许有一种方法可以让消费者在类方法中进行调用?
应该接收通知的用户分为三类:管理员,卖家和客户。目前,我为每个组中的每个用户都有一个队列(例如,队列admin.1
,admin.2
,seller.1
,seller.2
等)。使用这种方法,我只需要启动一次使用者,但是问题是,每次将新用户添加到任何组时,我都必须重新启动它。有更好的实现方法吗?
谢谢!
答案 0 :(得分:0)