消息队列的pull与push模式理解
来源:互联网 发布:linux百度翻译 编辑:程序博客网 时间:2024/06/06 09:31
错误理解
之所以将这个标题,定义为错误理解,原因就是无法真正的说服自己;
消息队列的模式有两种pull与push.先说说我之前的理解:
- pull模式指,客户端连接上broker之后,主动发起方法调用获取远程的结果,说的直白一点就是一次RPC调用,即同步方法调用;
push模式:
客户端与broker建立连接,当有消息进入broker,broker进行消息推送至所有的连接客户端,即异步方法调用;但是真正的实现中broker一般是很难维护这么多长连接,那么它又是如何实现push的呢?
activemq的pull与push模式实现方式
今天有时间,于是打开了activemq 的5.14.x的代码,一探究竟。对于activemq的代码我不作描述,本文主是为了纠正思想。对于消息队列pull与push模式的实现方式如下:
pull模式
客户端(指一个connection,一般情况指一个tcp的连接建立)连接到broker之后,启动一个线程,这个线程的任务就是循环调用方法从broker中拉取相应的消息至本地。如果是同步方法调用获取则将相应的消息存放在本地内存中,当同步方法消费消息时,则从该内存区中直接获取相应的消息进行消费;
push模式
客户端连接到broker之后,启动一个线程,这个线程的任务就是循环调用方法从broker中拉取相应的消息至本地。如果是异步方法调用,则直接调用监听器方法,间接调用业务消费消息的方法,而不使用本地内存进行消息的缓存;所以这里的异步只是客户端的异步,而非broker的主动推送。通过这种方式既能解决多客户端的连接,也能解决类似服务端的push型的消息推送。在互联网中这种实现才具有普便性,因为这种方式即解决了性能问题又解决了异步消息的需求。
通过对于pull与push的模式对比,可以非常清晰的理解如下问题:
- 为什么在互联网上大吞吐量的消息队列都是采用pull模式,而非broker push模式?
- 为什么采用broker push模式,由于消费端的性能会影响整个消息队列服务器的性能?
- 为什么采用broker push模式,容易造成broker的消息积压?
总结
对于网络的理解没有深刻认识,就会造成一种想当然的认识,然后自己就会进行一个误区,以至于问题无法解决。那么换一个思路则山重水复疑无路,柳暗花明又一村。
思路决定出路…
- 消息队列的pull与push模式理解
- 消息系统该Push/Pull模式分析
- 消息系统该Push/Pull模式分析
- 消息系统该Push/Pull模式分析
- 消息系统该Push/Pull模式分析
- 消息系统该Push/Pull模式分析
- 消息系统该Push/Pull模式分析
- 消息系统该Push/Pull模式分析
- 水晶报表的PUSH模式与 PULL模式
- [水晶报表]PUSH与PULL模式
- 消息推送分类:推动(Push)模式和拉动(Pull)模式
- NetMQ Pull-Push 消息模式 + 多线程 + 序列化
- pull、push模式的Report应用
- 关于push和pull模式的说明
- 微博feed系统的push,pull模式
- zeromq push-pull 模式
- js队列方法push()、shift()与pop()、unshift()的理解
- Android消息机制-深入理解消息队列的工作模式
- TCP/IP 详解卷一学习笔记(四):TCP 连接建立与终止
- QT一些error(C1057、LNK2019、C2146、C3861)的解决
- 通过jQuery Ajax使用FormData对象上传文件
- leetcode 125. Valid Palindrome | 回文string
- 通向架构师的道路(第六天)之漫谈基于数据库的权限系统的设计
- 消息队列的pull与push模式理解
- HDU 4971 A simple brute force problem
- find the longest of the shortest
- ThinkPHP5 支付宝支付扩展库(超简单,超好用~)
- 解决Gosn在集合中int自动转换为duble类型
- char *s 和 char s[] 的区别小结
- druid 的filter设计原理
- C++ 整数与字符串相互转化
- TCP/IP 详解卷一学习笔记(五):TCP 成块数据流