在 RabbitMQ 中,Topic(主题)订阅模型 是一种基于路由键(routing key)的模式匹配消息分发机制。与 Direct Exchange 的精确匹配不同,Topic Exchange 允许队列通过通配符来绑定到交换机,并根据发送消息时携带的路由键进行模糊匹配。
工作原理:
-
创建 Topic 交换机:
首先声明一个 Topic 类型的交换机,例如topic_logs
。 -
绑定队列:
消费者可以将队列绑定到这个 Topic 交换机上,并指定一个具有通配符的绑定键(binding key)。通配符有两种形式:*
(星号)代表一个单词。#
(井号)代表零个或多个单词。
例如,队列
error_log
可以使用绑定键"*.error"
绑定到交换机,这意味着它将接收所有包含.error
的路由键的消息,如"app.error"
、"db.error"
等;而队列all_logs
可以使用绑定键"#"
,这将接收所有路由键的消息。 -
发布消息:
生产者向 Topic 交换机发布消息时,也需要携带一个路由键。例如,如果发布一条路由键为"app.warning"
的消息,则该消息会被转发至所有与其路由键匹配的已绑定队列。 -
消息投递:
Topic 交换机会检查每个绑定关系,对比路由键和绑定键。如果路由键中的单词序列能够通过通配符匹配规则对应上绑定键,则消息会被投递到对应的队列。
这种模式适用于需要根据消息内容的不同部分或者类别来进行灵活分发的情况,例如日志系统可以根据日志级别和模块分类投递消息给不同的处理单元。