ActiveMQ是Apache软件基金会所研发开源的消息中间件,为应用程序提供高效的、可扩展的、稳定的和安全的企业级消息通信。

  现在的消息队列有不少,RabbitMQ、Kafka、RocketMQ,ZeroMQ等等,而ActiveMQ作为拥有十多年历史的产品,有着许许多多的成功案例,活跃的社区,让它在消息中间件市场占有稳定的一席,据说ActiveMQ的下一代apollo拥有更好的性能。

  ActiveMQ由java基于JMS1.1规范的实现,但是支持多种编程语言,如java、C、C++、C#、Python、PHP、Ruby等。

  先看看ActiveMQ的架构图:

  

  抛开网络服务(Network Services)不说,我们应该知道的是ActiveMQ的三个重要组成部分:连接(Connectors)、消息模式(Topic,Queue)、消息持久化方式。

  连接(Connectors)

  ActiveMQ提供了多种应用协议,如OpenWire、StompREST、WSNotification、XMPP、AMQP等,不同的协议有不同的特点,OpenWire用的比较多。

  我们要在应用中使用ActiveMQ,根据JSM规范,需要获得一个JMS connection factory,然后再去创建connection,这个时候往往需要指定所使用的的协议。

  消息模式

  ActiveMQ提供了两种消息模式:点对点模式(Queue)、发布订阅模式(Topic),这两种模式基本上可以覆盖大部分的需求了。

  1、点对点模式(Queue)

  点对点模式使用队列作为中间媒介,这里的队列就是我们所理解的一个先进先出的一个结构,一个或者多个生产者将消息发送到队列,然后多个消费者从队列安装消息的先后顺序去消费,注意,队列中的消息只会被一个消费者接受所消费。

  

  2、发布订阅模式(Topic)

  发布订阅模式使用topic作为中间媒介,而topic可以认为就是一个广播站,当一个或者多个生产者将消息发布到topic广播站之后,topic广播站会往当前已经注册订阅的每一个消费者广播消息(这里的消费者我们称为订阅者),注意,这里每一个订阅者都会收到消息。

  

  3、持久化订阅

  在发布订阅模式中,topic在接收到消息之后,只会给当前已经注册订阅了的订阅者广播消息,那问题来了,如果因为某些原因,如网络问题,导致订阅者断开连接一段时间,而在这段时间内有接收新的消息,那对于那些暂时断开的订阅者,消息是不是就丢了呢?基于这种原因,ActiveMQ将订阅者分为持久化订阅者和非持久化订阅者。非持久化订阅者就是不接受离线时生产的消息,而持久化订阅者则是通过往ActiveMQ中注册一个表明自己身份的ClientId(每个订阅者都有一个ClientId,或自动生成,或自行指定),topic收到消息时,会为处于离线状态的持久化订阅者根据它的ClientId保存消息,当下次相同ClientId的订阅者连接时就可以得到它离线状态下topic收到的消息了。

  4、死信队列

  死信队列(Dead Letter Queue)用来保存处理失败或者过期的消息,简称DLQ。根据apache ActiveMQ官网的说明,当发生以下操作时,消息将会被重新发送给消费者:

  1、在一个事务机制的会话中,调用会话的回滚rollback方法

  2、在一个事务机制的会话中,未调用提交commit方法就关闭会话

  3、会话使用CLIENT_ACKNOWLEDGE客户端签收模式时,调用会话的恢复recover方法

  4、客户端连接超时(可能正在执行的代码花费的时间超过配置的超时时间)

  当重发达到一定次数后(默认是6次,可配置),broker就会收到一个“Poison ACK”,俗称毒丸,接着broker就会将消息统一发送到一个队列,这个队列就是死信队列。 

  5、Advisory

  Advisory是ActiveMQ提供的对生产者、消费者、队列、Topic、消息等等提供的一套消息监控和管理机制,它在一系列的事件发生后,将事件特点以消息的形式发送到特定的Queue或者Topic,监听这些Queue和Topic的消费者就可以收到消息,以此来完成自定义的消息监控及管理。

  其实Advisory很常见,默认情况下,当你发送消息到ActiveMQ时,你就会发现ActiveMQ自动创建一些Topic,这些Topic就是Advisory,当然,你也可以配置使用Queue,以下是几个常见的Advisory:  

名称 说明
ActiveMQ.Advisory.Connection 当连接建立或者断开时
ActiveMQ.Advisory.Producer.Queue 生产者往队列发送消息时
ActiveMQ.Advisory.Producer.Topic 生产者往Topic发送消息时
ActiveMQ.Advisory.Consumer.Queue 消费者从队列消费消息时
ActiveMQ.Advisory.Consumer.Topic 消费者从Topic消费消息时

  更多信息,可以参考官网:http://activemq.apache.org/advisory-message

  消息持久化方式

  消息的持久化一般是为了避免消息丢失,即使服务器宕机重启之后,消息能自动恢复,而不是像内存数据一样被清除,当然,ActiveMQ也允许你使用内存来存储消息。

  当前ActiveMQ默认的持久化方式是采用Kahadb,而目前主流讨论的持久化方案主要是:AMQ、Kahadb、JDBC、Leveldb、ReplicatedLeveldb。

持久化方式 说明
AMQ ActiveMQ5.3之前版本默认持久化方式,采用日志文件的存储方式,写入和恢复速度都很快
Kahadb Kahadb是一个专门针对消息持久化的解决方案,在ActiveMQ5.4及之后的版本默认采用的存储化方式,性能等各方面比AMQ更优
JDBC JDBC方式是将消息数据写入到数据库中,但是频繁的从数据库读取写入是一件很耗性能的事,于是在此方式的基础上又提出了Journal优化方案,使用高速缓存写入技术,当消费者消费速度跟不上生产者的生产速度时才写入数据库,这样大大提高了性能
Leveldb ActiveMQ5.8之后提出来持久化方式,和Kahadb很相似,但是性能比Kahadb更优,至于为什么不将Leveldb作为默认持久化方式,各种说法都有,还有,好像以后Leveldb以后将不会被支持了
ReplicatedLeveldb  ReplicatedLeveldb是ActiveMQ和zookeeper整合时采用的持久化方式,一般在ActiveMQ做集群部署时用到

  持久化方式还有很多,只要你愿意,ActiveMQ允许你将消息存储在内存中,甚至你还可以自行实现持久化方式。

  结语

  这里只是简单的介绍认识了一下ActiveMQ,当然,ActiveMQ肯定不会只有这么点东西,这不是一篇简单的博文能说完的,像ActiveMQ还有单机和集群的部署方案,对于集群,可能还有负载均衡,而死信策略只是众多的策略之一,还有消息转发策略、消息恢复策略、消息剔除策略等等,再比如ActiveMQ账号权限控制,也是可以学习了解的方面,只不过这些东西可能需要项目经验慢慢积累了。

  更多信息可以查看ActiveMQ的官网介绍:http://activemq.apache.org

ActiveMQ基础教程(一):认识ActiveMQ的更多相关文章

  1. ActiveMQ基础教程----简单介绍与基础使用

    概述 ActiveMQ是由Apache出品的,一款最流行的,能力强劲的开源消息总线.ActiveMQ是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,它非常快速,支持多 ...

  2. ActiveMQ基础教程(四):.net core集成使用ActiveMQ消息队列

    接上一篇:ActiveMQ基础教程(三):C#连接使用ActiveMQ消息队列 这里继续说下.net core集成使用ActiveMQ.因为代码比较多,所以放到gitee上:https://gitee ...

  3. ActiveMQ基础教程(三):C#连接使用ActiveMQ消息队列

    接上一篇:ActiveMQ基础教程(二):安装与配置(单机与集群) 安装部署好集群环境:192.168.209.133:61616,192.168.209.134:61616,192.168.209. ...

  4. ActiveMQ基础教程(二):安装与配置(单机与集群)

    因为本文会用到集群介绍,因此准备了三台虚拟机(当然读者也可以使用一个虚拟机,然后使用不同的端口来模拟实现伪集群): 192.168.209.133 test1 192.168.209.134 test ...

  5. ActiveMQ基础教程JMS概述

    什么是JMS JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息 ...

  6. ActiveMQ基础使用

    概述 ActiveMQ是由Apache出品的,一款最流行的,能力强劲的开源消息总线.ActiveMQ是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,它非常快速,支持多 ...

  7. 成小胖学习ActiveMQ·基础篇

    过了个春节,回到公司的成小胖变成了成大胖.但是你们千万别以为他那个大肚子里面装的都是肥肉,里面的墨水也多了不少嘞,毕竟成小胖利用春节的半个月时间专心学习并研究了 ActiveMQ,嘿嘿……这不,为了检 ...

  8. ActiveMQ学习教程/2.简单示例

    ActiveMQ学习教程(二)——简单示例 一.应用IDEA构建Maven项目 File->New->Module...->Maven->勾选->选择->Next ...

  9. ActiveMQ学习教程/1.简要介绍与安装

    ActiveMQ学习教程(一)——简要介绍与安装 一.名词: 1.JMS:即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的 ...

随机推荐

  1. 【Go】【Basic】MacOS上搭建GO开发环境

    1. GO下载 1.1. 下载地址:https://www.golangtc.com/download (需要科学上网) 1.1.1. PKG安装: 下载这个包:go1.9.2.darwin-amd6 ...

  2. Private Destructor

    Predict the output of following programs. 1 #include <iostream> 2 using namespace std; 3 4 cla ...

  3. java实现数组集合转成json格式

    一.下载fastjson.jar http://repo1.maven.org/maven2/com/alibaba/fastjson 二.项目添加jar包 Java Build Path 三.导入类 ...

  4. CSS伪类选择器实现三角形

    使用css实现常用的三角效果 项目中三角: .breadcrumb{ height: 40px; line-height: 40px; padding: 0 20px; border-top: 1px ...

  5. Jenkins环境变量

    目录 一.环境变量 二.自定义环境变量 三.自定义全局变量 四.常用变量定义 五.常用环境变量 一.环境变量 环境变量可以被看作是pipeline与Jenkins交互的媒介.比如,可以在pipelin ...

  6. Git remote 远程仓库链接管理

    SVN 使用单个集中仓库作为开发人员的通信枢纽,通过在开发人员的工作副本和中央仓库之间传递变更集来进行协作. 这与 Git 的分布式协作模型不同,后者为每个开发人员提供了自己的仓库副本,并具有自己的本 ...

  7. PlatformIO手工升级stcgal到1.6版本

    PlatformIO自带的stcgal版本为1.4, 这个版本只支持到STC15, 不支持STC8. 在使用PlatformIO内建的upload写入STC8A8K64S4A12时, 会提示不识别的协 ...

  8. JAVA获取某个月(当月)第一天的开始时刻和某个月(当月)最后一天的最后时刻

    package com.date; import java.text.SimpleDateFormat; import java.util.Calendar; public class Test { ...

  9. Django网站实例效果

    Django是一种开源的大而且全的Web应用框架,是由python语言来编写的,优点十分明显: 功能完善.要素齐全:自带大量常用工具和框架(比如分页,auth,权限管理), 适合快速开发企业级网站. ...

  10. lldb调试C++总结(2)

    lldb help 可能你会忘记某些指令的用法, 使用help可以帮助你. (lldb) breakpoint --help invalid command 'breakpoint --help'. ...