rocketmq学习

发布时间:2026/6/3 16:16:08

rocketmq学习 1. RocketMQ 是什么RocketMQ 是一个消息队列中间件。它的核心作用是让一个系统把消息发出去另一个系统异步接收并处理。比如订单系统 --- RocketMQ --- 库存系统 订单系统 --- RocketMQ --- 积分系统 订单系统 --- RocketMQ --- 短信系统订单系统只负责说“用户下单了。”然后把这条消息发到 RocketMQ。库存系统看到这个消息就扣库存。积分系统看到这个消息就加积分。短信系统看到这个消息就发短信。这样订单系统就不需要自己一个个调用它们。2. 为什么要用 RocketMQ主要解决这几个问题。1异步处理提高速度不用消息队列时下单 - 扣库存 - 加积分 - 发短信 - 返回成功用户要等所有步骤完成。用了 RocketMQ下单 - 发送消息 - 返回成功扣库存、加积分、发短信后面慢慢处理。这样接口响应更快。2系统解耦不用 MQ 时订单系统可能要直接调用库存系统、短信系统、积分系统。订单系统强依赖库存系统 订单系统强依赖短信系统 订单系统强依赖积分系统如果短信系统挂了订单系统可能也受影响。用了 MQ订单系统只管发消息 其他系统自己订阅消息订单系统不用关心谁来处理。3削峰填谷比如秒杀场景一瞬间来了 10 万个请求。如果这些请求直接打到数据库数据库可能崩。可以先把请求写入 MQ大量请求 - RocketMQ - 后台慢慢消费 - 数据库RocketMQ 相当于一个缓冲池。3. RocketMQ 里的核心概念你先记住这些Producer生产者发消息的人 Consumer消费者收消息的人 Topic消息主题消息分类 Group组表示一类生产者或消费者 Broker消息服务器真正存消息的地方 NameServer注册中心帮客户端找到 Broker Message消息本身 TagTopic 下面的二级分类 QueueTopic 内部的队列分片下面一个个讲。4. Topic 是什么Topic 是消息的分类。比如你有这些业务订单消息 支付消息 优惠券消息 库存消息你可以设计成order_topic pay_topic coupon_topic stock_topicTopic 就像一个“频道”。生产者发送消息时要指定发到哪个 Topic。消费者订阅消息时也要指定监听哪个 Topic。例如订单系统发送消息到 order_topic 库存系统监听 order_topic 积分系统监听 order_topic 短信系统监听 order_topic只要有系统对订单消息感兴趣就订阅order_topic。Topic 的简单理解你可以这样记Topic 消息属于哪一类比如下单成功消息 - order_topic 支付成功消息 - pay_topic 优惠券过期消息 - coupon_topic5. Group 是什么Group 分两种Producer Group Consumer Group但实际开发里你最需要理解的是Consumer Group。5.1 Producer Group 是什么Producer Group 是生产者组。它表示一类发送消息的生产者。比如订单服务有多个实例order-service-1 order-service-2 order-service-3它们都负责发送订单消息可以属于同一个 Producer Grouporder_producer_group小白阶段不用太纠结 Producer Group它更多是标识生产者身份。5.2 Consumer Group 是什么Consumer Group 是消费者组。它非常重要。它表示一组消费者共同消费同一类消息。比如库存服务部署了 3 台机器stock-service-1 stock-service-2 stock-service-3它们都属于stock_consumer_group那么一条消息只会被这个组里的其中一个实例消费。也就是说order_topic 有一条消息用户A下单了 stock-service-1 消费 stock-service-2 不消费 stock-service-3 不消费这样可以分摊压力。6. 一个 Topic 可以被多个 Group 消费吗可以而且这是 RocketMQ 很重要的地方。假设订单系统发了一条消息Topic: order_topic 消息内容: 用户A下单成功现在有三个系统都想处理这条消息库存系统扣库存 积分系统加积分 短信系统发短信它们应该用不同的 Consumer Groupstock_consumer_group point_consumer_group sms_consumer_group这样这条消息会被每个 Group 都消费一次。也就是stock_consumer_group 消费一次 point_consumer_group 消费一次 sms_consumer_group 消费一次但是在同一个 Group 内部只会有一个消费者实例消费这条消息。7. Topic 和 Group 的关系这是最容易混乱的地方。你可以这样理解Topic消息分类 Group谁来消费这一类消息举个例子Topic: order_topic Consumer Group: - stock_group库存系统消费 - sms_group短信系统消费 - point_group积分系统消费关系图订单系统 | | 发送订单消息 v order_topic | |---- stock_group - 扣库存 | |---- sms_group - 发短信 | |---- point_group - 加积分所以同一个 Topic 可以被多个 Group 订阅。 不同 Group 都能拿到同一份消息。 同一个 Group 内部多个消费者是竞争消费。8. Consumer Group 最重要的规则假设Topic order_topic Consumer Group stock_group如果你启动了 3 个库存服务实例stock-service-1 stock-service-2 stock-service-3它们都用同一个stock_group。那么消息会被负载均衡消息1 - stock-service-1 消息2 - stock-service-2 消息3 - stock-service-3 消息4 - stock-service-1这叫集群消费。默认常用的就是这种。如果你想让每个实例都收到同一条消息那叫广播消费。比如消息1 - stock-service-1 消息1 - stock-service-2 消息1 - stock-service-3但业务开发中更常用的是集群消费。9. Tag 是什么Tag 是 Topic 下面更细的分类。比如你有一个 Topicorder_topic但是订单消息里面又分下单成功 订单取消 订单超时 订单完成可以用 Tagorder_topic: create order_topic: cancel order_topic: timeout order_topic: finish消费者可以只订阅自己关心的 Tag。比如库存系统只关心order_topic 下的 create 和 cancel短信系统只关心order_topic 下的 create简单记Topic 大分类 Tag 小分类10. Message 是什么Message 就是消息本身。一般包括Topic Tag Key Body例如{topic:order_topic,tag:create,key:order_10001,body:{orderId:10001,userId:20001,amount:99.9}}其中Topic发到哪个主题 Tag消息小分类 Key消息唯一标识方便排查 Body真正的业务数据11. Broker 是什么Broker 是 RocketMQ 里真正存消息的服务器。生产者发送消息实际上是发给 Broker。消费者消费消息也是从 Broker 拉消息。Producer - Broker - Consumer如果说 RocketMQ 是快递系统那么 Broker 就是快递仓库。12. NameServer 是什么NameServer 类似注册中心。它的作用是告诉 Producer 和 ConsumerBroker 在哪里。因为生产者和消费者并不知道 Broker 地址所以它们先连接 NameServer。Producer - NameServer请问 order_topic 在哪个 Broker NameServer - Producer在 Broker-A Producer - Broker-A发送消息你可以把 NameServer 理解成“地址簿”。13. Queue 是什么一个 Topic 内部会分成多个 Queue。比如order_topic - queue0 - queue1 - queue2 - queue3为什么要分多个 Queue为了提高并发能力。如果只有一个队列一个消费者慢慢消费速度有限。多个 Queue 可以让多个消费者并行消费。queue0 - consumer1 queue1 - consumer2 queue2 - consumer3 queue3 - consumer4小白阶段你不用主动操作 Queue知道 Topic 内部有多个队列就行。14. RocketMQ 的整体结构完整流程大概是NameServer负责发现 Broker Broker负责存消息 Producer发送消息 Consumer消费消息 Topic消息分类 Group生产者/消费者分组整体图NameServer ^ | 查询 Broker 地址 | Producer ----- Broker ----- Consumer | | | 发送消息 存消息 拉取消息 | Topic Tag Body15. 开发中怎么设计 Topic 和 Group假设你做一个优惠券系统。业务有优惠券创建 优惠券领取 优惠券使用 优惠券过期可以设计 Topiccoupon_topic然后用不同 Tagcreate receive use expire比如优惠券过期消息Topic: coupon_topic Tag: expire Body: {couponId: 1001}消费者coupon_expire_consumer_group它监听coupon_topic:expire到时间后消费消息把优惠券状态改成已过期。16. RocketMQ 如何引入以 Spring Boot 为例常见方式是引入 RocketMQ Spring Boot Starter。Maven 依赖一般类似这样dependencygroupIdorg.apache.rocketmq/groupIdartifactIdrocketmq-spring-boot-starter/artifactIdversion2.3.0/version/dependency版本要根据你的 Spring Boot 和 RocketMQ 服务端版本调整。17. 配置 application.yml比如rocketmq:name-server:127.0.0.1:9876producer:group:order_producer_group这里name-serverNameServer 地址 producer.group生产者组名18. 生产者怎么发消息在 Spring Boot 里可以用RocketMQTemplate。RestControllerRequestMapping(/order)publicclassOrderController{privatefinalRocketMQTemplaterocketMQTemplate;publicOrderController(RocketMQTemplaterocketMQTemplate){this.rocketMQTemplaterocketMQTemplate;}PostMapping(/create)publicStringcreateOrder(){// 1. 模拟订单创建成功StringorderId10001;// 2. 发送订单创建消息rocketMQTemplate.convertAndSend(order_topic:create,订单创建成功订单IDorderId);return下单成功;}}这里order_topic:create表示Topic order_topic Tag create19. 消费者怎么接收消息写一个监听器ComponentRocketMQMessageListener(topicorder_topic,consumerGroupstock_consumer_group,selectorExpressioncreate)publicclassStockConsumerimplementsRocketMQListenerString{OverridepublicvoidonMessage(Stringmessage){System.out.println(库存系统收到订单消息message);// 这里可以写扣库存逻辑}}解释一下topicorder_topic表示监听订单主题。consumerGroupstock_consumer_group表示这个消费者属于库存消费者组。selectorExpressioncreate表示只消费 Tag 为create的消息。20. 一个完整小例子订单系统发消息rocketMQTemplate.convertAndSend(order_topic:create,用户下单成功订单ID10001);库存系统消费消息RocketMQMessageListener(topicorder_topic,consumerGroupstock_consumer_group,selectorExpressioncreate)publicclassStockConsumerimplementsRocketMQListenerString{OverridepublicvoidonMessage(Stringmessage){System.out.println(扣库存message);}}短信系统消费消息RocketMQMessageListener(topicorder_topic,consumerGroupsms_consumer_group,selectorExpressioncreate)publicclassSmsConsumerimplementsRocketMQListenerString{OverridepublicvoidonMessage(Stringmessage){System.out.println(发短信message);}}注意这两个消费者用了不同的 Consumer Groupstock_consumer_group sms_consumer_group所以同一条订单消息库存系统和短信系统都能收到。21. 如果两个消费者用了同一个 Group 会怎样比如consumerGrouporder_consumer_group两个消费者都用这个组。那么同一条消息只会被其中一个消费者收到。消息1 - 消费者A 消息2 - 消费者B 消息3 - 消费者A这叫负载均衡。所以千万记住不同业务系统要用不同 Consumer Group。 同一个业务系统的多个实例用同一个 Consumer Group。这是面试和实战都很重要的一句话。22. RocketMQ 有哪些常见消息类型1普通消息最常用。订单创建后发送一条订单消息2延迟消息消息不是立刻消费而是过一段时间再消费。比如优惠券过期优惠券 20 小时后过期可以发送延迟消息20 小时后消费者才收到消息然后消费者把优惠券状态改为过期。这就是你之前说的优惠券过期方案里可能会用到的方式。3顺序消息保证消息按顺序消费。比如订单状态变化创建订单 - 支付订单 - 发货 - 完成这些消息最好按照顺序消费。4事务消息解决“本地事务”和“发消息”一致性问题。比如订单创建成功后必须发消息通知库存系统如果订单创建成功了但消息发送失败就会出问题。事务消息就是用来保证这类场景的一致性。23. RocketMQ 使用中的几个重要问题1消息会不会重复消费会。RocketMQ 不能保证业务层面绝对只消费一次。所以消费者代码要做幂等。幂等是什么意思就是同一条消息消费多次结果也一样。比如扣库存时不能简单写库存 库存 - 1否则重复消费就会多扣。应该记录这条订单是否已经扣过库存如果订单10001已经扣过库存就不要重复扣2消息消费失败怎么办如果消费者抛异常RocketMQ 会重试。比如OverridepublicvoidonMessage(Stringmessage){thrownewRuntimeException(消费失败);}RocketMQ 会认为这条消息没有消费成功后面会重新投递。所以你的消费逻辑要注意成功就正常返回 失败就抛异常3消息堆积是什么如果生产者发消息太快消费者处理太慢消息就会越积越多。这叫消息堆积。比如每秒产生 10000 条消息 每秒只能消费 1000 条消息剩下的消息就会堆积在 Broker。解决方式增加消费者实例 优化消费逻辑 增加 Topic 队列数 拆分业务 Topic24. 面试怎么回答 Topic 和 Group你可以这样说Topic 是 RocketMQ 中消息的一级分类生产者发送消息时需要指定 Topic消费者通过订阅 Topic 来消费消息。Group 分为 Producer Group 和 Consumer Group。实际开发中更常用的是 Consumer Group它表示一组消费者实例。同一个 Consumer Group 内部是竞争消费一条消息只会被组内一个消费者消费不同 Consumer Group 之间是独立消费同一条消息可以被多个不同业务组分别消费。所以一般不同业务系统使用不同 Consumer Group同一业务系统的多个实例使用同一个 Consumer Group。这段可以背下来。25. 小白最容易记混的点Topic 不是消费者Topic 只是消息分类。order_topic 不是订单服务 order_topic 是订单消息的分类Group 不是 Topic 的子分类Group 表示消费者身份不是消息分类。Topic 消息是什么 Group 谁来消费Tag 才是 Topic 下面的小分类Topic order_topic Tag create / cancel / pay / finish26. 你可以这样记Producer发消息的人 Consumer收消息的人 Topic消息大分类 Tag消息小分类 Group一组生产者或消费者 Broker存消息的服务器 NameServer帮你找 Broker 的地址簿 QueueTopic 内部的并发队列 Message真正传递的数据27. 最后用一句话串起来比如订单创建成功订单服务作为 Producer 把一条 order_topic:create 消息发送到 Broker Broker 负责保存消息 库存服务、短信服务、积分服务作为不同 Consumer Group 分别订阅 order_topic 收到消息后执行扣库存、发短信、加积分等逻辑。 NameServer 负责告诉生产者和消费者 Broker 在哪里。你现在先重点记这三个关系就够了Topic消息分类 TagTopic 下的小分类 Consumer Group消费者分组以及这句同一个 Group 内部一条消息只给一个消费者 不同 Group 之间同一条消息可以各消费一遍。这就是 RocketMQ 入门里最核心的东西。

相关新闻