MST

星途 面试题库

面试题:消息队列RocketMQ的消息过滤方式有哪些及原理

请详细阐述RocketMQ支持的消息过滤方式,比如Tag过滤和SQL92过滤,并且说明它们各自的实现原理,以及在实际应用场景中如何选择合适的过滤方式。
37.7万 热度难度
后端开发消息队列

知识考点

AI 面试

面试题答案

一键面试

Tag过滤

  1. 实现原理:在RocketMQ中,生产者发送消息时会为消息指定一个或多个Tag。消费者在订阅消息时,可以指定要接收的Tag。Broker在存储和转发消息过程中,会根据消费者订阅的Tag来判断是否将消息推送给该消费者。例如,生产者发送消息时设置Tag为“order”,消费者订阅时指定Tag为“order”,那么Broker只会将Tag为“order”的消息推送给该消费者。
  2. 应用场景:适用于业务逻辑较为简单,消息类型区分明确的场景。比如在电商系统中,将订单相关消息标记为“order”Tag,库存相关消息标记为“stock”Tag,消费者可以通过订阅相应Tag来获取特定类型消息进行处理。

SQL92过滤

  1. 实现原理:RocketMQ允许在消息属性上进行SQL92语法的过滤。生产者发送消息时可以在消息属性中设置一些自定义字段。消费者订阅消息时,通过SQL表达式对这些消息属性进行过滤。Broker收到消息后,解析SQL表达式,并根据消息属性的值进行匹配,将符合条件的消息推送给消费者。例如,消息属性中有“price”字段,消费者订阅时可以使用“price > 100”这样的SQL表达式,Broker会筛选出价格大于100的消息推送给该消费者。
  2. 应用场景:适用于业务逻辑复杂,需要根据消息属性进行更灵活过滤的场景。比如在营销系统中,根据用户等级、消费金额等多个消息属性组合过滤消息,从而实现精准营销活动的消息推送。

选择合适过滤方式

  1. 业务简单明确选Tag:如果业务中消息类型简单,通过少量明确的分类就可以区分消息,使用Tag过滤简单高效,它的性能开销小,实现也容易。
  2. 业务复杂灵活选SQL92:当业务场景需要根据多种条件组合来筛选消息,SQL92过滤提供了强大的灵活性。不过,SQL92过滤因为涉及到SQL表达式的解析和计算,性能开销相对较大,所以在使用时要权衡性能与业务需求。