Artemis 消息中间件
- 操作系统:Ubuntu 22.04 LTS
- 服务器推荐配置:2核4G内存
以下说明仅供参考,具体配置和使用方法请参考 Apache ActiveMQ Artemis 官方文档。
简介
Apache ActiveMQ Artemis 是 Apache 软件基金会开源的一个高性能、异步的消息传递系统。作为微语系统(基于Spring Boot 3.x开发)的 核心组件之一,Artemis 消息队列在系统中扮演着至关重要的角色,主要用于处理实时聊天消息收发以及大规模FAQ文件批量导入等场景。
Artemis 在微语系统中的应用场景
实时聊天消息处理
- 消息即时收发:支持客服与访客之间的实时消息传递
- 消息可靠投递:确保消息不丢失、不重复
- 高并发处理:能够应对大量用户同时在线的场景
- 多设备同步:实现消息在多端同步展示
批量数据处理
- FAQ文件批量导入:支持知识库文章、FAQ问答等大量数据的批量导入
- 数据异步处理:将耗时操作异步化,提高系统响应速度
- 任务队列管理:对大型批处理任务进行排队和调度
为什么选择 Artemis
Artemis 相比其他消息队列系统具有以下优势:
- 高性能:更高的消息吞吐量和更低的延迟
- 可靠性:支持完整的JMS和AMQP协议,确保消息可靠投递
- Spring Boot整合:与Spring Boot 3.x完美集成,配置简单
- 多协议支持:同时支持JMS、AMQP、STOMP、MQTT等多种协议
- 灵活消息模式:支持点对点队列和发布订阅主题两种模式
方法一:使用Docker安装Artemis
推荐使用Docker方式部署Artemis,简单高效且易于管理。下面是完整的docker-compose配置示例:
services:
# Artemis消息中间件服务配置
bytedesk-artemis:
image: apache/activemq-artemis:latest
container_name: artemis-bytedesk
environment:
# 基本认证设置
- ARTEMIS_USER=admin # 管理员账号
- ARTEMIS_PASSWORD=admin # 管理员密码
- ANONYMOUS_LOGIN=false # 禁用匿名登录
# 额外参数
- EXTRA_ARGS=--http-host 0.0.0.0 --relax-jolokia # 允许远程访问
ports:
- "16161:61616" # JMS端口
- "18161:8161" # Web控制台端口
- "16162:61617" # AMQP端口
- "15672:5672" # AMQP端口(备用)
- "16163:61613" # STOMP端口
- "11883:1883" # MQTT端口
volumes:
- artemis_data:/var/lib/artemis/data # 数据持久化
networks:
- bytedesk-network
restart: always # 自动重启
healthcheck: # 健康检查
test: ["CMD", "curl", "--fail", "http://localhost:8161/console/jolokia/read/org.apache.activemq.artemis:broker=\"0.0.0.0\""]
interval: 30s
timeout: 10s
retries: 5
# 存储卷与网络定义
volumes:
artemis_data: # Artemis数据持久化卷
networks:
bytedesk-network:
driver: bridge
方法二:直接下载安装包解压部署
安装
# 解压到apache-artemis-2.37.0
# tar -zxvf apache-artemis-2.37.0-bin.tar.gz
# artemis需要创建一个文件夹,cd到目标文件夹,执行以下命令,创建mybroker文件夹
./apache-artemis-2.37.0/bin/artemis create mybroker
# 输入用户名和密码: admin/admin
# 前台启动
./mybroker/bin/artemis run
# 后台启动
./mybroker/bin/artemis-service start
# 停止
./mybroker/bin/artemis stop
# 查看状态
./mybroker/bin/artemis-service status
# 查看日志
./mybroker/bin/artemis-service log
# 查看帮助
# 配置
./apache-artemis-2.37.0/bin/artemis help create
# 修改端口号,本地冲突,将默认端口号+1
vim mybroker/etc/broker.xml
# web管理界面
http://localhost:8161
Artemis 部署模式选择
微语系统支持两种 Artemis 部署模式,您可以根据实际需求选择最适合的方式:
1. Embedded 模式(开发测试推荐)
Embedded 模式下,Spring Boot 会自动 启动内嵌的 Artemis broker,无需额外安装和配置 Artemis 服务。
优点:
- 无需额外安装 Artemis
- 配置简单,开箱即用
- 适合开发和测试环境
- 快速启动和调试
缺点:
- 性能相对较低
- 不适合生产环境
- 无法支持集群部署
配置示例:
# ===============================
# = Artemis Embedded 模式配置
# ===============================
# 启用 embedded 模式
spring.artemis.mode=embedded
2. Native 模式(生产环境推荐)
Native 模式连接到外部独立的 Artemis broker,适合生产环境部署。
优点:
- 性能更高
- 支持集群部署
- 适合生产环境
- 更好的可扩展性和可维护性
缺 点:
- 需要额外安装和配置 Artemis
- 配置相对复杂
- 需要维护独立的消息服务
微语应用配置
系统已支持多种消息中间件:Artemis(默认) 与 RabbitMQ(可配置启用)。Kafka/RocketMQ 将在后续版本支持。 通过统一配置切换,无需修改代码。RabbitMQ 说明见 RabbitMQ 消息中间件文档。
Native 模式配置(生产环境推荐)
在微语中配置连接到Docker中的Artemis。下面分别展示配置与对应的Docker环境变量设置方式 :
# ===============================
# = Artemis Native 模式配置
# ===============================
# 启用 native 模式
spring.artemis.mode=native
# native 模式连接配置
spring.artemis.broker-url=tcp://127.0.0.1:16161
spring.artemis.user=admin
spring.artemis.password=admin
# ===============================
# = MQ 类型切换(默认 artemis)
# ===============================
bytedesk.mq.type=artemis
Artemis 集群配置(生产环境推荐)
当您有多节点 Artemis Broker 时,微语服务端支持通过 bytedesk.mq.artemis.cluster.* 自动生成 failover:(...)?... 连接地址,无需手写复杂 spring.artemis.broker-url。
# 1) 必须使用 native 模式
spring.artemis.mode=native
spring.artemis.user=admin
spring.artemis.password=admin
# 2) 开启 Artemis 集群
bytedesk.mq.artemis.cluster.enabled=true
# 3) 集群节点(支持 host:port 或 tcp://host:port)
bytedesk.mq.artemis.cluster.nodes=10.0.0.11:61616,10.0.0.12:61616,10.0.0.13:61616
# 4) failover 参数(可选)
bytedesk.mq.artemis.cluster.ha=true
bytedesk.mq.artemis.cluster.randomize=true
bytedesk.mq.artemis.cluster.reconnect-attempts=-1
bytedesk.mq.artemis.cluster.initial-connect-attempts=-1
bytedesk.mq.artemis.cluster.retry-interval=1000
bytedesk.mq.artemis.cluster.retry-interval-multiplier=2.0
bytedesk.mq.artemis.cluster.max-retry-interval=30000
- 未开启
bytedesk.mq.artemis.cluster.enabled时,系统保持现有行为,继续使用spring.artemis.broker-url。 - 开启集群但未配置
bytedesk.mq.artemis.cluster.nodes时,应用会在启动期报错,避免错误配置进入生产。 - 集群配置仅在
spring.artemis.mode=native且bytedesk.mq.type=artemis时生效。
RabbitMQ 配置示例(可选)
如需切换到 RabbitMQ,请将 bytedesk.mq.type 设置为 rabbitmq,并配置连接信息:
# ===============================
# = MQ 类型切换
# ===============================
bytedesk.mq.type=rabbitmq
# ===============================
# = RabbitMQ 连接配置
# ===============================
bytedesk.mq.rabbitmq.enabled=true
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=admin
spring.rabbitmq.virtual-host=/
spring.rabbitmq.connection-timeout=5000
配置模式切换
如何在两种模式之间切换
要在 Embedded 模式和 Native 模式之间切换,请按以下步骤操作:
- 修 改模式配置:更改
spring.artemis.mode属性值 - 注释当前模式配置:将当前模式的相关配置注释掉
- 启用目标模式配置:取消注释目标模式的配置
- 重启应用:重启微语应用以使配置生效
更多配置参数(可选配置项)
# ===============================
# = JMS 配置(适用于两种模式)
# ===============================
# 启用Spring Boot的JMS自动配置,让Spring Boot自动管理ConnectionFactory
spring.jms.listener.auto-startup=true
spring.jms.listener.acknowledge-mode=auto
# 并发消费者数 - 增加并发处理能力
spring.jms.listener.concurrency=5
spring.jms.listener.max-concurrency=50
# 增加接收超时时间
spring.jms.listener.receive-timeout=15000
# 消息失败重试配置
spring.jms.listener.max-attempts=3
# 指数退避算法的初始间隔(毫秒)
spring.jms.listener.initial-interval=2000
# 指数退避算法的最大间隔(毫秒)
spring.jms.listener.max-interval=15000
# 指数退避算法的乘数
spring.jms.listener.multiplier=2.0
# 启用JMS错误处理
spring.jms.listener.missing-queues-fatal=false
spring.jms.listener.connection-factory-fatal=false
# 连接池配置 - 解决连接问题
spring.artemis.pool.enabled=true
spring.artemis.pool.max-connections=20
spring.artemis.pool.min-connections=5
spring.artemis.pool.time-between-expiration-check=10000
spring.artemis.pool.idle-timeout=60000
spring.artemis.pool.max-lifetime=300000
# 连接超时和重试配置
spring.artemis.connection-timeout=15000
spring.artemis.connection-ttl=30000
spring.artemis.call-timeout=15000
spring.artemis.call-failover-timeout=15000
# 连接重试和故障转移配置
spring.artemis.retry-interval=2000
spring.artemis.max-retry-interval=30000
spring.artemis.reconnect-attempts=15
spring.artemis.initial-connect-attempts=5
# 流控制和性能配置
spring.artemis.consumer-window-size=0
spring.artemis.producer-window-size=0
spring.artemis.consumer-max-rate=-1
spring.artemis.producer-max-rate=-1
spring.artemis.confirmation-window-size=-1
spring.artemis.block-on-durable-send=false
spring.artemis.block-on-non-durable-send=false
# ===============================
# = Artemis 健康检查配置
# ===============================
management.health.jms.enabled=true
management.health.artemis.enabled=true
重要说明
ConnectionFactory 创建机制
- Embedded 模式:Spring Boot 自动创建内嵌的 ConnectionFactory
- Native 模式:手动创建并配置连接到外部 Artemis 的 ConnectionFactory
监听器工厂和 JmsTemplate
- 两种模式都使用相同的 JMS 配置
- 自动使用对应模式的 ConnectionFactory
- 监听器工厂和 JmsTemplate 配置保持一致