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 ...
随机推荐
- MySQL数据库基本命令-1
第一章:数据库概述1.数据(data) 数据库(DB) 数据库管理系统(DBMS) 数据库系统(DBS)2.数据库管理系统提供的功能: (1)数据定义语言:DDL (2)数据操作语言:DML 基本的数 ...
- sqlserver 备份脚本
BACKUP DATABASE 数据库名称 TO DISK='d:\3333.bak' ---根据时间生成文件名 --将SQL脚本赋值给变量declare @SqlBackupDataBase as ...
- js获取当前城市名
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- 爬虫代理及ssl验证
IP代理:import requests url='https://weibo.com/' proxies={ 'http':'116.196.66.197:99999' } # 此处的proxies ...
- Java -cp 命令行引用多个jar包的简单写法(Windows、Linux
1.Windows下用法 在Windows上,可以使用 用法:java your-jar-lib-folder/* your-main-class your-jar-lib-folder为存放一堆ja ...
- Unicode与Ansi互转
BOOL CTool::AnsiToUnicode(const char *pSrc, CString &strResult) { #ifndef _UNICODE return FALSE; ...
- 【blog】Hibernate5如何设置SQLite的方言(待更新...)
参考链接 Hibernate3.Hibernate4.Hibernate5 hibernate5连接sqlite (目前参考的是这个方法)
- mysql 案例 ~ mysql字符集详解
一 谈谈mysql常见的字符集问题 二 字符集统一 1 character_set_server 2 character_set_client 3 java/php等连接字符集 4 chara ...
- 执行maven install跳过执行maven test方法(网上搜的记录一下,方面以后使用)
直接在pom文件加上这段配置就可以了 <plugin> <groupId>org.apache.maven.plugins</groupId> ...
- 实验吧 ASCII艺术
题目链接:http://ctf5.shiyanbar.com/ppc/acsii.php 首先我们先理清题意,题目的意思是将下面这样这些小叉叉组成的数字,连起来输入得到flag,并且要在两秒以内. 两 ...