ActiveMQ( 一) 同步,异步,阻塞 JMS 消息模型
同步请求:浏览器 向服务器 发送一个登录请求,如果服务器 没有及时响应,则浏览器则会一直等待状态,直至服务器响应或者超时。
异步请求:浏览器 向服务器 发送一个登录请求,不管服务器是否立即响应,浏览器不需要等待。
在java中,在多线程的情况,也有同步,异步 阻塞的说法,多线程的情况,加了同步关键字synchronized以后,当一个线程正在执行一个方法的时候,其余线程想要执行该方法则需要等待当前正在执行的线程 执行完以后,这个过程其他线程就是阻塞状态。
同步请求,浏览器--->服务器,如果服务器有延迟,则 浏览器 会一直等待,等待服务器的响应或者Http超时,如果在一些实际项目中,例如,A 项目调用B 项目,同步请求,B 由于网络原因或者说查询数据库过慢,导致 A 项目调用超时,则可能A 会重复提交。
同步请求的缺点:超时,阻塞,数据可能重复提交
以上 可以看出:
在客户端与服务器进行通讯时.客户端调用后,必须等待服务对象完成处理返回结果才能继续执行。客户端与服务器对象的生命周期紧密耦合,客户端进程和服务对象进程都都必须正常运行;如果由于服务对象崩溃或者网络故障导致用户的请求不可达,客户端会受到异常
在这种情况下,可以使用消息中间件
什么是消息中间件:
发送者将消息发送给消息服务器,消息服务器将消息存放到队列中,在合适的时候再将消息转发给接收者,发送者将消息发送给队列的时候,不需要关注接收者是否接受消息,也不需要等待接收者的响应,接收者处理消息的时候,同样也不需要关注 发送者是否正常运行。这种模式下,发送和接收是异步的,发送者无需等(异步通讯)
消息中间件的通讯方式:JMS
JMS是java的消息服务,JMS的客户端之间可以通过JMS服务进行异步的消息传输。
JMS有两种消息模型:点对点 和点对多(发布订阅)
点对点消息模型
生产者:向队列发送消息的一方(提供接口)
消费者:向队列获取消息的一方(调用接口)
消息队列:存放消息的地方(可以做持久化)
生产者向消息队列发送消息,如果消费者在,则从消息队列获取消息消费,消费成功以后,该消息在队列中清除,如果消费者不在,生产者生成的消息则会缓存到到队列之中 ,根据这个特性,可以知道中间件可以解决高并发,对消息 缓存排队,在高并发的情况下,大量的消息会缓存到队列中,消费者可以根据自己的需要选择一次性消费多少条数据,而不是直接将所有的消息 直接发送给消费者。
点对点模型特点:
- 每个消息只有一个消费者(即一旦被消费,消息就不再在消息队列中)
- 发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行,它不会影响到消息被发送到队列
- 接收者在成功接收消息之后需向队列应答成功
所以如果希望发送的每个消息都应该被成功处理的话
在点对点中 一个消息只能被一个消费者消费,一旦消费成功,该消息就从队列中清除,如果不清除,则可能出现重复消费的情况
点对多 (发布与订阅)
发布者:
主题:
订阅者:
客户端将消息发送到主题。多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。
点对多特点:
1 .发布者发布到主题的消息可以被多个订阅者订阅消费
发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息,而且为了消费消息,订阅者必须保持运行的状态。
为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。
如果你希望发送的消息可以不被做任何处理、或者被一个消息者处理、或者可以被多个消费者处理的话,那么可以采用点对多模型
在JMS中,消息的产生和消息是异步的。对于消费来说,JMS的消息者可以通过两种方式来消费消息。
○ 同步
订阅者或接收者调用receive方法来接收消息,receive方法在能够接收到消息之前(或超时之前)将一直阻塞
○ 异步
订阅者或接收者可以注册为一个消息监听器。当消息到达之后,系统自动调用监听器的onMessage方法。
可以理解成广播,或者电视的场景
ActiveMQ( 一) 同步,异步,阻塞 JMS 消息模型的更多相关文章
- (转)同步异步,阻塞非阻塞 和nginx的IO模型
同步异步,阻塞非阻塞 和nginx的IO模型 原文:https://www.cnblogs.com/wxl-dede/p/5134636.html 同步与异步 同步和异步关注的是消息通信机制 (sy ...
- 哪5种IO模型?什么是select/poll/epoll?同步异步阻塞非阻塞有啥区别?全在这讲明白了!
系统中有哪5种IO模型?什么是 select/poll/epoll?同步异步阻塞非阻塞有啥区别? 本文地址http://yangjianyong.cn/?p=84转载无需经过作者本人授权 先解开第一个 ...
- {Python之进程} 背景知识 什么是进程 进程调度 并发与并行 同步\异步\阻塞\非阻塞 进程的创建与结束 multiprocess模块 进程池和mutiprocess.Poll
Python之进程 进程 本节目录 一 背景知识 二 什么是进程 三 进程调度 四 并发与并行 五 同步\异步\阻塞\非阻塞 六 进程的创建与结束 七 multiprocess模块 八 进程池和mut ...
- 操作系统介绍-操作系统历史,IO,进程的三态,同步异步阻塞非阻塞
1.操作系统历史 2.进程,IO,同步异步阻塞非阻塞 操作系统历史: 手工操作: 1946年第一台计算机诞生--20世纪50年代中期,计算机工作还在采用手工操作方式.此时还没有操作系统的概念. 手工操 ...
- Java IO 学习(一)同步/异步/阻塞/非阻塞
关于IO,同步/异步/阻塞/非阻塞,这几个关键词是经常听到的,譬如: “Java oio是阻塞的,nio是非阻塞的” “NodeJS的IO是异步的” 但是这些东西听多了就容易迷糊,比方说同步是否就是阻 ...
- 进程&线程 同步异步&阻塞非阻塞
2015-08-19 15:23:38 周三 线程 线程安全 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码 线程安全问题都是由全局变量及静态变量引起的 若每个线程中对 ...
- python 并发编程 操作系统 进程 并发.并行 及 同步/异步,阻塞/非阻塞
操作系统: 多道技术背景: 提高工作效率(充分利用IO阻塞的时间) 同时执行多个任务 多道技术 空间复用:充分的利用内存空间 时间复用:充分利用IO阻塞时间 分时系统: 并发:提高了程序的工作效率 两 ...
- GIL 线程池 进程池 同步 异步 阻塞 非阻塞
1.GIL 是一个全局解释器锁,是一种互斥锁 为什么需要GIL锁:因为一个python.exe进程中只有一份解释器,如果这个进程开启了多个线程都要执行代码 多线程之间要竞争解释器,一旦竞争就有可能出现 ...
- python 之 并发编程(进程池与线程池、同步异步阻塞非阻塞、线程queue)
9.11 进程池与线程池 池子使用来限制并发的任务数目,限制我们的计算机在一个自己可承受的范围内去并发地执行任务 池子内什么时候装进程:并发的任务属于计算密集型 池子内什么时候装线程:并发的任务属于I ...
随机推荐
- wpf 命令
上图为命令的 示例
- VUE处理 组件赋值 watch 监听不到赋值问题
开发中,遇到了一个BUG,做的页面类似于 导航切换效果.两个组件传值. 上方导航组件 (主动) 左侧导航组件 (被动) 点击上方导航,左侧导航实现变换对应的栏目. 实现过程中,遇到了点问题.左 ...
- ul li data-* 数据的读取
<ul class="questions"> <li> <div class="question">1.您的年龄是?< ...
- html网页调用本地exe程序的实现方法:
html网页调用本地exe程序的实现方法:1.新建注册表具体文件: Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\hhtpexe] [ ...
- 神州数码策略路由(PBR)配置
实验要求:掌握PBR配置的方法 拓扑如下 R1 enable 进入特权模式 config 进入全局模式 hostname R1 修改名称 interface s0/1 进入端口 ip address ...
- WEB学习笔记4-前端代码基本命名规法和格式规范
1.HTML命名规范及格式规范 标签名和属性应该都小写,虽然HTML代码不区分大小写:属性值应该用双引号闭合. <IMG src=demo.jpg alt='test'/>(N) < ...
- Beta冲刺第二周王者荣耀交流协会第六次会议
1.立会照片 成员:王超,高远博,冉华,王磊,王玉玲,任思佳,袁玥全部到齐. master:任思佳 2.时间跨度: 2017年11月22日 12:00 — 12:20,总计20分钟. 3.地点: 一食 ...
- git教程:工作区和暂存区
Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念. 先来看名词解释. 工作区(Working Directory) 就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工 ...
- 七、Django模型基础第二节——常用查询
1 常用的模型字段类型 官方文档链接: https://docs.djangoproject.com/en/2.1/ref/models/fields/#field-types 常用的字段类型 模型字 ...
- linux下mysql的启动与关闭
1.查看mysql版本 方法一:status; 方法二:select version(); 2.Mysql启动.停止.重启常用命令 a.启动方式 1.使用 service 启动: [root@loca ...