PHP中的RabbitMQ使用者

时间:2018-08-16 11:10:27

标签: php rabbitmq

我正在使用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
  1. 初始化使用者的正确方法是什么?

根据文档,使用者应存储在单独的php脚本中,并应从终端调用(例如php Consumer.php),但是如果我们无法访问它,该怎么办?共享主机)?首先想到的解决方案是从代码中执行php(使用exec('php Consumer.php')),但这是一个好习惯吗?尽管如此,高管也可能被禁止,那么解决方案是什么?

或者也许有一种方法可以让消费者在类方法中进行调用?

  1. 我应该有几个队列?

应该接收通知的用户分为三类:管理员,卖家和客户。目前,我为每个组中的每个用户都有一个队列(例如,队列admin.1admin.2seller.1seller.2等)。使用这种方法,我只需要启动一次使用者,但是问题是,每次将新用户添加到任何组时,我都必须重新启动它。有更好的实现方法吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

  1. 是的,您可以从类方法中调用使用者。 最好的方法是创建一个shell脚本并无限循环调用使用者。
  2. 您可以创建多个队列,每个队列都可以与单独的使用者建立连接。 您需要在“ my_exchange”区域中设置一个空白值以创建多个队列。