为什么要使用消息中间件:

   同步请求:当客户端向服务器发送一条请求的时候,此时服务器由于网络,或者处理一些比较大的数据的时候,可能有延迟,客户端 会处于一直等待的状态。只有等待服务器返回处理结果,或者请求超时,客户端才能继续执行

因此可以看出同步请求一些场景上面使用有些弊端:客户与服务器对象的生命周期紧密耦合,客户进程和服务对象进程都都必须正常运行;如果由于服务对象崩溃或者网络故障导致用户的请求不可达,客户会受到异常

在实际项目中有项目 A 它产生了 一系列的数据,需要将该数据存放到数据库,但是如果由A 项目 直接 存放到数据库,可能导致A项目执行变慢,所以想将A 项目产生的数据,交由 B 项目  然后由B 项目提交到数据库,B 提交数据库的时候,不管B 执行的时间或者成功失败,不影响A 的运行

实现这种情况,可以使用消息中间件。

什么是消息中间件:

消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。例如:A项目将数据发送给消息服务器,消息服务器将消息存放到队列之中,在合适的时候,消息服务器将消息发送给B 项目

这种模式下,发送和接收是异步的,发送者无需等待; 二者的生命周期未必相同: 发送消息的时候接收者不一定运行,接收消息的时候发送者也不一定运行;

什么是JMS

既然学习消息中间件,用的又是java,所以有必要知道JMS 是什么:JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。可以理解成:JMS是java的消息服务,JMS的客户端之间可以通过JMS服务进行异步的消息传输

JMS可以看成一种技术规范,接口

JMS支持两种消息模型:

点对点消息模型:

消息队列:存放消息(可以看成是一个地址)

生产者:产生消息的一端

消费者:接受消息的一端

生产者将消息发送到队列,消费者从队列中获取消息消费

点对点的特点:

1.生产者生产的消息只能被一个消费者消费,消费成功以后,则将该消息从队列中清除

2.生产者和消费者在时间上面没有什么关联,生产者生产消息的时候,消费者 可以不再,消费者消费消息的时候,不需要关注生产者是否存在

3.接收者在成功接收消息之后需向队列应答成功

发布订阅消息模型:

主题

发布者

订阅者

发布者将消息发布到主题中,订阅者订阅主题(可以有多个订阅者)

发布订阅特点:

1.每个消息可以有多个消费者

2.发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息,而且为了消费消息,订阅者必须保持运行的状态。为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。

如何理解 点对点 和点对消费时候的时间关联性:

点对点消息模型:生产者 生产消息存放到队列以后,如果消费者者此时 没有开启,运行。则消息不会被消费,会保存到队列之中,消费者 开启运行以后,则会从队列中拉取消息进行消费,正常情况,这条消息是保证会被消费者消费。

发对订阅:发布者发布消息的时候,订阅者 订阅了主题,还必须保证在运行,如果没有开启运行,则不会消费到这条消息,即使开启运行以后,也没法在消费该消息了。

如何选择JMS 哪种消息模型 进行传输消息:

如果你希望发送的每个消息都应该被成功处理的话,那么你需要点对点模式。

如果你希望发送的消息可以不被做任何处理、或者被一个消息者处理、或者可以被多个消费者处理的话,那么可以采用发布/订阅模型

在JMS中,消息的产生和消息是异步的。对于消费来说,JMS的消息者可以通过两种方式来消费消息。 
 同步消费:
订阅者或接收者调用receive方法来接收消息,receive方法在能够接收到消息之前(或超时之前)将一直阻塞 
异步 消费:
订阅者或接收者可以注册为一个消息监听器。当消息到达之后,系统自动调用监听器的onMessage方法。

消息中间件使用场景:

用户注册账号 服务器将数据存入数据库,然后在给用户发送短信或者邮件

设想 可以使用多线程技术:在创建一个线程来负责发送注册邮件,但是 如果发送失败 则没有后续的补偿机制。

此时可以考虑使用 消息中间件

从这样来看,使用消息中间件 可以降低响应的时间。

所以 学习 消息中间件是当前需要掌握的一种技能,消息中间件有很多产品 例如:RabbitMQ,Redis,ActiveMQ,Kafka/Jafka,学习一两种 傍身,讲述ActiveMQ的使用

ActiveMQ(为什么要使用消息中间件,JMS传输模型)的更多相关文章

  1. 以ActiveMQ为例JAVA消息中间件学习【1】

    前言 在慢慢的接触大型的javaweb的项目就会接触到很多的中间件系统. 其中消息中间件在很多场景下会被运用. 这里主要就对最近所学习到的消息中间件知识做一个笔记,为以后的实际运用打下一个良好的基础. ...

  2. ActiveMQ安装与入门程序 & JMS的消息结构

    1.Activemq安装 直接到官网下载:记住apache的官网是域名反过来,比如我们找activemq就是activemq.apache.org. 最新版本要求最低的JDK是8,所以最好在电脑装多个 ...

  3. Windows7 64位环境6sv2.1大气传输模型修改源码添加国产高分卫星GF-1 GF-2光谱响应支持

    下面开始添加国产卫星光谱响应的支持: 以下主要参考文章“6S大气传输模型修改源码添加.自定义卫星光谱响应(以HJ-1B CCD为例)”网址:http://blog.csdn.net/sam92/art ...

  4. JMS编程模型

    (1) ConnectionFactory创建Connection对象的工厂,针对两种不同的jms消息模型,分别有QueueConnectionFactory和TopicConnectionFacto ...

  5. 传输模型,网络层次划分,三次握手,四次挥手,IP与端口,套接字socket

    了解套接字之前,需要先了解基本的传输模型 其次,还需要了解网络的七层划分和四层结构 在python中,数据链路层相当于硬件层,python不需要了解,只用在传输层进行学习就足够了 其中,传输层分为TC ...

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

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

  7. ActiveMQ消息队列从入门到实践(1)—JMS的概念和JMS消息模型

    1. 面向消息的中间件 1.1 什么是MOM 面向消息的中间件,Message Oriented Middleware,简称MOM,中文简称消息中间件,利用高效可靠的消息传递机制进行平台无关的数据交流 ...

  8. ActiveMQ下载与安装(消息中间件JMS)

    下载 官方网站下载:http://activemq.apache.org/ 1.3.2安装(Linux) (1)将apache-activemq-5.12.0-bin.tar.gz 上传至服务器 (2 ...

  9. ActiveMQ 笔记(三)JMS规范和落地产品、小知识Broker

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.JMS规范概述 1.JavaEE 概述及主要核心规范 JavaEE是一套使用Java进行企业级应用开 ...

随机推荐

  1. python 解方程

    [怪毛匠子=整理] SymPy 库 安装 sudo pip install sympy x = Symbol('x') 解方程 solve([2 * x - y - 3, 3 * x + y - 7] ...

  2. curl传输数据时遇到的问题整理

    1.get传参,参数带有空格的传输方式 因为使用get传输的时候,有的参数可能存在有空格,为了避免传输是错误是字符替代“%20” 或者使用函数转译一下参数http_build_query($param ...

  3. hyperscan在低版本系统应用问题

    编译环境:centos6.3 32位/64位 由于hyperscan使用许多C++11特性,在低版本系统gcc版本不能编译.后来发现在runtime时也就是hs_scan时只需要依赖libhs_run ...

  4. postman设置环境变量

    postman属于一键式安装,不多赘述 1.设置环境变量 点击设置进入 添加环境变量 添加成功可选择 应用{{}}包住变量名即可 地址变化更换即可

  5. c指针存放的是常量的地址

    ''' #include <stdio.h> int main(){    int b = 1;    int c = 2;    int* a = &b;    printf(& ...

  6. HTTPS和HTTP(加密知识)

    什么是HTTPS? 基于安全套接字层的超文本传输协议(HTTP over SSL),一个Netscape开发的Web协议.HTTPS在HTTP应用层的基础上使用安全套接字层(或者升级版传输层安全,Tr ...

  7. MyEclipse2017创建Spring项目

    1.创建一个Web Project 2.右击项目-->Properties 3.搜索Spring -->Peoject Facets-->在右边找到Spring,打勾并保存 4.测试 ...

  8. redhat6.5 redis单节点多实例3A集群搭建

    在进行搭建redis3M 集群之前,首先要明白如何在单节点上完成redis的搭建. 单节点单实例搭建可以参看这个网:https://www.cnblogs.com/butterflies/p/9628 ...

  9. next()方法 执行下一个中间件 类似than

    next()方法出现在express框架中的中间件部分,由于node异步的原因,我们需要提供一种机制,当当前中间件工作完成之后,通知下一个中间件执行,因此一个基本的中间件应该是这种形式 var mid ...

  10. django使用ckeditor上传图片

    1.在模型类中设置字段为富文本类型,这里需要注意引入的是RichTextUploadingField,以允许上传图片,需要和RichTextField区分开 from ckeditor_uploade ...