本文写在Artemis尚未迁移至ActiveMQ6.X的时间点
Apache ActiveMQ™是最流行的开源,多协议,基于Java的消息服务器。它支持行业标准协议,因此用户可以通过广泛的语言和平台选择。可以使用C,C ++,Python,.Net等连接。使用无处不在的AMQP协议集成您的多平台应用程序。使用STOMP通过websockets 在Web应用程序之间交换消息。使用MQTT管理您的IoT设备。支持您现有的JMS基础架构及其他。ActiveMQ提供强大的功能和灵活性,以支持任何消息传递用例。
在ActiveMQ官网上目前有两种不同的ActiveMQ可供选择:
一旦Artemis与5.x代码库达到足够的功能奇偶校验,Artemis最终将成为ActiveMQ 5.x的继承者,它将成为ActiveMQ 6.初始版本(参见可用迁移文档)。
ActiveMQ 5“经典” | ActiveMQ Artemis |
---|---|
长期建立的,无限可插拔的架构,服务于多代应用程序。 | 用于下一代事件驱动的消息传递应用程序的高性能,非阻塞体系结构。 |
* JMS 1.1具有完整的客户端实现,包括JNDI | * JMS 1.1和2.0,包括JNDI在内的完整客户端实现 |
* 使用共享存储的高可用性 | * 使用共享存储或网络复制的高可用性 |
* 用于分配负载的“broker网络” | * 简单而强大的协议无关寻址模型 |
* 熟悉的基于JMS的寻址模型 | * 灵活的群集,用于分配负载 |
* 用于持久性的KahaDB和JDBC选项 | * 用于低延迟持久性和JDBC的高级日志实现 |
* 使用共享存储的高可用性 | * 与ActiveMQ 5实现高特性奇偶校验,以简化迁移 |
虽然ActiveMQ与Artemis设计目的都是做同样的工作,但内部的工作方式却不同。下面在规划迁移时需要注意的一些最显着的体系结构差异。
在ActiveMQ中,我们有一些IO连接层的不同实现,如tcp(同步一个)和nio(非阻塞一个)。在Artemis中,IO层是使用Netty实现的,Netty是一个nio框架。这意味着不再需要在不同的实现之间进行选择,因为默认情况下使用非阻塞实现。
每个broker的另一个重要部分是消息存储。大多数ActiveMQ用户都熟悉KahaDB。它包括用于快速顺序存储消息(和其他命令包)的消息日志以及用于在需要时检索消息的索引。
Artemis有自己的消息存储。它仅包含仅附加消息日志。由于分页的完成方式不同,因此不需要消息索引。我们将在一分钟内详细讨论这个问题。在这一点上说这两个商店不可互换是很重要的,如果需要,必须仔细计划数据迁移。
分页差异是什么意思?分页是当代理无法将所有传入消息保存在其内存中时发生的过程。如何处理这种情况的策略在两个经纪人之间有所不同。ActiveMQ有游标,它基本上是准备分发给消费者的消息缓存。它会尝试将所有传入的消息保留在那里。当我们用完可用内存时,消息会添加到商店,但缓存会停止。当空间再次可用时,代理将通过批量从商店中提取消息来再次填充缓存。因此,我们需要在代理运行时期间不时读取日志。为此,我们需要维护日记索引,以便可以在日记中跟踪消息的位置。
Artemis在这方面(分页)的工作方式不同。整个消息日志保存在内存中,消息直接从它发送。当我们内存不足时,会在生产者端(在他们命中代理之前)分页消息。然后按照它们到达的顺序存储在顺序页面文件中。释放内存后,消息将从这些页面文件移动到日志中。通过这样的分页工作,仅在代理启动时才从文件日志中读取消息,以便重新创建该日志的内存中版本。在这种情况下,日记只是按顺序读取,这意味着不需要在日志中保留消息索引。
这是ActiveMQ 5.x和Artemis之间的主要区别之一。在早期了解它很重要,因为它会影响很多目标策略设置以及我们如何配置代理以便正确支持这些场景。
两者另一个很大的区别是消息寻址和路由的方式上。ActiveMQ最初是作为开源JMS实现开始的,因此其核心所有JMS概念(如队列,主题和持久订阅)都是作为一等公民实现的。这一切都基于项目中开发的OpenWire协议,甚至KahaDB消息存储都是以OpenWire为中心的。这意味着所有其他支持的协议(如MQTT和AMQP)都在内部转换为OpenWire。
Artemis采取了不同的方法。它仅在内部实现队列,并且通过使用地址将消息路由到适当的队列来实现所有其他消息传递概念。发布 - 订阅(主题)和点对点(队列)等消息传递概念是使用地址上不同类型的路由机制实现的。多播路由用于实现发布 - 订阅语义,其中特定地址的所有订户将获得其自己的内部队列,并且消息将被路由到所有订户。任播路由用于实现点对点语义,地址只有一个队列,所有消费者都会订阅它。寻址和路由方案用于所有协议。因此,例如,您可以将JMS主题视为多播地址。我们将在后面的文章中详细介绍这个主题。
(源于官网Google翻译)
该类代理服务器端(broker server), 会创建一个唯一订阅号,发送者可以向这个订阅号中发东西,然后接受者(即订阅该订阅号的接收方)都会收到来自该订阅号发出来的消息。以此来完成消息的推送。代理服务器其实是一个消息中转站。
下载链接:https://activemq.apache.org/components/artemis/download/
image.png
下载后解压到:F:\ProfessionSoft\apache-artemis-2.9.0
image.png
至此,下载解压完成
相比ActiveMQ,Artemis需要显示创建一个broker实例
新建一个文件夹:F:\ProfessionSoft\apache-artemis-2.9.0-myboker , 注意不要放在F:\ProfessionSoft\apache-artemis-2.9.0下
cd 进入F:\ProfessionSoft\apache-artemis-2.9.0\bin中, 执行下面指令(其中的F:\ProfessionSoft\apache-artemis-2.9.0-myboker就是创建的空文件夹,用于存放broker实例)
artemis create F:\ProfessionSoft\apache-artemis-2.9.0-myboker
按照提示输入账号(default username), 密码(default password), 并在Allow anonymous access?提示处执行Y
执行过程与最终结果:
image.png
至此broker实例创建完成
进入到broker实例的bin目录下, 输入artemis run 回车即可启动
image.png
启动完成会有输出
image.png
注意需要保持CMD窗口不能关闭
访问http://localhost:8161/, 可以使用创建实例使用的账号密码登入Management Console
image.png
至此,Artemis实例已经启动完成,MQTT服务也已经可以连接
常用的客户端及下载链接
image.png
编辑连接
image.png
接收消息
image.png