Greenplum 从入门到放弃 三

Greenplum 从入门到放弃(三)

master 和 segment关系

Master和Segment其实都是一个单独的PostgreSQL数据库。
每一个都有自己单独的一套元数据字典,在这里,Master节点
一般也叫主节点,Segment也叫做数据节点。
Segment节点与Master节点的通信,通过千兆(或万兆)
网卡组成的内部连接(InterConnect),在同一台数据节点机
器上可以放多个Segment,不同的Segment节点会被赋予不同的
端口,同时,Segment之间也不断地进行着交互。为了实现高
可用,每个Segment都有对应的备节点(Mirror Segment),分
别存在于不同的机器上。

Client一般只能与Master节点进行交互,Client将SQL发给Master,然后Master对SQL进行分析后,再将其分配给所有的Segment进行操作,并且将汇总结果返回给客户端。

数据库存储

对于数据库来说,在性能上磁盘IO很容易成为瓶颈,由于数据库的特性,每一个SQL基本都是对全表数据进行分析,每次处理的数据量非常大,数据基本上都是没有缓存的(数据字典除外),极度消耗IO资源(全表扫描主要都是顺序IO),所以Greenplum对存储的要求比较高。在文件系统的选择上,在Linux下建议使用XFS,在Solaris下建议使用ZFS,对于Raid根据需求选择硬Raid或软Raid,如果需要更大的空间,建议使用Raid5,如果对性能有更高的要求,可以选择Raid 1+0。

网络

在确定机器配置的时候,要保证所有机器的网络都是通的,并且每台机器的防火墙都是关闭的,避免存在网络不通的问题。

Greenplum 从入门到放弃 二

Greenplum 从入门到放弃(二)

OLTP与OLAP

数据库系统一般分为两种类型,一种是面向前台应用的,应用比较简单,但是重吞吐和高并发的OLTP类型;一种是重计算的,对大数据集进行统计分析的OLAP类型。Greenplum属于后者。

OLTP(On-Line Transaction
Processing,联机事务处理)系统也称为生产系统,它是事件驱动的、面向应用的,比如电
子商务网站的交易系统就是一个典型的OLTP系统。OLTP的基本特点是:

  • 数据在系统中产生
  • 基于交易的处理系统(Transaction-Based)
  • 每次交易牵涉的数据量很小
  • 对响应时间要求非常高
  • 用户数量非常庞大,主要是操作人员
  • 数据库的各种操作主要基于索引进行

OLAP(On-Line Analytical Processing,联机分析处理)是基于数据仓库的信息分析处理过程,是数据仓库的用户接口部分。OLAP系统是跨部门的、面向主题的,其基本特点是:

  • 本身不产生数据,其基础数据来源于生产系统中的操作数据(OperationalData)
  • 基于查询的分析系统
  • 复杂查询经常使用多表联结、全表扫描等,牵涉的数据量往往十分庞大
  • 响应时间与具体查询有很大关系
  • 用户数量相对较小,其用户主要是业务人员与管理人员
  • 由于业务问题不固定,数据库的各种操作不能完全基于索引进行

Greenplum 从入门到放弃 一

Greenplum 从入门到放弃(一)

  • Greenplum的性能在数据量为TB级别时表现非常优秀,单机性能相比Hadoop要快好几倍

  • Greenplum是基于PostgreSQL的一个完善的数据库,在功能和语法上都要比Hadoop上的SQL引擎Hive好用很多,对于普通用户来说更加容易上手。

  • Greenplum有着完善的工具,相比Hive,整个体系都比较完善,不需要像Hive一样花太多的时间和精力进行改造,非常适合作为一些大型的数据仓库解决方案。

  • Greenplum能够方便地与Hadoop进行结合,可直接把数据写在Hadoop上,还可以直接在数据库上写MapReduce任务,并且配置简单。

世界以痛吻我 我却报之以歌

今年发生不好的事,一切都显得不那么美好,就很多事情都不按大家的预想在发展。就一起都感觉不顺利,2018已经不够友好了,还记得刚刚过去的23岁生日,记得自己的愿望是希望,真挚希望所有的亲朋好友能够健康,健康就够了,钱多钱少不重要,就是健康就够了。。。

但是偏偏还是发生了。

世界以痛吻我 我却报之以歌

亲人已仙游,未呈儿孙福,幽魂于千里,如何度思量。

2018年06月14日早9:00点,在杭州,还在床上的我猛的收到了家人群的消息,早已患糖尿病多年的舅舅病逝。尽管心里有多不愿意接受,但是心里也算是做好了准备。在五一回家时间便已经被告知舅舅身体日渐消瘦,骨瘦如柴。我还趁着工作之余,抽空去看望了。当看到那一瞬间,我感觉我整个人就不好了,眼泪一下就出来了,整个人像楞住了一般,久久说不出话,手也不知道往哪里放。当舅舅看到我,一把把我拽住,死死捏着,这一幕到现在我也忘不了…

又是在杭州,2019年01月29日早8: 00点,同样的戏码,姨夫病逝,癌症晚期,距离收到通知,也就短短三个多月时间,大概一百多天,原本一个看上去健健康康的人,就突然离开,就像上帝给你的人生突然上了锁,然后把钥匙给扔掉了的感觉…

醒来又是一天,开始干活,累…

Hadoop Hive Hbase 简单区别及应用场景

Hadoop Hive Hbase 简单区别及应用场景

Hadoop

它是一个分布式计算+分布式文件系统,前者其实就是MapReduce,后者是HDFS。后者可以独立运行,前者可以选择性使用,也可以不使用。

Hive

通俗的说是一个数据仓库,仓库中的数据是被HDFS管理的数据文件,它支持类似sql语句的功能,
你可以通过该语句完成分布式环境下的计算功能,Hive会把语句转换成MapReduce,然后交给Hadoop执行。
这里的计算,仅限于查找和分析,而不是更新、增加和删除。它的优势是对历史数据进行处理,
用时下流行的说法是离线计算,因为它的底层是MapReduce,MapReduce在实时计算上性能很差。
它的做法是把数据文件加载进来作为一个Hive表(或者外部表),让你觉得你的sql操作的是传统的表。

HBase

通俗的说,HBase的作用类似于数据库,传统数据库管理的是集中的本地数据文件,
而HBase基于Hdfs实现对分布式数据文件的管理,比如增删改查。也就是说,HBase只是利用Hadoop的Hdfs帮助其管理数据的持久化文件(HFile),它跟MapReduce没任何关系。HBase的优势在于实时计算,所有实时数据都直接存入Hbase中,客户端通过API直接访问Hbase,实现实时计算。由于它使用的是nosql,或者说是列式结构,从而提高了查找性能,使其能运用于大数据场景,这是它跟MapReduce的区别。

总结:

  1. Hadoop是Hive和HBase的基础,Hive依赖Hadoop
  2. HBase仅依赖Hadoop的Hdfs模块。
  3. Hive适用于离线数据的分析,操作的是通用格式的(如通用的日志文件)、被Hadoop管理的数据文件,它支持类sql,
    比编写MapReduce的java代码来的更加方便,它的定位是数据仓库,存储和分析历史数据
  4. Hbase适用于实时计算,采用列式结构的nosql,操作的是自己生成的特殊格式的HFile、被hadoop管理的数据文件,
    它的定位是数据库,或者叫DBMS

最后补充一下:Hive可以直接操作Hdfs中的文件作为它的表的数据,也可以使HBase数据库作为它的表

大数据

大数据生命周期

  • 基础设施层,涵盖计算资源、内存与存储和网络互联,具体表现为计算节点、集群、机柜和数据中心。
  • 数据存储和管理层,包括文件系统、数据库和类似YARN的资源管理系统。
  • 计算处理层,如hadoop、MapReduce和Spark
  • 在此之上的各种不同计算范式,如批处理、流处理和图计算等,包括衍生出编程模型的计算模型,如BSP、GAS等

数据分析和可视化基于计算处理层。分析包括简单的查询分析、流分析以及更复杂的分析(如机器学习、图计算等)。查询分析多基于表结构和关系函数,流分析基于数据、事件流以及简单的统计分析,而复杂分析则基于更复杂的数据结构与方法,如图、矩阵、迭代计算和线性代数。一般意义的可视化是对分析结果的展示。但是通过交互式可视化,还可以探索性地提问,使分析获得新的线索,形成迭代的分析和可视化。基于大规模数据的实时交互可视化分析以及在这个过程中引入自动化的因素是目前研究的热点。

大数据技术生态

大数据的基本处理流程与传统数据处理流程并无太大差异,主要区别在于:由于大数据要处理大量、非结构化的数据,所以在各处理环节中都可以采用并行处理。目前,Hadoop、MapReduce和Spark等分布式处理方式已经成为大数据处理各环节的通用处理方法。

大数据采集与预处理

  • 存储层
  • 预处理层
  • 采集层

在大数据的生命周期中,数据采集处于第一个环节。根据MapReduce产生数据的应用系统分类,大数据的采集主要有4种来源:管理信息系统、Web信息系统、物理信息系统、科学实验系统。对于不同的数据集,可能存在不同的结构和模式,如文件、XML树、关系表等,表现为数据的异构性。对多个异构的数据集,需要做进一步集成处理或整合处理,将来自不同数据集的数据收集、整理、清洗、转换后,生成到一个新的数据集,为后续查询和分析处理提供统一的数据视图。针对管理信息系统中异构数据库集成技术、Web信息系统中的实体识别技术和DeepWeb集成技术、传感器网络数据融合技术已经有很多研究工作,取得了较大的进展,已经推出了多种数据清洗和质量控制工具。

大数据的存储和管理

按数据类型的不同,大数据的存储和管理采用不同的技术路线,大致可以分为3类。

第1类

主要面对的是大规模的结构化数据。针对这类大数据,通常采用新型数据库集群。它们通过列存储或行列混合存储以及粗粒度索引等技术,结合MPP(MassiveParallelProcessing)架构高效的分布式计算模式,实现对PB量级数据的存储和管理。这类集群具有高性能和高扩展性特点,在企业分析类应用领域已获得广泛应用;

第2类

主要面对的是半结构化和非结构化数据。应对这类应用场景,基于Hadoop开源体系的系统平台更为擅长。它们通过对Hadoop生态体系的技术扩展和封装,实现对半结构化和非结构化数据的存储和管理;

第3类

面对的是结构化和非结构化混合的大数据,因此采用MPP并行数据库集群与Hadoop集群的混合来实现对百PB量级、EB量级数据的存储和管理。一方面,用MPP来管理计算高质量的结构化数据,提供强大的SQL和OLTP型服务;另一方面,用Hadoop实现对半结构化和非结构化数据的处理,以支持诸如内容检索、深度挖掘与综合分析等新型应用。这类混合模式将是大数据存储和管理未来发展的趋势。

Hadoop技术体系

Hadoop 里面包括几个组件HDFSMapReduceYARNZooKeeper等一系列技术,HDFS是存储数据的地方就像我们电脑的硬盘一样文件都存储在这个上面,MapReduce是对数据进行处理计算的,YARN是体现Hadoop平台概念的重要组件,有了它大数据生态体系的其它软件就能在hadoop上运行了,这样能更好的利用HDFS大存储的优势和节省更多的资源比如我们就不用再单独建一个spark的集群了,让它直接跑在现有的hadoop yarn上面就可以了。ZooKeeper本身是一个非常牢靠的记事本,用于记录一些概要信息。Hadoop依靠这个记事本来记录当前哪些节点正在用,哪些已掉线,哪些是备用等,以此来管理机群。

Hadoop技术体系

Hadoop

Hadoop 里面包括几个组件HDFSMapReduceYARNZooKeeper等一系列技术,HDFS是存储数据的地方就像我们电脑的硬盘一样文件都存储在这个上面,MapReduce是对数据进行处理计算的,YARN是体现Hadoop平台概念的重要组件,有了它大数据生态体系的其它软件就能在hadoop上运行了,这样能更好的利用HDFS大存储的优势和节省更多的资源比如我们就不用再单独建一个spark的集群了,让它直接跑在现有的hadoop yarn上面就可以了。ZooKeeper本身是一个非常牢靠的记事本,用于记录一些概要信息。Hadoop依靠这个记事本来记录当前哪些节点正在用,哪些已掉线,哪些是备用等,以此来管理机群。

HDFS

Hadoop Distributed File System,Hadoop 分布式文件系统
高度容错性的系统,适合部署在廉价的机器上,HDFS能提供高吞吐量的数据访问,适合那些有着超大数据集(large data set)的应用程序。

MapReduce

Mapreduce是一个计算框架,一个处理分布式海量数据的软件框架及计算集群。

Map (映射) Reduce (简化)
举个例子:假设你的手机通话信息保存在一个HDFS的文件callList.txt中,你想找到你与同事A的所有通话记录并排序。因为HDFS会把callLst.txt分成几块分别存,比如说5块,那么对应的Map过程就是找到这5块所在的5个节点,让它们分别找自己存的那块中关于同事A的通话记录,对应的Reduce过程就是把5个节点过滤后的通话记录合并在一块并按时间排序。MapReduce的计算模型通常把HDFS作为数据来源,很少会用到其它数据来源比如HBase。

Hbase

这是Hadoop生态体系中的NOSQL数据库,他的数据是按照key和value的形式存储的并且key是唯一的,所以它能用来做数据的排重,它与MYSQL相比能存储的数据量大很多。所以他常被用于大数据处理完成之后的存储目的地。

HDFS和HBase是依靠外存(即硬盘)的分布式文件存储实现和分布式表存储实现。HDFS是一个分布式的“云存储”文件系统,它会把一个文件分块并分别保存,取用时分别再取出、合并。重要的是,这些分块通常会在3个节点(即集群内的服务器)上各有1个备份,因此即使出现少数节点的失效(如硬盘损坏、掉电等),文件也不会失效。如果说HDFS是文件级别的存储,那HBase则是表级别的存储。HBase是表模型,但比SQL数据库的表要简单的多,没有连接、聚集等功能。HBase的表是物理存储到HDFS的,比如把一个表分成4个HDFS文件并存储。由于HDFS级会做备份,所以HBase级不再备份。MapReduce则是一个计算模型,而不是存储模型;MapReduce通常与HDFS紧密配合。

Hive

Hive 是一种底层封装了Hadoop 的数据仓库处理工具,使用类SQL的HiveQL语言实现数据查询,所有Hive 的数据都存储在Hadoop 兼容的文件系统(如HDFS)中。Hive在加载数据过程中不会对数据进行任何的修改,只是将数据移动到HDFS中Hive设定的目录下,++因此,Hive不支持对数据的改写和添加,所有的数据都是在加载的时候确定的++。对于会SQL语法的来说就是神器,它能让你处理大数据变的很简单,不会再费劲的编写MapReduce程序。

Spark

它是用来弥补基于MapReduce处理数据速度上的缺点,它的特点是把数据装载到内存中计算而不是去读慢的要死进化还特别慢的硬盘。特别适合做迭代运算,所以算法流们特别稀饭它。它是用scala编写的。Java语言或者Scala都可以操作它,因为它们都是用JVM的。

其他相关技术

Sqoop

这个是用于把Mysql里的数据导入到Hadoop里的。当然你也可以不用这个,直接把Mysql数据表导出成文件再放到HDFS上也是一样的,当然生产环境中使用要注意Mysql的压力。

Flume

apache Flume 是一个从可以收集例如日志,事件等数据资源,并将这些数量庞大的数据从各项数据资源中集中起来存储的工具/服务,或者数集中机制。flume具有高可用,分布式,配置工具,其设计的原理也是基于数据流,如日志数据从各种网站服务器上汇集起来存储到HDFS,HBase等集中存储器中。

一般实时系统,所选用组件如下

  • 数据采集 :负责从各节点上实时采集数据,选用Flume来实现
  • 数据接入 :由于采集数据的速度和数据处理的速度不一定同步,因此添加一个消息中间件来作为缓冲,选用apache的kafka
  • 流式计算 :对采集到的数据进行实时分析,选用apache的storm
  • 数据输出 :对分析后的结果持久化,暂定用mysql,另一方面是模块化之后,假如当Storm挂掉了之后,数据采集和数据接入还是继续在跑着,数据不会丢失,storm起来之后可以继续进行流式计算;

Kafka

Kafka的整体架构非常简单,是显式分布式架构,producer、broker(kafka)和consumer都可以有多个。Producer,consumer实现Kafka注册的接口,数据从producer发送到broker,broker承担一个中间缓存和分发的作用。broker分发注册到系统中的consumer。broker的作用类似于缓存,即活跃的数据和离线处理系统之间的缓存。客户端和服务器端的通信,是基于简单,高性能,且与编程语言无关的TCP协议。

Kafka是一种分布式的、基于发布/订阅的消息系统。在流式计算中,Kafka一般用来缓存数据,Storm通过消费Kafka的数据进行计算(KAFKA+STORM+REDIS)。

特点:

  • 消息持久化:通过O(1)的磁盘数据结构提供数据的持久化
  • 高吞吐量:每秒百万级的消息读写
  • 分布式:扩展能力强
  • 多客户端支持:java、php、python、c++ ……
  • 实时性:生产者生产的message立即被消费者可见
  • Kafka是一个分布式消息队列:生产者、消费者的功能。它提供了类似于JMS的特性,但是在设计实 现上完全不同,此外它并不是JMS规范的实现。
  • Kafka对消息保存时根据Topic进行归类,发送消息者称为Producer,消息接受者称为Consumer
  • 无论是kafka集群,还是producer和consumer都依赖于zookeeper集群保存一些meta信息,来保证系统可用性

Hadoop概念

Hadoop是一个开源的框架,可编写和运行分布式应用处理大规模数据,是专为离线和大规模数据分析而设计的,并不适合那种对几个记录随机读写的在线事务处理模式。

Hadoop

概念

  • Hadoop是一个开源的框架,可编写和运行分布式应用处理大规模数据,是专为离线和大规模数据分析而设计的,并不适合那种对几个记录随机读写的在线事务处理模式。 ==不是为了大数据而大数据==
  • Hadoop 是以一种可靠、高效、可伸缩的方式进行处理的。Hadoop 是可靠的,因为它假设计算元素和存储会失败,因此它维护多个工作数据副本,确保能够针对失败的节点重新分布处理。Hadoop 是高效的,因为它以并行的方式工作,通过并行处理加快处理速度。Hadoop 还是可伸缩的,能够处理 PB 级数据。

核心

Hadoop的核心就是==HDFS==和==MapReduce===,Hadoop旗下有很多经典子项目,比如HBase、Hive等,这些都是基于HDFS和MapReduce发展出来的。要想了解Hadoop,就必须知道HDFS和MapReduce是什么。

HDFS

Hadoop Distributed File System,Hadoop 分布式文件系统
高度容错性的系统,适合部署在廉价的机器上,HDFS能提供高吞吐量的数据访问,
适合那些有着超大数据集(large data set)的应用程序。

MapReduce

Mapreduce是一个计算框架,一个处理分布式海量数据的软件框架及计算集群。

用处

  • 搜索引擎 - 设计Hadoop的初衷,为了针对大规模的网页快速建立索引)
  • 大数据存储 - 利用Hadoop的分布式存储能力,例如数据备份、数据仓库等。
  • 大数据处理 - 利用Hadoop的分布式处理能力,例如数据挖掘、数据分析等。
  • 科学研究 - Hadoop是一种分布式的开源框架,对于分布式计算有很大程度地参考价值。

优缺点

优点

==高可靠性==
Hadoop按位存储和处理数据的能力值得信赖。

==高扩展性==
Hadoop是在可用的计算机集簇间分配数据并完成计算任务的,这些集簇可以方便地扩展到数以千计的节点中。

==高效性==
Hadoop能够在节点之间动态地移动数据,并保证各个节点的动态平衡,因此处理速度非常快。

==高容错性==
Hadoop能够自动保存数据的多个副本,并且能够自动将失败的任务重新分配。

==低成本==
与一体机、商用数据仓库以及QlikView、Yonghong Z-Suite等数据集市相比,hadoop是开源的,
项目的软件成本因此会大大降低。

Hadoop设计对硬件需求比较低,只须运行在低廉的商用硬件集群上,而无需昂贵的高可用性机器上。
廉价的商用机也就意味着大型集群中出现节点故障情况的概率非常高。这就要求设计HDFS时要充分考虑数据的可靠性,
安全性及高可用性。

缺点

==不适合低延迟数据访问==

如果要处理一些用户要求时间比较短的低延迟应用请求,则HDFS不适合。HDFS是为了处理大型数据集分析任务的,主要是为达到高的数据吞吐量而设计的,这就可能要求以高延迟作为代价。

改进策略:对于那些有低延时要求的应用程序,HBase是一个更好的选择。通过上层数据管理项目来尽可能地弥补这个不足。在性能上有了很大的提升,它的口号就是goes real time。使用缓存或多master设计可以降低client的数据请求压力,以减少延时。还有就是对HDFS系统内部的修改,这就得权衡大吞吐量与低延时了,HDFS不是万能的银弹。

==无法高效存储大量小文件==

因为Namenode把文件系统的元数据放置在内存中,所以文件系统所能容纳的文件数目是由Namenode的内存大小来决定。一般来说,每一个文件、文件夹和Block需要占据150字节左右的空间,所以,如果你有100万个文件,每一个占据一个Block,你就至少需要300MB内存。当前来说,数百万的文件还是可行的,当扩展到数十亿时,对于当前的硬件水平来说就没法实现了。还有一个问题就是,因为Maptask的数量是由splits来决定的,所以用MR处理大量的小文件时,就会产生过多的Maptask,线程管理开销将会增加作业时间。举个例子,处理10000M的文件,若每个split为1M,那就会有10000个Maptasks,会有很大的线程开销;若每个split为100M,则只有100个Maptasks,每个Maptask将会有更多的事情做,而线程的管理开销将减小很多。

==不支持多用户写入及任意修改文件==

在HDFS的一个文件中只有一个写入者,而且写操作只能在文件末尾完成,即只能执行追加操作。目前HDFS还不支持多个用户对同一文件的写操作,以及在文件任意位置进行修改。

流处理、批处理、交互式查询

我们将大数据处理按处理时间的跨度要求分为以下几类

基于实时数据流的处理,通常的时间跨度在数百毫秒到数秒之间

基于历史数据的交互式查询,通常时间跨度在数十秒到数分钟之间

复杂的批量数据处理,通常的时间跨度在几分钟到数小时之间

消息队列

一、消息队列的基本概念

1.1 Broker

==Broker== 的概念来自与Apache ActiveMQ,通俗的讲就是消息队列服务器。

1.2 消息生产者和消费者

  • 消息生产者 ==Producer==:发送消息到消息队列。
  • 消息消费者 ==Consumer==:从消息队列接收消息。

1.3 消息模型

点对点消息队列模型

消息生产者向一个特定的队列发送消息,消息消费者从该队列中接收消息。消息的生产者和消费者可以不同时处于运行状态。每一个成功处理的消息都由消息消费者签收确认(Acknowledge)。

发布订阅消息模型-Topic

发布订阅消息模型中,支持向一个特定的主题Topic发布消息,0个或多个订阅者接收来自这个消息主题的消息。在这种模型下,发布者和订阅者彼此不知道对方。实际操作过程中,必须先订阅,再发送消息,而后接收订阅的消息,这个顺序必须保证。

1.4 消息顺序性保证

基于Queue消息模型,利用FIFO先进先出的特性,可以保证消息的顺序性。

1.5 消息的ACK确认机制

即消息的Ackownledge确认机制:
为了保证消息不丢失,消息队列提供了消息Acknowledge机制,即ACK机制,当Consumer确认消息已经消费处理,发送一个ACK给消息队列,此时消息队列便可以删除这个消息了。如果Consumer宕机/关闭,没有发送ACK,消息队列将认为这个消息没有被处理,会将这个消息重新发送给其他的Consumer重新消费处理。

1.6 消息的持久化

消息的持久化,对于一些关键的核心业务来说是非常重要的,启用消息持久化后,消息队列宕机重启后,消息可以从持久化存储恢复,消息不丢失,可以继续消费处理。

1.7 消息的同步和异步收发

同步

消息的收发支持同步收发的方式
同步收发场景下,消息生产者和消费者双向应答模式,例如:张三写封信送到邮局中转站,然后李四从中转站获得信,然后在写一份回执信,放到中转站,然后张三去取,当然张三写信的时候就得写明回信地址。
消息的接收如果以同步的方式(Pull)进行接收,如果队列中为空,此时接收将处于同步阻塞状态,会一直等待,直到消息的到达。

异步

消息的收发同样支持异步方式:异步发送消息,不需要等待消息队列的接收确认。
异步接收消息,以Push的方式触发消息消费者接收消息。

1.8 消息的事务支持

消息的收发处理支持事务,例如:在任务中心场景中,一次处理可能涉及多个消息的接收、处理,这处于同一个事务范围内,如果一个消息处理失败,事务回滚,消息重新回到队列中。

二、JMS消费服务

Java消息服务(Java Message Service,JMS)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。 点对点与发布订阅最初是由JMS定义的。这两种模式主要区别或解决的问题就是发送到队列的消息能否重复消费(多订阅) 。

JMS规范目前支持两种消息模型:

  1. 点对点(point to point, queue)
  2. 发布/订阅(publish/subscribe,topic)

2.1 点对点:Queue,不可重复消费

消息生产者生产消息发送到queue中,然后消息消费者从queue中取出并且消费消息。
消息被消费以后,queue中不再有存储,所以消息消费者不可能消费到已经被消费的消息。
Queue支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费。

P2P模式包含三个角色:

  • 消息队列(Queue)
  • 发送者(Sender)
  • 接收者(Receiver)

每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,
直到他们被消费或超时。

2.2 发布/订阅:Topic,可以重复消费

消息生产者(发布)将消息发布到topic中,同时有多个消息消费者(订阅)消费该消息。
和点对点方式不同,发布到topic的消息会被所有订阅者消费。

支持订阅组的发布订阅模式:
发布订阅模式下,当发布者消息量很大时,显然单个订阅者的处理能力是不足的。实际上现实场景中是多个订阅者节点组成一个订阅组负载均衡消费topic消息即分组订阅,这样订阅者很容易实现消费能力线性扩展。可以看成是一个topic下有多个Queue,每个Queue是点对点的方式,Queue之间是发布订阅方式。

2.3 区别

点对点模式

生产者发送一条消息到queue,一个queue可以有很多消费者,但是一个消息只能被一个消费者接受,当没有消费者可用时,这个消息会被保存直到有一个可用的消费者,所以Queue实现了一个可靠的负载均衡。

发布订阅模式

发布者发送到topic的消息,只有订阅了topic的订阅者才会收到消息。topic实现了发布和订阅,当你发布一个消息,所有订阅这个topic的服务都能得到这个消息,所以从1到N个订阅者都能得到这个消息的拷贝。

三、流行模型对比

传统企业型消息队列ActiveMQ遵循了JMS规范,实现了点对点和发布订阅模型,但其他流行的消息队列RabbitMQ、Kafka并没有遵循JMS规范。

3.1 RabbitMQ

RabbitMQ实现了AQMP协议,AQMP协议定义了消息路由规则和方式。生产端通过路由规则发送消息到不同queue,消费端根据queue名称消费消息。RabbitMQ既支持内存队列也支持持久化队列,消费端为推模型,消费状态和订阅关系由服务端负责维护,消息消费完后立即删除,不保留历史消息。

点对点

生产端发送一条消息通过路由投递到Queue,只有一个消费者能消费到。

多订阅

当RabbitMQ需要支持多订阅时,发布者发送的消息通过路由同时写到多个Queue,不同订阅组消费不同的Queue。所以支持多订阅时,消息会多个拷贝。

3.2 Kafka

Kafka只支持消息持久化,消费端为拉模型,消费状态和订阅关系由客户端端负责维护,消息消费完后不会立即删除,会保留历史消息。因此支持多订阅时,消息只会存储一份就可以了。但是可能产生重复消费的情况。