MQ ActiveMQ入门介绍及核心原理
1 概述
Apache下的一个非常流行的消息中间件,使用JAVA支持的JMS Provider实现,所以和JAVA程序完全兼容,开发java项目中间件首选。当然ActiveMQ不仅仅支持JAVA,在C++、Dotnet、Python、Php、Ruby、Websocket等多种客户端都可以提供良好的服务。
ActiveMQ凭借其丰富的API、多种集群构建模式使得他成为业界老牌消息中间件,在中小型企业中应用广泛!
在实际的使用,activeMQ在高并发,高性能的应用中,会抛出JMSException,并且断开链接的情况,rabbitMQ是否能保持长链接状态,维持链接,避免资源消耗。
因此大规模、高并发的应用服务的消息中间件技术选型,譬如淘宝、京东这种大型的电商网站,尤其是双11这种特殊时间,ActiveMQ可能就显得力不从心了,就需要采用其他的消息中间件,例如 kafka、rabbitMQ等。
有兴趣的小伙伴可以关注一下官网,传送门如下:https://activemq.apache.org/
MOM(Message Oriented Middleware),分布式系统的集成,指的是利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。
2 ActiveMQ原理
2.1 运行模型
- PTP点对点通信: 使用queue作为信息载体,满足生产者与消费者模式,一个消息只能被一个消费者使用,没有被消费的消息可以持久保持在queue 中等待被消费。
- Pub/Sub发布订阅模式: 使用Topic主题作为通信载体,类似于广播模式,在消息广播期间,所有的订阅者都可以接受到广播消息,在一条消息广播之后才订阅的用户是收不到该条消息的。
2.2 组成模块
- Broker:消息服务器,作为server提供消息核心服务。
- Producer:消息生产者,业务的发起方,负责生产消息传输给broker。
- Consumer:消息消费者,业务的处理方,负责从broker获取消息并进行业务逻辑处理。
- Topic:主题,发布订阅模式下的消息统一汇集地,不同生产者向topic发送消息,由MQ服务器分发到不同的订阅者,实现消息的广播。
- Queue:队列,PTP模式下,特定生产者向特定queue发送消息,消费者订阅特定的 queue完成指定消息的接收。
- Message:消息体,根据不同通信协议定义的固定格式进行编码的数据包,来封装业务 数据,实现消息的传输。
3 实用性分析
3.1 服务性能
ActiveMQ的性能一般,无法应对大规模、高并发应用服务的使用场景。
3.2 数据存储
- 默认采用kahadb存储(索引文件形式存储),也可以使用高性能的google leveldb(内存数据库存储), 或者可以使用MySql、Oracle进程消息存储(关系型数据库存储)。
3.3 集群架构
ActiveMQ 可以与zookeeper进行构建 主备集群模型,并且多套的主备模型直接可以采用Network的方式构建分布式集群
4 集群模式
4.1 Master-Slave集群
- Master-Slave:顾名思义,就是主从方式,当然这里要理解为主备的方式,也就是双机热备机制;Master Slave 背后的想法是,消息被复制到slave broker,因此即使master broker遇到了像硬件故障之类的错误,你也可以立即切换到slave broker而不丢失任何消息。 Master Slave是目前ActiveMQ推荐的高可靠性和容错的解决方案。
- 架构思考:Master-Slave集群模型的关键点:
- 上图(Master-Slave)绿色的为主节点,灰色的则为备份节点,这两个节点都是运行状态的。
- zookeeper的作用就是为了当绿色的主节点宕机时,进行及时切换到备份的灰色节点上去,使其进行主从角色的互换,用于实现高可用性的方案。
- Master-Slave集群模型的缺点也显而易见,就是不能做到分布式的topic、queue,当消息量巨大时,我们的MQ集群压力过大,没办法满足分布式的需求
4.2 Network集群
Network:这里可以理解为网络通信方式,也可以说叫Network of brokers。这种方式真正解决了分布式消息存储和故障转移、broker切换的问题。可以理解消息会进行均衡;从ActiveMQ1.1版本起,ActiveMQ支持networks of brokers。它支持分布式的queues和topics。一个broker会相同对待所有的订阅(subscription):不管他们是来自本地的客户连接,还是来自远程broker,它都会递送有关的消息拷贝到每个订阅。远程broker得到这个消息拷贝后,会依次把它递送到其内部的本地连接上。
架构思考:Network集群模型的关键点:
首先,这种方案需要两套或多套(Master-Slave)的集群模型才可以搞定,部署非常麻烦,需要两套或多套集群直接相互交叉配置,相互间能够感知到彼此的存在。下面我给出一段XML配置,简单来说就是在ActiveMQ的配置文件里要进行多套(Master-Slave)之间的 networkConnector配置工作:
<broker brokerName="receiver" persistent="false" useJmx="false"><transportConnectors><transportConnector uri="tcp://localhost:62002"/></transportConnectors><networkConnectors><networkConnector uri="static:( tcp://localhost:61616,tcp://remotehost:61616)"/></networkConnectors> </broker>
其次,Network虽然解决了分布式消息队列这个难题,但是还有很多潜在的问题,最典型的就是资源浪费问题,并且也可能达不到所预期的效果;通常采用Master-Slave模型是传统型互联网公司的首选,作为互联网公司往往会选择开箱即用的消息中间件,从运维、部署、使用各个方面都要优于ActiveMQ,当然ActiveMQ毕竟是 “老牌传统强Q”,Apache的顶级项目之一,目前正在进行新版本的重构(对于5.X版本)与落地,下一代 “Artemis代理”,也可以理解为 “6.X”。
5 相关信息
- 博文不易,辛苦各位猿友点个关注和赞,感谢
MQ ActiveMQ入门介绍及核心原理相关推荐
- Zookeeper——入门介绍(相关原理、安装启动及使用操作)
关注微信公众号:CodingTechWork,一起学习进步. 引言 对zk的学习和简单使用进行一个总结. zk介绍 zk概述 zk是一个具有高可用性的高性能协调服务. zk的watcher对象有两 ...
- k8s实践(1)--k8s集群入门介绍和基础原理
我们学习安排:由浅入深 1.简单了解集群的工作原理和基础概念,名词解释. 2.安装etcd集群:etcd分布式键值存储系统,用于保持集群状态,比如Pod.Service等对象信息. 3.安装k8s集群 ...
- 【HEC-RAS】基础入门介绍教程-初步原理01
说明 本人因工作需要自学hecras,学艺不精,在此将自己的学习成果记录下来,知识无价,但整理费事费力,如有错误,欢迎私信或留言进行探讨. HEC-RAS简介 HEC-RAS用于河道稳定和非稳定流一维 ...
- 新书介绍 -- 《Redis核心原理与实践》
大家好,今天给大家介绍一下我的新书 -- <Redis核心原理与实践>. 后端开发的同学应该对Redis都不陌生,Redis由于性能极高.功能强大,已成为业界非常流行的内存数据库. < ...
- MQ消息队列(1)12点核心原理总结
消息队列已经逐渐成为分布式应用场景.内部通信.以及秒杀等高并发业务场景的核心手段,它具有低耦合.可靠投递.广播.流量控制.最终一致性 等一系列功能. RabbitMQ.RocketMQ.ActiveM ...
- ZipKin原理学习--ZipKin入门介绍
ZipKin入门介绍 Zipkin是一款开源的分布式实时数据追踪系统(Distributed Tracking System),基于 Google Dapper的论文设计而来,由 Twitter 公司 ...
- html设置样式不继承_web前端入门到实战:css的核心原理分为优先级原则与继承原则两大部分...
css原理:1.优先原则=>后解析的内容会覆盖之前解析的内容(所谓解析就是读取的css样式)2.继承原则=>嵌套里面的标签拥有外部标签的某些样式,子元素可以继承父元素的属性 1>优先 ...
- 区块链入门与去中心化应用实战 之一 第3章 区块链技术核心原理实现
第3章 区块链技术核心原理实现 建立项目,确定区块结构 实现区块类结构-添加交易 实现创建区块 实现工作量证明 添加节点通信功能 交易接口实现 挖矿接口实现 实现注册节点 实现共识机制
- 【Java基础教程】(一)入门介绍篇 · 上:快速掌握核心概念,开启Java世界的探索之旅!这篇Java入门宝典助你翱翔~
Java基础教程之入门介绍 · 上 本节学习目标 1️⃣ Java发展简史 1.1 诞生 1.2 发展 1.3 分支 2️⃣ 特征 3️⃣ 代码执行过程
最新文章
- 政府要尽快对应用商店出台管理办法
- 风变编程的python课程怎么样-高效学风变编程Python,解锁不一样的职场进阶之路...
- 请求分页内存管理的模拟 c++代码_C开发实战-内存管理
- WCF 性能基准报告
- C++学习基础七——深复制与浅复制
- Spring Boot定时任务-SpringBoot整合Quartz
- 对clear float 的理解
- php默认站点,PHP学习之Apache修改默认站点的目录
- weblogic正常启动,但是告警:Could not get configuration lock used to serialize access to c
- 总纲篇:产品结构设计指导VII(本博客指引章节)
- 金万维异速联产品简介
- autojs写的全网视频解析app,带解析接口。
- python获取图片曲线数据_从图片中提取曲线坐标数据
- 计量广义差分操作过程_计量学堂 | 计量经济学最基本的31个问题
- Python爬虫实战(1):抓取毒舌电影最新推送
- QtAV视频播放器的介绍、编译以及简单使用
- 解决 Windows 无法访问共享
- 埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 A-Wasserstein Distance
- 哇噻,这个 IoT 物联网智能灯也太炫酷了吧!
- 用c++模拟ATM机
热门文章
- android 基础一 Camera2实现拍照功能
- 【Java之轨迹】SpringBoot 实现动态往数据库中添加时间点,使程序在规定的时间点执行任务(定时任务变形应用,附实战:动态日程提醒任务调度)
- 信息奥赛一本通1215:迷宫
- 还在用递归来计算菲波那契数列?你Time Limit Exceeded了
- 50句话悟透爱情婚姻的本质
- 微信小程序_wxcharts(图表不随页面滑动因素之一)
- 2021年深圳市人才伯乐奖申领发放申报条件及流程,奖励200万
- Linux下date命令,格式化输出
- Vue组件封装npm发布及应用
- 【计算机网络】湖科大微课堂笔记 p33-35 MAC地址、IP地址以及ARP协议