前言

  消息队列是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。目前消息队列已经逐渐成为企业IT系统内部通信的核心手段,它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。当前使用较多的消息队列有RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMQ等,而部分数据库如Redis、MySQL以及phxsql也可实现消息队列的功能。

  大多时候,我们使用消息队列来做三件事情:解耦、削峰、异步。这是消息队列最突出的优点,其他优点比如可以持久化数据,保证消息之间的顺序等等在业务中对我们的帮助也很大。

  万事有利就有弊,消息队列有这些优点,自然也有它的缺点,比如:

  1)系统研发成本增加。引入消息队列后,你就必须要对大多数消息队列有个深入的理解,否则如何做技术选型呢?而消息队列本身也比较复杂,在短时间内无法完全理解。所以是否使用消息队列需要根据具体场景判断,而不是为了使用技术而用技术。

  2)系统复杂性增加。 一个系统如果直接将业务串行处理,那么只需要在一个系统中把代码写写写就好了。但如果引入消息队列,则要多考虑很多方面的问题,比如一致性问题、如何保证消息不被重复消费,如何保证保证消息可靠传输。因此,需要考虑的东西更多,系统复杂性增大。

  3)系统可用性降低。 本来其他系统只要运行好好的,那你的系统就是正常的。现在你要加个消息队列进去,那消息队列挂了,你的系统势必受到影响。因此,系统可用性降低。

  所以我们在考虑使用消息队列的时候,一定要对目前的主流框架有所了解,充分应用其优点,避免或弱化其缺点。

  当今市面上主流的开源MOM(Message Oriented Middleware,消息中间件)基本上都是Apache旗下的项目,有老牌的ActiveMQ、RabbitMQ,炙手可热的Kafka,阿里巴巴自主开发RocketMQ等。我们主要谈谈这几个MQ的性能、优缺点和相应的业务场景。这些MQ都是支持集群架构模式的。

  另外说一下,其实Redis也是有MQ功能的,它完全可以当做一个轻量级的队列服务来使用。与RabbitMQ相比,入队时,当数据比较小时 Redis 的性能要高于 RabbitMQ,而如果数据大小超过了 10K,Redis 性能就大幅度降低,很难满足系统的使用需求;出队时,无论数据大小,Redis 都表现出非常好的性能,而 RabbitMQ 的出队性能则远低于 Redis。在我们印象中,Redis 是一个 key-value 缓存中间件,而不是一个消息队列中间件,基于以上两种原因,我们在考虑消息中间件的时候一般都不考虑 Redis。所以我们在下面的内容就不涉及Redis的相关内容了,感兴趣的小伙伴可以去研究一下。

1 JMS规范

  首先我们聊聊JMS(Java Message Service)规范,也就是Java消息服务,它定义了Java中访问消息中间件的接口规范。所以我们应该明白,JMS只是接口,并没有给予实现,实现JMS接口的消息中间件称为“JMS Provider”。上面说到的ActiveMQ、RabbitMQ、Kafka、RocketMQ都基本遵循或参考了JMS规范,都有自己的特点和优势。

1.1 专业术语

  JMS(Java Message Service):实现JMS接口的消息中间件;

  Provider(MessageProvider):消息的生产者;

  Consumer(MessageConsumer):消息的消费者;

  PTP(Point to Point):点对点消费模型;

  Pub/Sub(Publish/Subscribe):发布/订阅的消息模型;

  Queue:队列目标,也就是我们说的消息队列,一般会真正的进行物理存储;

  Topic:主题目标;

  ConnectionFactory:连接工厂,用于创建连接到消息中间件的连接;

  Connection:JMS客户端到JMSProvider之间的通讯链路;

  Destination:目的地,指消息发布和接收的地点,包括队列和主题;

  Session:会话,表示一个单线程的上下文,用于发送和接收消息

1.2 JMS消息格式

  StreamMessage 原始值的数据流

  MapMessage 一套名称/值对

  TextMessage 一个字符串对象

  BytesMessage 一个未解释的数据流

  ObjectMessage 一个序列化的对象

2 ActiveMQ

  ActiveMQ是一个完全支持JMS1.1和J2EE1.4规范的JMS Provider实现,尽管JMS规范出台已经很久了,但是JMS在早些年的J2EE应用中有着特殊的地位。可以说ActiveMQ是一个“古老”的消息中间件了,在那个时候它在业界应用的最广泛,也是曾经叱咤风云过的。但是从当今的业务需求来看,ActiveMQ想要有更强大的性能和海量数据处理能力,还需要不断升级版本,提升性能和架构设计的重构。

  ActiveMQ有丰富的API、多种集群构建模式,这些足够满足我们80%以上的业务需求,事实也确实如此,做为业界老牌的消息中间件,它在中小型企业应用广泛。当然了,面对大规模、高并发应用服务做中间件选项,如淘宝、京东等大型电商网站,ActiveMQ就捉襟见肘了。

2.1 消息投递模式

  我们先说JMS规范里最经典的两种消息投递模式:“点对点”和“发布订阅”。

  1)点对点:生产者向队列投递一条消息,只有一个消费者能够监听得到这条消息(PTP),如下图:

  2)发布订阅:生产者向队列投递一条消息,所有监听该队列的消费者都能够监听到这条消息(P/S),如下图:

2.2 指标

  我们从服务性能、存储堆积能力、可扩展性三个方面考虑。

  1)ActiveMQ的性能一般,在早期传统行业盛行的时代比较流行,但是面对如今的高并发、大数据的业务场景,就力不从心了。

  2)数据存储默认采用kahadb存储(索引文件形式存储),也可以使用高性能的google leveldb(内存数据库存储),或者使用关系型数据库如Oracle、MySQL等存储。

  3)ActiveMQ可以与Zookeeper进行构建主备集群模型,并且多套的主备模型直接可以采用Network的方式构建分布式集群。

2.3 ActiveMQ集群

  ActiveMQ最经典的两种集群架构模式:Master-Slave、Network。

  1)Master-Slave:

  从名字就可以看出来就是主从方式,也就是主备方式,双机热备机制。Master-Slave就是消息被复制到slave broker,即使master broker遇到故障失去工作能力,你也可以切换到slave broker继续工作且不丢失消息。Master-Slave数目前ActiveMQ推荐的高可靠性和容错的解决方案。

  Master-Slave集群的关键点:

  a、上图绿色节点是主节点,灰色是备份节点,这两个节点都是运行状态。

  b、zookeeper的作用就是当绿色主节点宕机时,进行及时切换到备份节点上去,使其进行主从角色互换,用于实现高可用性的方案。

  c、Master-Slave集群模型的缺点也很明显,就是不能做到分布式的topic、queue,当消息量巨大时,我们的MQ集群压力过大,没办法满足分布式的需求。

  2)Network

  可以理解为网络通信方式。这种方式真正解决了分布式消息存储和故障转移、broker切换的问题。它支持分布式的topic、queue。一个broker会相同对待所有的订阅:不管他们是来自本地客户连接,还是远程broker,它都会递送有关的信息拷贝到每个订阅。远程broker得到这个信息拷贝后,会依次把它递送到其内部的本地连接上。

  Network集群的关键点:

  a、这种方案需要两套及以上的Master-Slave集群模型才可以搞定,部署很麻烦。

  b、Network解决了分布式消息队列的问题,但是资源浪费严重。所以Master-Slave模型是传统型互联网公司的首选。

  ActiveMQ毕竟是Apache的顶级项目之一,它开箱即用,类似于 RabbitMQ,少量代码就可以高效地实现高级应用场景。目前正在进行新版本重构与落地,我们期待它能够完成这次新生吧。

常见消息中间件之ActiveMQ的更多相关文章

  1. java消息中间件之ActiveMQ初识

    目录 消息中间件简介 解耦合和异步 可靠性和高效性 JMS P2P Pub/Sub AMQP JMS和AMQP对比 常见消息中间件 ActiveMQ RabbitMQ Kafka 综合比较 标签(空格 ...

  2. 手把手教你如何玩转消息中间件(ActiveMQ)

    手把手教你如何玩转消息中间件(ActiveMQ) 2018年07月15日 18:07:39 Cs_hnu_scw 阅读数 12270 标签: 中间件消息中间件ActiveMQ分布式集群 更多 个人分类 ...

  3. 消息中间件之ActiveMQ

    一.什么是消息中间件(MQ) 1.1 为什么会需要消息队列(MQ)? 主要原因是由于在高并发环境下,由于来不及同步处理,请求往往会发生堵塞,比如说,大量的insert,update之类的请求同时到达M ...

  4. 消息中间件之ActiveMQ(非原创)

    文章大纲 一.消息中间件基础知识二.ActiveMQ介绍三.ActiveMQ下载安装(Windows版本)四.Java操作ActiveMQ代码实战五.Spring整合ActiveMQ代码实战六.项目源 ...

  5. 分布式消息中间件(二)ActiveMQ

    一.概述 Apache出品,最流行的,能力强劲的开源消息总线. 1.JMS规范 Java消息服务(Java Message Service,即JMS)应用程序接口是一个Java平台中关于面向消息中间件 ...

  6. 手把手教你如何玩转消息中间件(ActiveMQ) https://blog.csdn.net/cs_hnu_scw/article/details/81040834

    #情景引入小白:起床起床起床起床....快起床~我:怎么了又,大惊小怪,吓到我了.小白:我有事有事想找你,十万火急呢~~我:你能有什么事?反正我不信..那你说说看~~小白:就是我有两个小表弟,叫大白和 ...

  7. JMS消息中间件系列[ActiveMQ](一)

    版本5.13.3的特性: 1.Supports a variety of Cross Language Clients and Protocols from Java, C, C++, C#, Rub ...

  8. JMS消息中间件之ActiveMQ学习

    1.下载 下载二进制bin文件:http://activemq.apache.org/activemq-5132-release.html 下载源码: 2.启动: 解压任意路径: 启动后: 3.访问: ...

  9. 初识消息中间件之 ==> ActiveMQ

    一.消息队列概述 消息(Message)是指在应用间传送的数据.消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象. 消息队列(Message Queue)是一种应用间的通信方式, ...

随机推荐

  1. 构造 IPv6 报文

    #!/usr/bin/python from scapy.all import * a=IPv6(nh=58, src='fe80::214:f2ff:fe07:af0', dst='ff02::1' ...

  2. 个人项目 源程序特征统计程序(C++)

    零.GitHub地址 https://github.com/King-Authur/Word-count 一.项目的相关要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这 ...

  3. 虚拟化技术之kvm WEB管理工具kimchi

    在前面的博客中,我们介绍了kvm的各种工具,有基于图形管理的virt-manager.有基于命令行管理的virt-install .qemu-kvm.virsh等等:今天我们来介绍一款基于web界面的 ...

  4. 区块链入门到实战(27)之以太坊(Ethereum) – 智能合约开发

    智能合约的优点 与传统合同相比,智能合约有一些显著优点: 不需要中间人 费用低 代码就是规则 区块链网络中有多个备份,不用担心丢失 避免人工错误 无需信任,就可履行协议 匿名履行协议 以太坊(Ethe ...

  5. [状压DP]P1441 题解 砝码称重

    前置知识:状压DP 洛谷传送门 emm....看到题目,我第一个想到的就是枚举.暴力大法好! 具体怎么枚举?当然是子集枚举啦!枚举出每一个可能的砝码选择方案.对于每一个合法的(也就是选取数量等于\(n ...

  6. 深入了解Redis(3)-对象

    Redis主要的数据结构有简单动态字符串(SDS).双端链表.字典.压缩列表.整数集合,等等.但Redis并没有直接使用这些数据结构来实现键值对数据库, 而是基于这些数据结构创建了一个对象系统, 这个 ...

  7. [CSP-S2019]划分 题解

    CSP-S2 2019 D2T2 考场上读完题感觉是DP就直接扔了开T3了,考完才发现部分分好像不难拿,枯了 题意分析 给出一个数列,要求将其分成几段,使每段的和非严格递增,求最小的每段的和的平方和. ...

  8. Jigsaw pre-training:摆脱ImageNet,拼图式主干网络预训练方法 | ECCV 2020

    Jigsaw pre-training以拼图的方式从检测数据集中生成用于主干网络预训练的数据集,而不需要额外的预训练数据集,如ImageNet.另外为了让网络更好的适应拼图数据,论文提出ERF-ada ...

  9. C# OWC11

    public void OcwChart(int[] Data,string[] DataName,string Yname,string Xname,string ChartName,string ...

  10. Win10 第三方浏览器无法上网或者上网速度慢 的终极解决方案

    请参考: https://blog.csdn.net/shouzei123/article/details/82862478 近期,工程师收到大量反馈360浏览器,极速模式无法打开网页,兼容模式无此问 ...