核心架构
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 进行交互时,很可能最终都会创建一个新的连接和会话,这是一种反模式。