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

时间:2024-02-19 09:46:51

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

异步请求:浏览器 向服务器 发送一个登录请求,不管服务器是否立即响应,浏览器不需要等待。

 在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方法。

可以理解成广播,或者电视的场景