当前位置: 首页 > news >正文

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

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

转载于:https://www.cnblogs.com/920913cheng/p/10573810.html

相关文章:

  • Python基础之集合
  • vue父组件给子组件传值:属性的形式
  • Vue项目通过JSSDK调用微信分享接口
  • Linux启动/停止/重启Mysql数据库的方法
  • 基于注解的AOP配置
  • python-day2-变量
  • 同步IO、异步IO、阻塞IO、非阻塞IO之间的联系与区别
  • 生产巡检
  • Android 内存监测工具 DDMS
  • Go语言介绍
  • 多态的应用-例子
  • Redis实战 - 3.Hash
  • session的使用
  • C++ string使用
  • 外连接查询
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • AHK 中 = 和 == 等比较运算符的用法
  • ECMAScript6(0):ES6简明参考手册
  • Git 使用集
  • JavaScript 奇技淫巧
  • Java多态
  • Octave 入门
  • passportjs 源码分析
  • php面试题 汇集2
  • Python学习之路16-使用API
  • swift基础之_对象 实例方法 对象方法。
  • vue:响应原理
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 前端工程化(Gulp、Webpack)-webpack
  • 驱动程序原理
  • 如何解决微信端直接跳WAP端
  • 手写一个CommonJS打包工具(一)
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • !!Dom4j 学习笔记
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #git 撤消对文件的更改
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转)Oracle存储过程编写经验和优化措施
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • .a文件和.so文件
  • .bat文件调用java类的main方法
  • .net 8 发布了,试下微软最近强推的MAUI
  • .Net 8.0 新的变化
  • .net core 连接数据库,通过数据库生成Modell
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NET构架之我见
  • .net和php怎么连接,php和apache之间如何连接
  • .net下的富文本编辑器FCKeditor的配置方法
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国