淘先锋技术网

首页 1 2 3 4 5 6 7

PHP RabbitMQ Topic是一个用于进行消息队列传输的开源软件。它使用了AMQP 0.9.1协议,并提供了可靠的消息传递机制。Topic是其中一种交换机类型,可以让多个消费者监听同一个队列,并且只接收特定的消息。下面我们详细了解一下

例如,当多个服务需要监听一个队列,而每个服务又需要收到不同的消息时,即使用Topic来实现。主要分为三部分:交换机、队列和绑定键。交换机用于将消息路由到队列中,队列存储消息,并且每个队列可以绑定一个或多个绑定键。绑定键用于路由消息到具体的队列中,可以使用通配符(星号*和井号#)匹配多个绑定键。

// 创建连接和信道
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
// 定义交换机类型
$channel->exchange_declare('topic_logs', 'topic', false, false, false);
// 定义队列名和绑定键
list($queue_name, ,) = $channel->queue_declare('', false, false, true, false);
$channel->queue_bind($queue_name, 'topic_logs', 'example.*');
// 消息消费
$callback = function ($msg) {
echo 'Received message: ', $msg->body, "\n";
};
$channel->basic_consume($queue_name, '', false, true, false, false, $callback);
// 消息生产
$channel->basic_publish(new AMQPMessage('Hello, World!'), 'topic_logs', 'example.1');
$channel->basic_publish(new AMQPMessage('Hello, RabbitMQ!'), 'topic_logs', 'example.2');
// 关闭连接和信道
register_shutdown_function(function () use ($channel, $connection) {
$channel->close();
$connection->close();
});

上述代码中,我们创建了一个Topic类型的交换机,并定义了一个绑定键example.*,即表示监听example开头的所有消息。定义了一个队列,并将其与交换机绑定。然后使用basic_publish方法,向交换机发送两条消息。最后使用basic_consume方法,启动消息消费。

除了星号匹配单个词之外,井号可以匹配多个词。例如,绑定键example.#可以匹配example.1.2.3和example.A.B.C.D,但是example.*只能匹配example.1这一个词。

Topic是AMQP协议中最为通用的交换机类型之一。它可以实现高度灵活的消息路由机制,适用于复杂的消息转发场景。