消息队列的pull与push模式理解

错误理解

之所以将这个标题,定义为错误理解,原因就是无法真正的说服自己;

消息队列的模式有两种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的消息积压?

总结

对于网络的理解没有深刻认识,就会造成一种想当然的认识,然后自己就会进行一个误区,以至于问题无法解决。那么换一个思路则山重水复疑无路,柳暗花明又一村。

思路决定出路…

你可能感兴趣的:(java)