大家好,又见面了,我是你们的朋友全栈君。
1.Push推送方式(即Server端推送消息给client):
当Server收到消息发送者发送过来的消息后,Server端主动把消息推送给client,这个方式实时性比较好,但是增加了Server的工作负担,对Server的性能造成影响;另外Client如果不能够及时处理Server推送的消息,也是很大的问题。
2.Pull拉取方式(即Client从Server拉取消息):
Client循环的从Server拉取消息,由client控制着主动权。弊端:拉取消息的时间间隔不好设定,间隔太短循环空拉取造成资源浪费,间隔时间太长,就会增加消息消费的延迟,影响业务使用。另外需要Client拉取消息时维护offset,代码比较麻烦。
3.长轮询的消费方式
RocketMQ的消息消费方式,采用了“长轮询”方式,兼具了Push和Pull的有点,不过需要Server和Client的配合才能够实现。
即Client发送消息请求,Server端接受请求,如果发现Server队列里没有新消息,Server端不立即返回,而是持有这个请求一段时间(通过设置超时时间来实现),在这段时间内轮询Server队列内是否有新的消息,如果有新消息,就利用现有的连接返回消息给消费者;如果这段时间内没有新消息进入队列,则返回空。
这样消费消息的主动权既保留在Client端,也不会出现Server积压大量消息后,短时间内推送给Client大量消息使client因为性能问题出现消费不及时的情况。
长轮询的弊端:在持有消费者请求的这段时间,占用了系统资源,因此长轮询适合客户端连接数可控的业务场景中。
参考资料:《RocketMQ实战与原理解析》
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/149529.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...