面试题答案
一键面试Tag过滤
- 实现原理:在RocketMQ中,生产者发送消息时会为消息指定一个或多个Tag。消费者在订阅消息时,可以指定要接收的Tag。Broker在存储和转发消息过程中,会根据消费者订阅的Tag来判断是否将消息推送给该消费者。例如,生产者发送消息时设置Tag为“order”,消费者订阅时指定Tag为“order”,那么Broker只会将Tag为“order”的消息推送给该消费者。
- 应用场景:适用于业务逻辑较为简单,消息类型区分明确的场景。比如在电商系统中,将订单相关消息标记为“order”Tag,库存相关消息标记为“stock”Tag,消费者可以通过订阅相应Tag来获取特定类型消息进行处理。
SQL92过滤
- 实现原理:RocketMQ允许在消息属性上进行SQL92语法的过滤。生产者发送消息时可以在消息属性中设置一些自定义字段。消费者订阅消息时,通过SQL表达式对这些消息属性进行过滤。Broker收到消息后,解析SQL表达式,并根据消息属性的值进行匹配,将符合条件的消息推送给消费者。例如,消息属性中有“price”字段,消费者订阅时可以使用“price > 100”这样的SQL表达式,Broker会筛选出价格大于100的消息推送给该消费者。
- 应用场景:适用于业务逻辑复杂,需要根据消息属性进行更灵活过滤的场景。比如在营销系统中,根据用户等级、消费金额等多个消息属性组合过滤消息,从而实现精准营销活动的消息推送。
选择合适过滤方式
- 业务简单明确选Tag:如果业务中消息类型简单,通过少量明确的分类就可以区分消息,使用Tag过滤简单高效,它的性能开销小,实现也容易。
- 业务复杂灵活选SQL92:当业务场景需要根据多种条件组合来筛选消息,SQL92过滤提供了强大的灵活性。不过,SQL92过滤因为涉及到SQL表达式的解析和计算,性能开销相对较大,所以在使用时要权衡性能与业务需求。