面试题答案
一键面试RocketMQ Tag过滤方式原理
- 消息发送时:生产者在发送消息时,可以为每条消息设置一个或多个Tag。Tag本质上是消息的一个属性,生产者将消息发送到RocketMQ Broker时,消息中包含了设定的Tag信息。例如,使用Java代码发送消息时:
Message msg = new Message("TopicTest" /* Topic */,
"TagA" /* Tag */,
("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET) /* Message body */
);
producer.send(msg);
这里为消息设定了“TagA”这个Tag。 2. 消息接收时:消费者在订阅消息时,可以指定需要接收的Tag。消费者从Broker拉取消息时,Broker会根据消费者订阅的Tag对消息进行过滤,只将符合消费者所订阅Tag的消息推送给消费者。例如,消费者使用Java代码订阅消息:
consumer.subscribe("TopicTest", "TagA || TagB");
上述代码表示消费者订阅“TopicTest”主题下Tag为“TagA”或者“TagB”的消息。Broker会按照这个订阅条件,筛选出相应的消息推送给消费者。
适合使用Tag过滤的实际应用场景
- 订单系统:在电商的订单系统中,可能存在不同类型的订单消息,如“新订单消息”、“订单支付消息”、“订单发货消息”等。可以分别为这些消息设置不同的Tag,如“NewOrder”、“OrderPaid”、“OrderShipped”。消费者可以根据自己的需求订阅特定Tag的消息。例如,物流系统的消费者只需要订阅“OrderShipped”Tag的消息,这样就可以专注处理发货相关的订单消息,而不会收到其他无关的订单消息,如支付消息。
- 日志系统:对于日志收集和处理系统,不同类型的日志可以用不同的Tag标识。比如“SystemLog”(系统日志)、“BusinessLog”(业务日志)、“ErrorLog”(错误日志)等。数据分析模块可能只关心“BusinessLog”,用于分析业务行为和趋势;而运维团队可能更关注“ErrorLog”,以便及时发现和处理系统错误。通过Tag过滤,不同的消费者可以各取所需,提高系统的处理效率和针对性。