zoukankan      html  css  js  c++  java
  • ActiveMQ( 一) 同步,异步,阻塞 JMS 消息模型

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

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

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

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

  • 相关阅读:
    AtCoder Beginner Contest 183
    Codeforces Round #682 (Div. 2)【ABCD】
    Codeforces Round #680 (Div. 2, based on Moscow Team Olympiad)【ABCD】
    Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020
    Educational Codeforces Round 97 (Rated for Div. 2) E. Make It Increasing(最长非下降子序列)
    Educational Codeforces Round 97 (Rated for Div. 2)【ABCD】
    Codeforces Round #678 (Div. 2)【ABCD】
    2019 China Collegiate Programming Contest Qinhuangdao Onsite F. Forest Program(DFS计算图中所有环的长度)
    什么是HTTP隧道,怎么理解HTTP隧道呢?
    Linux查看和关闭后台运行程序的方法
  • 原文地址:https://www.cnblogs.com/920913cheng/p/10573810.html
Copyright © 2011-2022 走看看