如果通过mq实现逻辑,怎么拿到用户的信息那 Published on Apr 22, 2026 in 随笔 with 0 comment 方案 实现方式 优点 缺点 1. 消息体携带 userId msg.setUserId(userId) 简单直接 消费者需额外 RPC 查用户信息 2. 消息体携带用户快照 msg.setUserSnapshot(user) 消费者无需查库 用户信息变更后不实时;消息体膨胀 3. 拦截器注入到 Message Headers 自动从上下文提取,放入 MQ 属性 业务零侵入,统一管理 实现稍复杂 4. 消费者实时查询 只传 userId,消费者反查用户服务 数据实时 增加 RPC 调用,耦合用户服务 面试官:通过 MQ 实现逻辑,怎么拿到用户信息?听说可以用拦截器? 你: “是的,我们项目里就是采用拦截器自动注入到消息属性的方案。核心思路是将用户信息作为横切关注点,与业务逻辑解耦。 生产者端:我们写了一个 AOP 切面,在发送 MQ 前自动从 Spring Security 或 ThreadLocal 中获取当前用户,然后通过 RocketMQ 的 Message.putUserProperty() 方法将 userId、vipLevel 等关键字段放入消息属性。业务代码只需要加一个 @AutoInjectUser 注解,完全不需要手动处理。 消费者端:我们自定义了参数解析器,在消费消息前自动从 MessageExt.getUserProperty() 中提取用户信息,直接注入到消费者方法的 UserContext 参数中。消费者只关心计算逻辑,不用写任何解析代码。 这样做有几个好处: 业务零侵入:开发人员不需要关心用户信息的传递 统一管理:用户信息字段变更只改拦截器一处 性能好:避免了消费者再 RPC 调用用户服务 可追溯:消息属性中携带用户信息,便于问题排查 需要注意的是,RocketMQ 的用户属性有 32KB 的大小限制,所以我们只放必要的字段(userId、vipLevel),完整的用户信息还是消费者按需查询。” 本文由 admin 创作,采用 知识共享署名4.0 国际许可协议进行许可。本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。