ActiveMQ-为什么需要消息中间件?
消息中间件的优势
UNIX的进程间通信就开始运用消息队列技术,一个进程将数据写入某个特定的队列中,其它进程可以读取队列中的数据,从而实现异步通信。对于如今的分布式系统,消息队列已经演变为独立的消息中间件产品,相比于RPC同步通信的方式来说有几个明显的优势:
- 低耦合,不管是程序还是模块之间,使用消息中间件进行间接通信。
- 消息的顺序性,消息队列可以保证消息的先进先出。
- 消息可靠传输,持久化的存储使得消息只有在被消费之后才会删除。
- 异步通信能力,相对于RPC来说,异步通信使得生产者和消费者得以充分执行自己的逻辑而无需等待。
- 缓冲能力,消息中间件像是一个巨大的蓄水池,将高峰期大量的请求存储下来慢慢交给后台进行处理,对于秒杀业务来说尤为重要。
但是异步通信也存在程序设计和编程方面的复杂,同时对于实时性要求较高的业务也不能采用异步通信,所以要根据业务具体分析。
J2EE和JEE是什么?
J2EE全称是Java to Enterprise Edition,是一套企业级技术规范,包含:JMS Servlet JSP EJB JPA 等。J2EE发展到1.5版本改名为JEE5,所以JEE是J2EE规范的延续。
消息中间件的发展历程
- J2EE时代,消息中间件强调企业级特性,比如消息持久化和事务性要求,全部遵循JMS规范。典型的ActiveMQ、HornetQ,后者现在已经发展成ActiveMQ Artemis子项目,这表明在Java/JEE领域ActiveMQ会继续发挥不可替代的作用。
- 后Java时代,随着消息中间件协议AMQP(Advanced Message Queuing Protocol)的诞生,最知名的AMQP消息中间件产品RabbitMQ也随之诞生,RabbitMQ基于Erlang开发,2007年诞生至今已经称为最流行的开源消息中间件产品,ActiveMQ于2013年也开始支持AMQP协议,后来Apache还推出了ActiveMQ Apollo的新项目,也实现了包括AMQP在内的多种协议。
- 互联网时代,设计思路上采用分布式系统设计理念,以LinkedIn开源的Kafka为代表,Kafka使用Scala编写,由于良好的水平扩展能力和高性能被广泛采用,同时诞生了一些高仿的类似产品如搜狐的Jafka,阿里的RocketMQ等。
JMS是什么?
JMS Java Message Service Java消息服务是J2EE架构中针对消息中间件的一组规范。JMS规范定义了Java中访问消息中间件的接口,但没有给予实现,具体实现交给消息中间件,称为JMS Provider,如ActiveMQ就是一个JMS Provider。简单说,没有实现这些接口的消息中间件就不能纳入J2EE(JEE)架构,Java程序也无法与其进行交互。
JMS的两种消息传送模型
JMS支持两种消息传送模型:点对点消息通信模型和发布订阅模型。
- 点对点(PTP)消息通信模型也可称之为队列模式,特定的一条消息只能被一个消费者消费。生产者将消息发送到指定的Queue当中,Broker(中间件)针对消息是否需要持久化进行持久化存储后通知消费者进行处理,消费者处理完毕后发送一个回执(Acknowledge)给Broker,Broker认为该消息已被正常消费,于是从持久化存储中删除该条消息。回执的发送逻辑内嵌在MQ的API中,无需主动调用。消费者通常可以通过两种方式获取新消息:PUSH和PULL。PUSH方式,由MQ收到消息后主动调用消费者的新消息通知接口,需要消耗MQ宝贵的线程资源,同时消费者只能被动等待消息通知;PULL方式,由消费者轮询调用MQ API去获取新消息,对应于ActiveMQ中的方法为consumer.receive(),不消耗MQ线程,消费者更加主动,虽然消费者的处理逻辑变得稍稍复杂。两种方式的根本区别在于线程消耗问题,由于MQ的线程资源相对客户端更加宝贵,PUSH方式会占用MQ过多的线程从而难以适应高并发的消息场景。同时当某一消费者离线一段时间再次上线后,大量积压消息处理会消耗大量MQ线程从而拖累其它消费者的消息处理,所以PULL方式相对来说更好。Kafka已经抛弃了PUSH模式,全面拥抱PULL模式。
- 发布/订阅模式(Pub/Sub)也可称之为主题模式,特定的一条消息可以被多个消费者所接收,只要消费者订阅了某个主题。消息生产者(发布者)将消息发送到某个称为主题(Topic)的虚拟通道中,Topic可以被多个消费者订阅,因此该模式类似于广播的方式。发布/订阅模式采用PUSH的方式传送消息,Subscriber只需保持在线即可。Subscriber分为临时性的和持久性的,当Sub离线时,MQ会为持久性的Sub持久化消息,当Sub恢复时会重新收到消息。但是既然采用Pub/Sub模式就表明允许部分消费者接收不到消息,所以通常会采用临时性的Subscriber而不是持久性的。
ActiveMQ-为什么需要消息中间件?的更多相关文章
- 第01节:ActiveMQ入门和消息中间件
1.ActiveMQ最主要的功能:实现JMS Provider,用来帮助实现高可用.高性能.可伸缩.易用和安全的企业级面向消息服务的系统.是一个异步的功能. 2.ActiveMQ特点: 完全支持JMS ...
- 手把手教你如何玩转消息中间件(ActiveMQ) https://blog.csdn.net/cs_hnu_scw/article/details/81040834
#情景引入小白:起床起床起床起床....快起床~我:怎么了又,大惊小怪,吓到我了.小白:我有事有事想找你,十万火急呢~~我:你能有什么事?反正我不信..那你说说看~~小白:就是我有两个小表弟,叫大白和 ...
- 消息中间件面试题31道RabbitMQ+ActiveMQ+Kafka
消息中间件面试题31道RabbitMQ+ActiveMQ+Kafka 前言 文章开始前,我们先了解一下什么是消息中间件? 什么是中间件? 非底层操作系统软件,非业务应用软件,不是直接给最终用户使用的, ...
- 手把手教你如何玩转消息中间件(ActiveMQ)
手把手教你如何玩转消息中间件(ActiveMQ) 2018年07月15日 18:07:39 Cs_hnu_scw 阅读数 12270 标签: 中间件消息中间件ActiveMQ分布式集群 更多 个人分类 ...
- ActiveMQ 学习第二弹
经历了昨天的初识 ActiveMQ,正好今天下班有点事耽搁了还没法回家,那就再学习会 ActiveMQ 吧!现在官网的文档没啥好看的了,毕竟是入门学习,太深奥的东西也理解不了.然后看官网上有推荐书籍& ...
- JMS学习(八)-ActiveMQ Consumer 使用 push 还是 pull 获取消息
ActiveMQ是一个消息中间件,对于消费者而言有两种方式从消息中间件获取消息: ①Push方式:由消息中间件主动地将消息推送给消费者:②Pull方式:由消费者主动向消息中间件拉取消息.看一段官网对P ...
- ActiveMQ:初见&安装试运行
官网:http://activemq.apache.org/ ActiveMQ是一个消息中间件,在大型互联网应用中有广泛的使用. 当前最新版本:5.15.4,发布于2018-05-22,开源.Apac ...
- ActiveMQ之ActiveMQ-CPP安装及测试
在介绍ActiveMQ-CP之前,先介绍下CMS(C++ Messaging Service),CMS是C++程序与消息中间件进行通信的一种标准接口,可以通过CMS接口与类似ActiveMQ这样的消息 ...
- ActiveMQ入门系列一:认识并安装ActiveMQ(Windows下)
一.什么是ActiveMQ 度娘给出的定义: Apache ActiveMQ是Apache软件基金会所研发的开放源代码消息中间件:由于ActiveMQ是一个纯Java程序,因此只需要操作系统支持Jav ...
- spring帝国-开篇
spring简介: spring是一个开源框架,spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Dev ...
随机推荐
- vue中axios 配置请求拦截功能 及请求方式如何封装
main.js 中: import axios from '................/axios' axios.js 中: //axios.js import Vue from 'vue' i ...
- aabb碰撞检测
在做矩形重叠判断时 要判断A矩形的最大X>B矩形的最小X,A最大Y<小于B最小Y and 要判断B矩形的最大X>A矩形的最小X,B最大Y<小于A最小Y 一套规则,用2遍,很神奇 ...
- jira迁移数据
jira迁移数据有两种方式 方式一: jira系统自带的备份恢复操作 最简单的,但不一定能成功 从/export/atlassian/application-data/jira/export下载至 ...
- 允许长单词、数字、URL换行到下一行
CSS3 word-wrap 属性 normal 只在允许的断字点换行(浏览器保持默认处理) break-word 在长单词.数字.URL地址内部进行换行 页面效果图: 源码:
- java基础 包装类
包装类在集合中用来定义集合元素的类型. 1.Integer.MIN_VALUE:int类型的最小值:-2^31 2.Integer.MAX_VALUE:int类型的最大值:2^31-1 3.int ...
- 假设程序需要一个int类型的变量来保持你所有的音乐CD的数量
假设程序需要一个int类型的变量来保持你所有的音乐CD的数量.初始值为0为该变量编写一条声明语句 int numCDs = 0;
- 小玩意--自定义log记录
之前在帮TCL运维项目时,因某些原因,决定单就经销商相关业务中摒弃经典的log4j日志,改为每日自定义生成并写入相关日志,我遂写了一个util,代码如下:p.s.实现的思路很简单,仅为每次需要记录时, ...
- Linxu基础知识:终端、终端模拟器、shell
实验楼课程第二个实验的讲解部分出现了三个词,我不知道它们三个是什么关系.查阅了度娘,归纳如下: - 终端: 在UNIX/LINUX系统中,用户通过终端登录系统后得到一个Shell进程,这个终端就成为S ...
- HDOJ 1166 敌兵布阵 (线段树)
题目: Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Ti ...
- 海马玩模拟器——搭建React Native环境
Visual Studio Emulator for Android 模拟器国内这网络环境不太用,所以使用海马玩模拟器,给大家推荐一下! 下面开始配置环境: 1)下载1.8+JDK,配置JDK环境参考 ...