前言
需求:将考试交卷算分功能使用队列处理,调研结果如下
为什么选择RabbitMQ做交卷算分的功能呢,不用其他中间件呢?
在考试交卷场景中,选择 RabbitMQ 而非其他中间件主要基于以下考量:
1. 可靠性优先
考试系统对数据完整性要求极高,交卷消息必须确保不丢失。RabbitMQ 通过以下机制提供强可靠性保障:
生产者确认机制:支持同步 / 异步确认,确保消息成功发送到 Broker。
持久化策略:队列和消息均支持持久化,即使 Broker 重启也不会丢失。
手动 ACK 机制:消费者处理完成后才确认消息,失败时可重新入队。
死信队列:自动收集处理失败的消息,便于人工干预。
相比之下,Kafka 的可靠性依赖客户端配置,而 ActiveMQ 的性能瓶颈可能影响关键操作。
2. 保证顺序性
考试系统通常要求按提交顺序处理试卷(如先交卷的先批改)。RabbitMQ 的单队列 FIFO 特性天然支持顺序性,而 Kafka 仅保证分区内有序,需额外配置;RocketMQ 虽支持顺序消息,但实现复杂度较高。
3. 事务性支持
若考试系统涉及积分扣减、成绩记录等多资源操作,RabbitMQ 的事务消息(配合手动 ACK)可确保原子性。Kafka 的事务仅支持生产者,而 RocketMQ 的事务机制更复杂,不适合简单场景。
4. 低延迟与简单运维
考试交卷需要即时响应,RabbitMQ 的单节点吞吐量(约 10k TPS)足以满足大多数考试系统需求,且部署简单(单节点或镜像集群)。相比之下,Kafka/RocketMQ 的集群依赖 ZooKeeper,运维成本较高。
5. 社区生态与工具链
RabbitMQ 拥有成熟的管理界面、丰富的插件(如延迟队列、消息追踪),以及完善的 Java 客户端(RabbitMQ Client)。对于 Java 开发者而言,集成难度低,文档资源丰富。
对比其他中间件的局限性
中间件 局限性
Kafka
- 主要优化顺序读写性能,随机消费延迟高(约 10ms)
- 不适合小规模消息场景
- 依赖 ZooKeeper,部署复杂
RocketMQ - 学习曲线陡峭(需理解 NameServer、Broker 等概念)
- 跨语言支持弱(主要 Java)
- 社区活跃度低于 RabbitMQ
ActiveMQ - 性能瓶颈明显(吞吐量约 1k TPS)
- 社区维护缓慢,安全漏洞修复不及时
总结:为何选 RabbitMQ?
考试交卷场景的核心诉求是高可靠性、强顺序性、中等吞吐量、低延迟,而 RabbitMQ 通过以下优势完美匹配这些需求:
可靠性机制:生产者确认 + 持久化 + 手动 ACK,确保消息 “至少一次” 传递。
简单架构:单 Broker 即可满足需求,镜像集群提供高可用,无需额外组件。
丰富插件:支持死信队列、优先级队列等,应对复杂业务场景。
Java 友好:官方提供完善的 Spring AMQP 集成,降低开发成本。
若考试系统未来需要处理海量并发(如百万级考生同时交卷),则可考虑 Kafka 或 RocketMQ;但对于大多数教育机构的考试系统,RabbitMQ 已足够高效且稳定。
Linux安装
下载
官网下载地址: https://www.rabbitmq.com/download.html
也可以直接网盘下载我用的这个版本:https://pan.quark.cn/s/bce908e731b9
放服务器上
安装
:yum install -y rabbitmq-server-4.1.0-1.el8.noarch.rpm
报错:
erlang >= 26.0 已安装: erlang-R16B-03.18.el7.x86_64 (@epel)
erlang = R16B-03.18.el7
版本对比:https://www.rabbitmq.com/docs/which-erlang#supported-version-policy
卸载 erlang
yum -y remove erlang-*
官方下载:https://www.erlang-solutions.com/downloads-2/#
网盘下载:https://pan.quark.cn/s/81f985cae4b3
新版本在下面
下载后上传服务器进行安装:yum install -y esl-erlang_27.3.3_1~centos~7_x86_64.rpm
安装完成后重新安装MQ:yum install -y rabbitmq-server-4.1.0-1.el8.noarch.rpm
拷贝配置文件
cp /usr/share/doc/rabbitmq-server-4.1.0/rabbitmq.config.example /usr/local/rabbitmq/
没找到配置文件
从官网下载一个:https://www.rabbitmq.com/docs/configure#config-items
配置文件下载地址可查看其各个参数配置,没啥用:https://github.com/rabbitmq/rabbitmq-server/blob/main/deps/rabbit/docs/rabbitmq.conf.example
/etc/rabbitmq
下配添加置文件 rabbitmq.config
[{rabbit, [{loopback_users, []}]}].
/etc/rabbitmq
下配添加置文件 rabbitmq-env.conf
NODENAME=rabbit@$(hostname)
RABBITMQ_LOG_BASE=/var/log/rabbitmq
配置文件记得赋权
启动rabbitmq中的插件管理
rabbitmq-plugins enable rabbitmq_management
启动
systemctl start rabbitmq-server
失败
我原先服务器有装过rabbitmq,残留数据冲突
清理:
sudo rm -rf /var/lib/rabbitmq/mnesia/*
sudo rm -f /var/lib/rabbitmq/.erlang.cookie
重启
systemctl restart rabbitmq-server
查看状态
systemctl status rabbitmq-server
自启动
systemctl enable rabbitmq-server
默认用户guest、密码guest 只能从localhost本机登录
需要重新创建账号进行登录
创建账号
rabbitmqctl add_user 账号 密码
赋权:
rabbitmqctl set_permissions -p "/" 账号 ".*" ".*" ".*"
执行命令为用户添加管理角色(以administrator最高权限为例):
角色 | 权限范围 | 适用场景 |
---|---|---|
administrator | 完全控制(配置+监控+策略管理) | 系统管理员 |
monitoring | 查看所有资源+连接状态 | 运维监控人员 |
policymaker | 管理策略(vhost范围内) | 开发负责人 |
management | 基础管理(自身vhost资源) | 普通开发者 |
rabbitmqctl set_user_tags 账号 administrator
访问
ip+端口 15672
进行登录