👏大家好!我是和风coding,希望我的文章能给你带来帮助!
🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
📝点击 我的主页 还可以看到和风的其他内容噢,更多内容等你来探索!
📕欢迎参观我的个人网站:Gentlewind
什么是推拉模式
一般 MQ 都由三部分组成:
- producer:发布消息
- broker:MQ 所在服务器的总称,可以理解为消息存储的地方
- consumer:处理消息
producer 和 broker 之间的通讯方式就是推模式,由客户端主动发送消息到消息队列中。
而 consumer 和 broker 之间的通讯方式则有推和拉两种模式。
推模式
当 producer 发布消息到 broker 后,broker 会马上自动推送消息给 consumer
broker 是主动推送消息的一方,而 consumer 是被动接受消息的
优点:
- 实时性好:因为 broker 在收到消息后会立刻推送到 consumer
- 简化了消费端的代码逻辑:消费端不需要额外增加拉去消息的逻辑
缺点:
- 忽视了消费端的消费能力:因为 broker 接收一个消息就推送给 consumer,当消息量非常大,而消费端的处理能力有限,消息就会堆积在消费端的内存中,最后压垮消费端
- 不能保证消息安全的到达消费端
拉模式
consumer 主动从 broker 拉取消息。
优点:
- 消费端可以根据自身的消费能力来拉取消息
- 适合批量消息的发送
缺点:
- 实时性较差:毕竟消费者是去拉取消息,消费者怎么知道消息到了呢,所以消费者能做的就是不断的去拉取,但是又不能频繁的去拉取,这样也耗费性能,因此就必须降低请求的频率,请求间隔时间也就意味着消息的延迟
- 性能消耗
总结
本质上来说,推拉两种模式的本质区别就是消息推送的主动权掌握在 broker 还是 consumer。
- 如果是 broker 主动推送,实时性好,但是容易忽略消费端的消费能力
- 如果是 consumer 主动拉取,可以让消费端根据消费能力自行消费,但是实时性较差,资源因为需要不断轮询会有所损耗
主流 MQ 的比较
中间件 | 推模型 | 拉模型 | 默认模式 |
---|---|---|---|
RabbitMQ | 支持 | 支持 | 推模式 |
Kafka | — | 支持(只有短轮询+长轮询) | 拉模式 |
RocketMQ | 支持 | 支持 | 拉模式 |