概述
官网:https://activemq.apache.org/
Apache ActiveMQ® is the most popular open source, multi-protocol, Java-based message broker. It supports industry standard protocols so users get the benefits of client choices across a broad range of languages and platforms. Connect from clients written in JavaScript, C, C++, Python, .Net, and more. Integrate your multi-platform applications using the ubiquitous AMQP protocol. Exchange messages between your web applications using STOMP over websockets. Manage your IoT devices using MQTT. Support your existing JMS infrastructure and beyond. ActiveMQ offers the power and flexibility to support any messaging use-case.
翻译:
Apache ActiveMQ是最流行的开源、多协议、基于Java的消息代理。它支持行业标准协议,因此用户可以从多种语言和平台的客户端选择中受益。从用JavaScript、C、C++、Python、.Net等编写的客户端连接。使用无处不在的AMQP协议集成多平台应用程序。使用STOMP over WebSocket在web应用程序之间交换消息。使用MQTT管理您的物联网设备。支持您现有的JMS基础架构及其他基础架构。ActiveMQ提供了支持任何消息传递用例的能力和灵活性。
从官网里可以看到,是有两个ActiveMQ版本介绍,分别是ActiveMQ "Class"和ActiveMQ "Artemis"。
ActiveMQ "Class":为多代应用程序服务的长期建立的、无止境的可插拔体系结构。
JMS 1.1,具有完整的客户端实现,包括JNDI
使用共享存储的高可用性
熟悉基于JMS的寻址模型
用于分配负载的“代理网络”
KahaDB和JDBC持久化选项
ActiveMQ "Artemis":用于下一代消息传递应用程序的高性能、无阻塞体系结构。
JMS 1.1和2.0+雅加达消息传递2.0和3.0,具有完整的客户端实现,包括JNDI
使用共享存储或网络复制的高可用性
一种简单而强大的协议无关寻址模型
分布式负载的灵活聚类
用于低延迟持久性和JDBC的高级日志实现
与ActiveMQ“Classic”的高功能奇偶性可简化迁移
用于灾难恢复的异步镜像
数据驱动负载平衡
ActiveMQ "Class"和ActiveMQ "Artemis"算是两个版本的ActiveMQ,以前我们所说的ActiveMQ,实质指的是ActiveMQ "Class"这个版本。而ActiveMQ "Artemis"被誉为下一代的ActiveMQ,从功能上会比ActiveMQ "Class"这个版本要强大。
因此,在本文中,我们会以ActiveMQ "Artemis"为案例。
安装
下载
我们现在官网里下载个最新版本的,毕竟我们只是为了学习和了解这个技术,用最新的版本,也不是很影响。如果在实际项目中,建议用成熟的版本,万一出现问题,在网上也容易找到解决的方法。
我自己也在百度网盘保存了这个版本安装包,有需要的可以到我的百度网盘那里下载。
链接:https://pan.baidu.com/s/1JRMsn-DQ-GYtK7z7IQpKrQ
提取码:jipr
或者也可以到官网那里下载:
本来想选最新的版本,但考虑到我自己的JDK还是1.8的,所以还是选择一个相对应的版本。
装在windows环境,所以直接选个zip格式就可以。
直接解压这个压缩包,目录结构如下:
安装与配置
创建代理实例
代理实例是包含与代理进程关联的所有配置和运行时数据(例如日志和消息日志)的目录。我们可以在指定的目录里进行创建,官网的意思是不建议直接在ActiveMQ Artemis的安装目录里创建,以后升级不方便,建议做好隔离。我这里为了方便后续管理,还是先把它放在安装目录里,毕竟自己以后也不会直接在自己的电脑环境里做开发环境。
通过windows系统的DOS界面进入ActiveMQ Artemis安装目录(E:\softwareself\apache-artemis-2.19.1-bin\apache-artemis-2.19.1\bin),以我的为例:
先切换到E盘,然后进入具体路径:
e:
cd E:\softwareself\apache-artemis-2.19.1-bin\apache-artemis-2.19.1\bin
执行创建代理实例命令:
artemis create E:\softwareself\apache-artemis-2.19.1-bin\apache-artemis-2.19.1\bin\myartemis
Creating ActiveMQ Artemis instance at: E:\softwareself\apache-artemis-2.19.1-bin\apache-artemis-2.19.1\bin\myartemis
然后提示输入用户和密码:
都是:admin
是否允许任何人 登录?直接输入:Y。
然后等一会,就创建完成。
我们可以先看回E:\softwareself\apache-artemis-2.19.1-bin\apache-artemis-2.19.1\bin目录下有什么:
多了一个“myartemis”文件夹,这个就是我们刚刚创建的。
进去后的目录是这样的。
运行
在上面创建成功后,其实提示信息里是有一个启动命令的,大家可以返回去看看。
执行以下命令:
E:\softwareself\apache-artemis-2.19.1-bin\apache-artemis-2.19.1\bin\myartemis\bin\artemis run
然后通过浏览器来访问一下界面,看看是否已经安装成功。
地址:http://localhost:8161/
出来这个界面,就表示安装成功了,接下来就可以进一步学习了。
停止命令:
E:\softwareself\apache-artemis-2.19.1-bin\apache-artemis-2.19.1\bin\myartemis\bin\artemis stop
ActiveMQ基础知识
我们可以根据AciveMQ官网的documentaion文档来学习,链接如下:
https://activemq.apache.org/components/artemis/documentation/2.19.0/
上面这个是2.19.0版本的,大家也可以根据自己的版本来学习。
ActiveMQ是什么?
ActiveMQ Artemis:
Apache ActiveMQ Artemis 是一个开源项目,旨在构建一个多协议、可嵌入、高性能、集群化、异步消息传递系统。
Apache ActiveMQ Artemis 是面向消息的中间件 (MoM) 的一个示例。
ActiveMQ Artemis的优势:
100% 开源软件。Apache ActiveMQ Artemis 使用 Apache Software License v 2.0 获得许可,以最大限度地减少采用障碍。
Apache ActiveMQ Artemis 的设计考虑了可用性。
用 Java 编写。可在任何具有 Java 8+ 运行时的平台上运行,从 Windows 桌面到 IBM 大型机应有尽有。
惊人的表现。我们开创性的高性能日志以通常用于非持久消息传递的速率提供持久消息传递性能,我们的非持久消息传递性能也令人震惊。
完整的功能集。您在任何严肃的消息传递系统中所期望的所有功能,以及您在其他任何地方都找不到的其他功能。
优雅、简洁的设计,第三方依赖最少。独立运行 ActiveMQ Artemis,在您最喜欢的 Java EE 应用程序服务器中集成运行,或在您自己的产品中嵌入运行。由你决定。
无缝的高可用性。我们提供具有自动客户端故障转移的 HA 解决方案,因此您可以保证在服务器发生故障时零消息丢失或重复。
非常灵活的集群。创建知道如何负载平衡消息的服务器集群。通过不可靠的连接将地理上分布的集群链接起来,形成一个全球网络。以高度灵活的方式配置消息路由。
消息传递概念
Apache ActiveMQ Artemis 是一个异步消息系统,是面向消息的中间件的一个示例。
消息系统允许将异构系统松散地耦合在一起,同时通常提供可靠性、事务和许多其他功能。
与基于远程过程调用(RPC) 模式的系统不同,消息系统主要使用异步消息传递模式,请求和响应之间没有紧密的关系。大多数消息传递系统还支持请求-响应模式,但这不是消息传递系统的主要特性。
将系统设计为端到端异步可以让真正利用硬件资源,最大限度地减少阻塞 IO 操作的线程数量,并充分利用网络带宽。使用 RPC 方法,必须等待发出的每个请求的响应,因此受到网络往返时间或网络延迟的限制。使用异步系统,可以将消息流传输到不同方向,因此受到网络带宽而不是延迟的限制。这通常允许创建性能更高的应用程序。
消息系统将消息的发送者与消息的消费者分离。消息的发送者和消费者是完全独立的,彼此一无所知。这允许您创建灵活、松散耦合的系统。
通常,大型企业使用消息传递系统来实现将异构系统松散耦合在一起的消息总线。消息总线通常构成企业服务总线的核心。(ESB)。使用消息总线来解耦不同的系统可以使系统更容易增长和适应。它还允许更灵活地添加新系统或淘汰旧系统,因为它们之间没有脆弱的依赖关系。
消息传递方式
消息系统通常支持两种主要的异步消息方式:消息队列(点对点)方式和发布订阅方式。
点对点
通过这种类型的消息传递,可以将消息发送到队列。然后消息通常被持久化以提供传递保证,然后一段时间消息传递系统将消息传递给消费者。消费者处理消息后,会确认消息。一旦消息被确认,它就会从列队中消失,并无法再次传递。如果系统在消息服务器收到消费者的确认之前崩溃,那么在系统重新恢复时,消息将可以再次传递给消费者。
使用点对点消息传递,队列中可以有许多消费者,但特定消息最多只能被其中一个消费者消费。队列的发送者(也称为生产者)与队列的接受者(也称为消费者)完全分离。
发布-订阅
通过发布-订阅消息,发送者可以向服务器上的实体发送消息,通常称为主题。
一个主题可以有很多订阅者,订阅者只是主题消费者的另一种说法。每个订阅者都会收到发送到主题的每条消息的副本。这与消息队列模式不同,其中每条消息仅由单个消费者使用。
订阅可以选择是持久的,这意味着它们保留发送到主题的每条信息副本,知道订阅者使用它们——即使服务器崩溃或者在两者之间重新启动。非持久订阅最多只能持续创建它们的连接生命周期。
消息传递API和协议
系统提供了它们自己的专有API,客户端通过这些API与消息传递系统进行通信。主要包含:
JMS和Jakarta Messaging。用于封装消息队列和发布-订阅消息模式的Java API。
系统特定的API。许多系统都提供了自己的编程API,以便于消息传递系统进行交互。Apache ActiveMQ Artemis提供了自己的核心客户端 API 供客户端使用。
RESTful API。使用REST方法,消息传递资源作为由URI定义的资源进行操作,并且通常对这些资源使用一组简单的操作,例如 PUT、POST、GET 等。消息传递的 REST 方法通常使用 HTTP 作为其底层协议。
AMQP。AMQP是可互操作信息传递的规范,它还定义了一种有线格式,因此任何AMQP客户端都可以与任何支持AMQP的消息传递系统一起工作。
MQTT。MQTT是一种轻量级的连接协议,它旨在设备和网络受限的环境中运行。
Stomp。Stomp是一个非常简单的文本协议,用于与消息传递系统进行互操作。它定义了一种有线格式,因此理论上任何Stomp客户端都可以使用任何支持Stomp的消息传递系统。
OpenWire。ActiveMQ 5.x的有线协议。
其它特性
高可用性(HA)。意味着系统应在一台或多台服务器发生故障后保持运行。对HA的支持程度因不同的消息传递系统而异。Apache ActiveMQ Artemis提供自动故障转移,当实时服务器发生故障时,会话会自动重新连接到备份服务器。
集群。许多消息系统允许创建为集群式的消息传递服务器组。集群允许发送和消费消息的负载分散在许多服务器上,并且允许系统通过向集群添加新服务器来水平扩展。
桥接和路由。一些消息传递系统允许将孤立的集群或单个节点桥接在一起,通常通过不可靠的连接,如广域网(WAN)或互联网。网桥通常从一台服务器上的队列中消费,并将消息转发到不同服务器上的另一个队列。网桥处理不可靠的连接,当连接再次可用时自动重新连接。Apache ActiveMQ Artemis 网桥可以配置过滤器表达式以仅转发某些消息,也可以挂钩转换。还允许在服务器端配置中配置队列之间的路由。这允许建立复杂的路由网络,将消息从一个目的地转发或复制到另一个目的地,从而形成一个由互连代理组成的全球网络。
架构设计
核心架构
Apache ActiveMQ Artemis 核心被简单地设计为一组普通的旧 Java 对象 (POJO),每个 Apache ActiveMQ Artemis 服务器都有自己的超高性能持久日志,用于消息和其他持久性。使用高性能日志可以实现惊人的持久性消息性能,这是使用关系数据库进行持久性时无法实现的(尽管必要时 JDBC 仍然是一个选项)。
Apache ActiveMQ Artemis 客户端,可能在不同的物理机器上,与 Apache ActiveMQ Artemis 代理交互。Apache ActiveMQ Artemis 目前为客户端的消息传递提供了三个 API 实现:
核心客户端API。这是一个简单直观的Java API,与Artemis内部核心保持一致。允许对代理对象进行更多控制,Core API还提供了一整套消息传递功能,而没有JMS的一些复杂性。
JMS 2.0客户端API。标准JMS API在客户端可用,此客户端还符合Jakarta Messaging 2.0规范。
Jakarta Messaging 3.0客户端API。这与JMS 2.0 API基本相同。唯一的区别是包名称使用Jakarta insead的javax,这种差异是由于从Orale的Java EE迁移到Eclipse的Jakarta EE造成的。
Apache ActiveMQ Artemis 还在服务器上提供了不同的协议实现,因此可以为这些协议使用各自的客户端:
AMQP
OpenWire
MQTT
Stomp
HornetQ(用于 HornetQ 客户端)。
Core(Artemis CORE 协议)
JMS 语义由客户端的 JMS 外观层实现。
Apache ActiveMQ Artemis 代理不使用 JMS,实际上对 JMS 也一无所知,它是一种与协议无关的消息传递服务器,旨在与多种不同的协议一起使用。
当用户在客户端使用 JMS API 时,所有 JMS 交互都将转换为 Apache ActiveMQ Artemis 核心客户端 API 上的操作,然后使用核心协议通过线路传输。
关系示意图:
Apache ActiveMQ Artemis 服务器交互的两个用户应用程序。User Application 1 使用 JMS API,而 User Application 2 直接使用核心客户端 API。从图中可以看出,JMS API 是由客户端的一个外层实现的。
Stand-alone Broker(单机代理)
正常单机信息代理配置包括一个核心消息代理和许多消息代理和许多协议管理器。
架构图如下:
Embedded Broker(嵌入式代理)
Apache ActiveMQ Artemis 核心被设计为一组简单的 POJO,因此如果有一个应用程序需要内部消息传递功能,但不想将其公开为 Apache ActiveMQ Artemis 代理,您可以直接在自己的应用程序中实例化和嵌入代理。
与 Java/Jakarta EE 应用服务器集成
Apache ActiveMQ Artemis 提供了自己的全功能 Java 连接器架构 (JCA) 适配器,使其能够轻松集成到任何 Java/Jakarta EE(以下简称“EE”)兼容的应用程序服务器或 servlet 引擎中。
EE 应用程序服务器提供消息驱动 Bean (MDB),它是一种特殊类型的 Enterprise Java Bean (EJB),可以处理来自 JMS 系统或邮件系统等来源的消息。
MDB 最常见的用途可能是使用来自 JMS 消息传递系统的消息。
根据 EE 规范,应用服务器使用 JCA 适配器与 JMS 消息传递系统集成,以便它可以为 MDB 使用消息。
然而,JCA 适配器不仅被 EE 应用程序服务器用于 通过 MDB消费消息,它还被用于向 JMS 消息传递系统发送消息时,例如从 EJB 或 servlet 内部。
从 EE 应用程序服务器内部与 JMS 消息传递系统集成时,始终建议通过 JCA 适配器完成。事实上,根据 EE 规范,不使用 JCA 直接与 JMS 消息传递系统通信是非法的。
应用程序服务器的 JCA 服务提供了额外的功能,例如连接池和自动事务登记,这在使用消息传递(例如,从 EJB 内部)时是可取的。可以直接从 EJB、MDB 或 servlet 与 JMS 消息传递系统通信,而无需通过 JCA 适配器,但不建议这样做,因为将无法利用 JCA 功能,例如 JMS 会话的缓存,这可能会导致性能不佳。
下面的图显示了通过 Apache ActiveMQ Artemis JCA 适配器与 Apache ActiveMQ Artemis 服务器集成的应用程序服务器。请注意,EJB 会话或实体 bean 和消息驱动 bean 之间的所有通信都通过适配器而不是直接到 Apache ActiveMQ Artemis。
带有禁止标志的大箭头显示一个 EJB 会话 bean 直接与 Apache ActiveMQ Artemis 服务器对话。不建议这样做,因为每次想从 EJB 进行交互时,很可能最终都会创建一个新的连接和会话,这是一种反模式。