[TOC] #### 1. 前言 --- 上一讲我们聊了 Producer,它负责发消息,发完就走,这一讲我们来看链条的另一端:Consumer(消费者)。 #### 2. 为什么 Consumer 要一直运行 --- 先想一个问题:Producer 发完消息就结束了,那谁来处理这些消息? 总得有一个程序一直在那等着,发现有新消息就取出来处理,这个程序就是 Consumer 它的特点是:启动之后不会退出,一直运行 #### 3. 代码怎么写 --- 运行之后你会看到: ```plaintext 等待消息中... ``` 然后程序就停在这了,不会退出,这时候如果 Producer 发一条消息过来,你立刻会看到: ```plaintext 等待消息中... 收到订单:1001 ``` #### 4. 为什么不能跑完就结束 --- 很多刚接触 RabbitMQ 的同学会问:「我能不能写一个脚本,每隔 10 秒去队列里查一下有没有新消息?」 技术上可以,但不推荐,原因很简单: + 不优雅:频繁轮询对 RabbitMQ 也是一种压力 + 延迟高:消息刚好在你查完之后进来,要等下一个 10 秒才能被处理 + 浪费资源: 每 10 秒查一次,大部分时候队列是空的,白跑一趟 正确的做法是让 Consumer 一直运行,RabbitMQ 有新消息会主动推过来 消费者不用反复去问「有消息吗?有消息吗?」,而是安静等着,消息来了自动触发 这就是「推模式」,RabbitMQ 主动把消息推给消费者 #### 5. Consumer 和 Producer 的区别 --- | 对比项 | Producer(生产者) | Consumer(消费者) | | -------- | ------------ | ---------- | | 生命周期 | 发完就结束 | 一直运行 | | 主动权 | 主动发消息 | 被动等消息 | | 数量 | 可以有很多个 | 可以有很多个 | | 运行方式 | 脚本执行一次 | 常驻进程 | Producer 就像你点外卖下单,下单完就关掉 App 了 Consumer 就像外卖骑手,一直在线等派单,有单就接,没单就等 #### 6. 消费者挂了怎么办 --- 既然 Consumer 要一直运行,那如果它突然挂了怎么办 ? 比如服务器重启了,或者代码报错了,这时候 RabbitMQ 会怎么做 ?消息会丢吗 ? 不会丢,但具体怎么保证的,我们下一讲再详细说 这里先记住一点:消息在队列里存着,消费者挂了不会影响消息本身 #### 7. 本文小结 --- Consumer 就是取消息、处理消息的程序,它的核心特点: + 常驻进程,启动后一直运行 + 推模式,RabbitMQ 有消息主动推过来,不用反复轮询 + 可以有多个,同一个队列可以有多个 Consumer 同时消费 记住一句话:Producer 发完就走,Consumer 一直值班 下一讲,我们来聊聊一个很现实的问题:消费者处理到一半挂了,消息怎么办 ?