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协议中最为通用的交换机类型之一。它可以实现高度灵活的消息路由机制,适用于复杂的消息转发场景。