push
优点
- 生产者主动推送给消费者,及时性很高
缺点
-
当消费者消费能力远低于生产者生产能力,那么一旦生产者推送大量消息到消费者时,就会导致消费者消息堆积,处理缓慢,甚至服务崩溃。(那么如何解决这个问题呢?需要mq提供流控制,也就是依据消费者消费能力做流控。比如rabbitmq设置Qos,限制消费数量。)
-
生产者需要维护和每个消费者之间的会话。
优化方案
不采用 http 长连接的方法保持会话,采用 socket 监听。
适用场景
对于数据实时性要求高的场景
pull
优点
-
消费者可以依据自己的消费能力进行消费
-
生产者不需要维护和消费者之间的会话。
缺点
- 拉取消息的间隔不太好设置。间隔太短,对服务器请求压力过大。间隔时间过长,那么必然会造成一部分数据的延迟。
- 实时性相对较低。
优化方案
长轮询:消费者如果尝试拉取失败,不是直接 return,而是保持连接 wait,服务端如果有新的消息到来,返回最新消息。
适用场景
对于生产者生产消息数据比较大时,而消费端处理比较复杂,消费能力相对较低