热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ActiveMQ集群架构与原理解析

初识JMIS与其专业术语小伙伴们大家好,现在我们和大家一起了解一下古老而又神秘的消息中间件ActiveMQ。首先,说起ActiveMQ࿰

初识JMIS与其专业术语

小伙伴们大家好,现在我们和大家一起了解一下古老而又神秘的消息中间件"ActiveMQ"。首先,说起ActiveMQ,就必须先聊聊JMS (Java Message Service)规范,也就是Java消息服务,它定义了Jav a中访问消息中间件的接口的规范。在这里注意哦,JMS只是接口,,并没有给予实现,实现JMS接口的消息中间件称为"IMS Provider ",目前知名的开源 MOM(Message Oriented Midleware,也就是消息中间件)系统包括Apache的ActiveMQ、RocketMQ、Kafka,以及RabbitMQ,可以说他们都"基本遵循"或"参考"JMS规范,都有自己的特点和优势。


  • 专业术语
    • JMS(Java Message Service)∶实现JMS接口的消息中间件;
    • Provider(MesageProvider)∶消息的生产者;● Consumer(MessageConsumer)∶消息的消费者;● PTP(Point to Point)∶即点对点的消息模型,这也是非常经典的模型;
    • Pub/Sub(Publish/Subscribe)∶,即发布/订阅的消息模型;
    • Queue∶ 队列目标,也就是我们常说的消息队列,一般都是会真正的进行物理存储;
    • Topic∶主题目标;
    • ConnectionFactory∶连接工厂,JMS用它创建连接;● Connection JMS 客户端到JMS Provider 的连接;● Destination∶消息的目的地;
    • Session∶会话,一个发送或接收消息的线程(这里Session可以类比Mybatis的Session);
  • JMS 消息格式定义∶
    • StreamMessage 原始值的数据流
    • MapMessage 一套名称/值对
    • TextMessage 一个字符串对象
    • BytesMessage 一个未解释字节的数据流
    • ObjectMessage 一个序列化的Java对象

了解ActiveMQ

ActiveMQ是一个完全支持JMS1.1和J2EE1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在早些的"J2EE应用"时期扮演着特殊的地位,可以说那个年代ActiveMQ在业界应用最广泛,当然如果现在想要有更强大的性能和海量数据处理能力,ActiveMQ还需要不断的升级版本,不断的提升性能和架构设计的重构。

就算现在我们80%以上的业务我们使用ActiveMQ已经足够满足需求,其丰富的API、多种集群构建模式使得他成为业界老牌消息中间件,在中小型企业中应用广泛!

当然如果你想针对大规模、高并发应用服务做消息中间件技术选型,譬如淘宝、京东这种大型的电商网站,尤其是双11这种特殊时间,ActiveMQ可能就显得力不从心了,当然我们这里后续还会和大家介绍其他非常优秀的MOM咯。


消息投递模式

废话不多说,我们首先要了解JMS规范里最经典的两种消息投递模式,即"点对点"与"发布订阅"。


  • 点对点∶生产者向队列投递一条消息,只有一个消费者能够
    监听得到这条消息(PTP),下图所示∶
    在这里插入图片描述

  • 发布订阅∶生产者向队列投递一条消息,所有监听该队列的
    消费者都能够监听得到这条消息(P/S),下图所示∶
    在这里插入图片描述


ActiveMQ各项指标

衡量一个MOM,我们主要从三方面考虑即可,即服务性能、存储堆积能力、可扩展性。


  • 服务性能
    • ActiveMQ的性能一般,在早期传统行业为王的时代还是比较流行的,但现如今面对高并发、大数据的业务场景,往往力不从心!
  • 数据存储
    • 默认采用kahadb存储(索引文件形式存储),也可以使用高性能的google leveldb(内存数据库存储),或者可以使用MySql、Oracle进程消息存储(关系型数据库存储)。
  • 集群架构
    • ActiveMQ 可以与zookeeper进行构建 主备集群模型,
      并且多套的主备模型直接可以采用Network的方式构建分布式集群。

ActiveMQ集群架构模式

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


  • Master-Slave:
    在这里插入图片描述

  • Master-Slave∶顾名思义,就是主从方式,当然这里要理解为主备的方式,也就是双机热备机制;Master Slave背后的想法是,消息被复制到slave broker,因此即使master broker 遇到了像硬件故障之类的错误,你也可以立即切换到slave b roker而不丢失任何消息。Master Slave是目前ActiveMQ推荐的高可靠性和容错的解决方案。

  • 架构思考∶ Master-Slave集群模型的关键点∶

    • 上图(Master-Slave)绿色的为主节点,灰色的则为备份节点,这两个节点都是运行状态的。
    • zookeeper的作用就是为了当绿色的主节点宕机时,进行及时切换到备份的灰色节点上去,使其进行主从角色的互换,用于实现高可用性的方案。
    • Master-Slave集群模型的缺点也显而易见,就是不能做到分布式的topic、queue,当消息量巨大时,我们的MQ集群压力过大,没办法满足分布式的需求。
  • Nerwork:
    在这里插入图片描述

  • Network∶这里可以理解为网络通信方式,也可以说叫Network ofbrokers。这种方式真正解决了分布式消息存储和故障转移、broker切换的问题。可以理解消息会进行均衡;从Ac tiveMQ1.1版本起,ActiveMQ支持networks ofbrokers。它支持分布式的queues和topics。一个broker会相同对待所有的订阅(subscription)∶不管他们是来自本地的客户连接,,还是来自远程broker,它都会递送有关的消息拷贝到每个订阅。远程broker得到这个消息拷贝后,会依次把它递送到其内部的本地连接上。

  • 架构思考∶Network集群模型的关键点∶

    • 首先,这种方案需要两套或多套(Master-Slave)的集群模型才可以搞定,部署非常麻烦,需要两套或多套集群直接相互交叉配置,相互间能够感知到彼此的存在。下面我给出一段XML配置,简单来说就是在ActiveMQ的配置文件里要进行多套(Master-Sla ve)之间的 networkConnector配置工作∶

<broker brokerName&#61;"receiver" persistent&#61;"f alse" useJmx&#61;" false"><transportConnectors><transportConnector uri&#61;"tcp://localhost:62002" /></transportConnectors><networkConnectors><networkConnectoruri&#61;"static:( tcp://localhost:61616,tcp://remotehost:61616)"/></ networkConnectors>
</broker>

  • 其次&#xff0c;Network虽然解决了分布式消息队列这个难题&#xff0c;但是还有很多潜在的问题&#xff0c;最典型的就是资源浪费问题&#xff0c;并且也可能达不到所预期的效果;通常采用Master-Slave模型是传统型互联网公司的首选&#xff0c;作为互联网公司往往会选择开箱即用的消息中间件&#xff0c;从运维、部署、使用各个方面都要优于ActivcMQ&#xff0c;当然ActiveMQ毕竟是"老牌传统强Q"&#xff0c;Apache的顶级项目之一&#xff0c;目前正在进行新版本的重构&#xff08;对于5.X 版本&#xff09;与落地&#xff0c;下一代"Artemis代理"&#xff0c;也可以理解为"6.X";有兴趣的小伙伴可以关注一下官网&#xff0c;传送门如下∶https∶//activemq.apache.org/

推荐阅读
  • LeetCode笔记:剑指Offer 41. 数据流中的中位数(Java、堆、优先队列、知识点)
    本文介绍了LeetCode剑指Offer 41题的解题思路和代码实现,主要涉及了Java中的优先队列和堆排序的知识点。优先队列是Queue接口的实现,可以对其中的元素进行排序,采用小顶堆的方式进行排序。本文还介绍了Java中queue的offer、poll、add、remove、element、peek等方法的区别和用法。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • struts2重点——ValueStack和OGNL
    一、值栈(ValueStack)1.实现类:OGNLValueStack2.对象栈:CompoundRoot( ... [详细]
  • rabbitmq杂谈
    rabbitmq中的consumerTag和deliveryTag分别是干啥的,有什么用?同一个会话,consumerTag是固定的可以做此会话的名字,deliveryTag每次接 ... [详细]
  • RabbitMQ的消息持久化处理
    1、RabbitMQ的消息持久化处理,消息的可靠性是RabbitMQ的一大特色,那么RabbitMQ是如何保证消息可靠性的呢——消息持久化。2、auto ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • 本文介绍了一道经典的状态压缩题目——关灯问题2,并提供了解决该问题的算法思路。通过使用二进制表示灯的状态,并枚举所有可能的状态,可以求解出最少按按钮的次数,从而将所有灯关掉。本文还对状压和位运算进行了解释,并指出了该方法的适用性和局限性。 ... [详细]
  • AFNetwork框架(零)使用NSURLSession进行网络请求
    本文介绍了AFNetwork框架中使用NSURLSession进行网络请求的方法,包括NSURLSession的配置、请求的创建和执行等步骤。同时还介绍了NSURLSessionDelegate和NSURLSessionConfiguration的相关内容。通过本文可以了解到AFNetwork框架中使用NSURLSession进行网络请求的基本流程和注意事项。 ... [详细]
  • 本文总结了初学者在使用dubbo设计架构过程中遇到的问题,并提供了相应的解决方法。问题包括传输字节流限制、分布式事务、序列化、多点部署、zk端口冲突、服务失败请求3次机制以及启动时检查。通过解决这些问题,初学者能够更好地理解和应用dubbo设计架构。 ... [详细]
  • 本文整理了Java中org.apache.solr.common.SolrDocument.setField()方法的一些代码示例,展示了SolrDocum ... [详细]
  • Struts2+Sring+Hibernate简单配置
    2019独角兽企业重金招聘Python工程师标准Struts2SpringHibernate搭建全解!Struts2SpringHibernate是J2EE的最 ... [详细]
  • java线程池的实现原理源码分析
    这篇文章主要介绍“java线程池的实现原理源码分析”,在日常操作中,相信很多人在java线程池的实现原理源码分析问题上存在疑惑,小编查阅了各式资 ... [详细]
  • RabbitMq之发布确认高级部分1.为什么会需要发布确认高级部分?在生产环境中由于一些不明原因,导致rabbitmq重启,在RabbitMQ重启期间生产者消息投递失败,导致消息丢 ... [详细]
author-avatar
晴活的比较迷-茫m
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有