ActiveMQ高可用架构涉及常用功能整理
- 1. activemq的集群模式
- 2. 镜像模式高可用系统架构和相关组件
- 2.1 架构说明
- 2.2 相关概念说明
- 2.3 消息模型
- 2.3.1 点对点
- 2.3.2 发布订阅
- 3. activemq常用命令
- 4. activemq配置集群
- 5. 疑问和思考
- 5.1 activemq的数据删除策略是怎样的?
- 5.2 activemq希望一个数据能够被多个消费者消费,该如何实现?
- 6. 参考文档
探讨activemq的系统架构以及以及整体常用的命令和系统分析,本文主要探讨高可用版本的activemq集群,并基于日常工作中的沉淀进行思考和整理。更多关于分布式系统的架构思考请参考文档关于常见分布式组件高可用设计原理的理解和思考
1. activemq的集群模式
activemq通常只有2种模式架构
-
单机模式
通常activemq只是支持单机模式,进行数据存储和提供服务,这种模式下,activemq不支持HA能力。 -
主从模式
为了解决单机模式下的高可用问题,activemq能够搭建主从模式,但是由于activemq本身不支持不同节点直接同步数据,因此这种模式下,activemq将数据保存在了远端的数据库。常用的架构如下
2. 镜像模式高可用系统架构和相关组件
2.1 架构说明
activemq的整体架构如下
相关核心的组件和角色作用如下
组件 | 部署模式 | 组件作用 | 备注 |
---|---|---|---|
producer | 客户端部署 | 生产者创建消息 | 消息一般可以包含 2 个部分: 消息体和标签 |
broker | 多机部署 | 它负责接收、存储和管理消息数据 | 接收和存储消息数据:activemq broker接收来自producer发送的消息,并将这些消息存储在自己的磁盘上。 |
consumer | 客户端部署 | 消费者连接到 ActiveMQ 服务器,订阅到队列。消费者消费一条消息时,只消费消息的消息体(payload) | 在消息路由的过程中,消息的标签会丢弃,存入到队列中的消息只有消息体,消费者只会消费到消息体,也就不知道消息的生产者是谁,当然消费者也不需要知道 |
镜像镜像队列本质上是一个HA模式的集群
- Leader提供读写服务,数据写入需要从Leader开始,而后同步到Follower节点
- Follower提供读服务
普通模式配置镜像模式,只需要进行如下配置即可。
# 所有队列exchangess都为镜像模式
activemqctl set_policy ha-all "^" '{"ha-mode":"all"}'
Setting policy "ha-all" for pattern "^" to "{"ha-mode":"all"}" with priority "0" for vhost "/" ...# # 所有队列queue都为镜像模式
activemqctl set_policy --priority 0 --apply-to queues mirror_queue "^" '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'
2.2 相关概念说明
角色说明 | 角色作用 | 备注 |
---|---|---|
channel | 消息通道,在客户端的每个连接里,可建立多个 channel,每个 channel 代表一个会话任务 | |
exchange | 消息交换机,它指定消息按什么规则,路由到哪个队列 | 交换机提供了消息的路由能力,根据不同的消息特性提供不同的路由策略 |
routing key | 路由关键字,exchange 根据这个关键字进行消息投递 | |
binding | 绑定,它的作用就是把 exchange 和 queue 按照路由规则绑定起来 | |
vhost | 虚拟主机,一个 broker 里可以开设多个 vhost,用作不同用户的权限分离 | 消息和权限设计都是基于vhost,可以通过vhost配置多租户进行数据和权限隔离 |
2.3 消息模型
activemq的消息发布模型只有2种
- 点对点: 一条消息只能被消费一次,消费后就会被删除,发布者和消费者能够解耦
- 发布/订阅: 一条消息能够被多个消费者订阅,消费者只能订阅到后续的消息(不会维护消费位点,因此消费者订阅的消息是可能会出现丢失的)
2.3.1 点对点
在点对点通信模式中,应用程序由消息队列,发送方,接收方组成,每个消息队列都被发送到一个特定的队列, 接收者从队列中获取消息,队列保留这消息,直到他们被消费或者超时.
特点
- 每个消息只要一个消费者.
- 发送者和接收者在时间上是没有时间的约束,即发送者在发送完消息后,不管接收者有没有接收消息,都不会影响发送方发送消息到消息队列中.
- 发送方不管是否在发送消息,接收方都可以从消息队列中去到消息.
- 接收方在接收完消息之后,需要向消息队列应答成功.### 2.3.2 发布订阅
2.3.2 发布订阅
在发布/订阅消息模型中,发布者发布一个消息,该消息是topic传递给所有的客户端。在该模式下,发布者和订阅者都是匿名的,即发布者与订阅者都不知道对方是谁.并且可以动态的发布和订阅Topic。Topic主要用于保存和传递消息,且会一直保存消息直到消息被传递给客户端.
特点
- 一个消息可以传递多个订阅者
- 发布者和订阅者具有时间约束,这一点和上面的点对点模式是相反的. 针对某个主题(Topic)的订阅者.它必须创建一个订阅者之后,才能消费发布者的消息.而且是为了消费消息,订阅者必须保持运行的状态.
- 为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅,这样,即使订阅者没有被激活(运行),他也能接收到发布者的消息.
3. activemq常用命令
#启动
activemq start#停止
activemq stop# 删除队列中的所有消息,队列名称是FOO.BAR
activemq purge FOO.BAR# 显示默认broker的所有主题和队列统计信息
activemq dstat# 显示的主题统计信息
activemq dstat topics# 显示队列的统计信息
activemq dstat queuedtsat就是显示图形化中query的图。
Queue Size 表示queue的大小。 Producer表示生产者
Consumer 消费者
Enqueue 一共进入了多少队列
Dequeue 一共消费的多少队列
4. activemq配置集群
参考文档 ActiveMQ高可用集群部署方案
5. 疑问和思考
5.1 activemq的数据删除策略是怎样的?
ActiveMQ 提供了两种清除策略,用于清理过期的消息:
- 消费删除:1个队列中的消息,被消费后就会被主动删除
- 删除策略(Delete Policy):该策略会直接删除过期的消息,释放存储空间。可以通过设置 expiryDelay 参数来配置消息的过期时间。默认情况下,消息在没有消费者消费的情况下会一直保留,直到达到过期时间。
- 移动策略(Move Policy):该策略会将过期的消息移动到一个指定的目标队列,而不是直接删除。可以通过设置 deadLetterStrategy 参数来指定目标队列。移动策略可以用于日志记录和审计等需求,以便在稍后分析过期消息。
这些清除策略可以单独或同时使用,根据需要进行配置。请注意,配置清除策略可能会影响 ActiveMQ 的性能和存储空间使用情况,所以需要根据具体情况进行权衡和调整。
5.2 activemq希望一个数据能够被多个消费者消费,该如何实现?
只能使用发布订阅模式,但是也通常要求消费者实时在线,否则消费者可能无法消费到完整的数据。
6. 参考文档
暂无