ActiveMQ( 一) 同步,异步,阻塞 JMS 消息模型

同步请求:浏览器 向服务器 发送一个登陆请求,若是服务器 没有及时响应,则浏览器则会一直等待状态,直至服务器响应或者超时。java

异步请求:浏览器 向服务器 发送一个登陆请求,无论服务器是否当即响应,浏览器不须要等待。数据库

 在java中,在多线程的状况,也有同步,异步 阻塞的说法,多线程的状况,加了同步关键字synchronized之后,当一个线程正在执行一个方法的时候,其他线程想要执行该方法则须要等待当前正在执行的线程 执行完之后,这个过程其余线程就是阻塞状态。浏览器

同步请求,浏览器--->服务器,若是服务器有延迟,则 浏览器 会一直等待,等待服务器的响应或者Http超时,若是在一些实际项目中,例如,A 项目调用B 项目,同步请求,B 因为网络缘由或者说查询数据库过慢,致使 A 项目调用超时,则可能A 会重复提交。缓存

同步请求的缺点:超时,阻塞,数据可能重复提交服务器

以上 能够看出:网络

在客户端与服务器进行通信时.客户端调用后,必须等待服务对象完成处理返回结果才能继续执行。客户端与服务器对象的生命周期紧密耦合,客户端进程和服务对象进程都都必须正常运行;若是因为服务对象崩溃或者网络故障致使用户的请求不可达,客户端会受到异常多线程


在这种状况下,可使用消息中间件
并发

什么是消息中间件异步

发送者将消息发送给消息服务器,消息服务器将消息存放到队列中,在合适的时候再将消息转发给接收者,发送者将消息发送给队列的时候,不须要关注接收者是否接受消息,也不须要等待接收者的响应,接收者处理消息的时候,一样也不须要关注 发送者是否正常运行。这种模式下,发送和接收是异步的,发送者无需等(异步通信)高并发

消息中间件的通信方式:JMS 

JMS是java的消息服务,JMS的客户端之间能够经过JMS服务进行异步的消息传输。

JMS有两种消息模型:点对点 和点对多(发布订阅)

  点对点消息模型

   生产者:向队列发送消息的一方(提供接口)

   消费者:向队列获取消息的一方(调用接口)

   消息队列:存放消息的地方(能够作持久化)

生产者向消息队列发送消息,若是消费者在,则从消息队列获取消息消费,消费成功之后,该消息在队列中清除,若是消费者不在,生产者生成的消息则会缓存到到队列之中 ,根据这个特性,能够知道中间件能够解决高并发,对消息 缓存排队,在高并发的状况下,大量的消息会缓存到队列中,消费者能够根据本身的须要选择一次性消费多少条数据,而不是直接将全部的消息 直接发送给消费者。

点对点模型特色:

 

  1. 每一个消息只有一个消费者(即一旦被消费,消息就再也不在消息队列中)
  2. 发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息以后,无论接收者有没有正在运行,它不会影响到消息被发送到队列
  3. 接收者在成功接收消息以后需向队列应答成功

 因此若是但愿发送的每一个消息都应该被成功处理的话

 

 

在点对点中 一个消息只能被一个消费者消费,一旦消费成功,该消息就从队列中清除,若是不清除,则可能出现重复消费的状况

  点对多 (发布与订阅)

  发布者:

    主题:

 订阅者:

 

客户端将消息发送到主题。多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。

点对多特色:

1 .发布者发布到主题的消息能够被多个订阅者订阅消费

发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须建立一个订阅者以后,才能消费发布者的消息,并且为了消费消息,订阅者必须保持运行的状态。

为了缓和这样严格的时间相关性,JMS容许订阅者建立一个可持久化的订阅。这样,即便订阅者没有被激活(运行),它也能接收到发布者的消息。

若是你但愿发送的消息能够不被作任何处理、或者被一个消息者处理、或者能够被多个消费者处理的话,那么能够采用点对多模型

在JMS中,消息的产生和消息是异步的。对于消费来讲,JMS的消息者能够经过两种方式来消费消息。 

○ 同步 
订阅者或接收者调用receive方法来接收消息,receive方法在可以接收到消息以前(或超时以前)将一直阻塞 
○ 异步 
订阅者或接收者能够注册为一个消息监听器。当消息到达以后,系统自动调用监听器的onMessage方法。

能够理解成广播,或者电视的场景

相关文章
相关标签/搜索