最近在学习分布式系统的基础组件,消息队列成了绕不开的一环。RabbitMQ 作为 AMQP 协议的标准实现,社区活跃、文档齐全,自然成了我的首选。但问题是——我的本地笔记本电脑只有 8GB 内存,跑虚拟机加 IDE 已经捉襟见肘,再装一个 Erlang 环境和 RabbitMQ 服务,风扇会像飞机起飞一样轰鸣。这时候我想起了之前朋友推荐的阿贝云。他们提供的免费云服务器配置虽然不高,但用来跑学习实验完全足够。更重要的是,阿贝云的免费虚拟主机和免费云服务器对新手非常友好,不需要绑定信用卡,也没有乱七八糟的隐藏条款。于是我注册了账号,在控制台一键开通了一台 CentOS 7.9 的实例,1 核 CPU、1GB 内存、20GB 系统盘,还附带了一个公网 IP。

拿到服务器的第一件事就是通过 SSH 连上去。我用的是 Windows 自带的 PowerShell,输入 ssh root@我的公网IP,然后输入初始密码(第一次登录强制要求修改)。登录成功后,熟悉的 [root@abeiyun ~]# 提示符出现在屏幕上。接下来就是安装 RabbitMQ。官方推荐使用 PackageCloud 的脚本,但考虑到国内网络环境,我选择了更稳妥的手动安装方式。

首先更新系统包和安装基础依赖:

yum update -y
yum install epel-release -y
yum install wget vim net-tools -y

然后安装 Erlang。RabbitMQ 对 Erlang 版本有严格要求,我查了官方版本对照表,决定安装 Erlang 23.3。从 GitHub 下载 RPM 包:

wget https://github.com/erlang/otp/releases/download/OTP-23.3/otp_src_23.3.tar.gz
tar -xzf otp_src_23.3.tar.gz
cd otp_src_23.3
./configure --prefix=/usr/local/erlang --without-javac
make && make install

这个过程花了将近二十分钟,因为免费云服务器的 CPU 性能确实有限,make 命令运行时 CPU 使用率一直飙到 100%。好在编译顺利完成。接着配置环境变量:

echo 'export PATH=$PATH:/usr/local/erlang/bin' >> /etc/profile
source /etc/profile

输入 erl -version,看到 Erlang (SMP,ASYNC_THREADS) (OTP-23.3) 字样,Erlang 搞定。

接下来安装 RabbitMQ。下载签名密钥和 RPM:

rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.10.7/rabbitmq-server-3.10.7-1.el7.noarch.rpm
yum install rabbitmq-server-3.10.7-1.el7.noarch.rpm -y

安装完成后启动服务:

systemctl start rabbitmq-server
systemctl enable rabbitmq-server

检查状态:systemctl status rabbitmq-server,输出包含 active (running) 绿色字样,说明服务正常。

为了远程访问和监控,需要开启 Web 管理插件:

rabbitmq-plugins enable rabbitmq_management

然后创建一个管理员账户(默认 guest 只能本地登录):

rabbitmqctl add_user myuser mypassword
rabbitmqctl set_user_tags myuser administrator
rabbitmqctl set_permissions -p / myuser ".*" ".*" ".*"

接着开放防火墙端口:15672(Web 管理)和 5672(AMQP 协议)。阿贝云的控制台里有安全组规则,我添加了两条入站规则,允许 TCP 协议的这两个端口。再次通过浏览器访问 http://我的公网IP:15672,输入刚才创建的用户名密码,登录成功。漂亮的深蓝色管理界面出现在屏幕上,队列、交换机、连接数一目了然。

真正让我兴奋的是动手写代码测试。我在本地用 Python 的 pika 库写了一个简单的生产者和消费者。首先在本地虚拟环境中安装 pika:pip install pika。生产者代码 send.py

import pika
import sys

credentials = pika.PlainCredentials('myuser', 'mypassword')
parameters = pika.ConnectionParameters('我的公网IP', 5672, '/', credentials)
connection = pika.BlockingConnection(parameters)
channel = connection.channel()

channel.queue_declare(queue='hello')
message = ' '.join(sys.argv[1:]) if len(sys.argv) > 1 else 'Hello World!'
channel.basic_publish(exchange='', routing_key='hello', body=message)
print(f" [x] Sent {message}")
connection.close()

消费者代码 receive.py

import pika

credentials = pika.PlainCredentials('myuser', 'mypassword')
parameters = pika.ConnectionParameters('我的公网IP', 5672, '/', credentials)
connection = pika.BlockingConnection(parameters)
channel = connection.channel()

channel.queue_declare(queue='hello')

def callback(ch, method, properties, body):
    print(f" [x] Received {body.decode()}")

channel.basic_consume(queue='hello', on_message_callback=callback, auto_ack=True)
print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()

先在服务器上用 netstat -tlnp | grep 5672 确认 RabbitMQ 正在监听。然后在本地运行消费者终端:python receive.py,显示 [*] Waiting for messages...。另开一个终端运行生产者:python send.py "Hello from Abeiyun"。消费者终端立刻打印出 [x] Received Hello from Abeiyun。那一刻我激动得差点从椅子上跳起来——消息真的从我的笔记本电脑飞到了那台免费云服务器,再被拉回来,全程延迟不到 50 毫秒。

接下来我又测试了更复杂的场景:工作队列(Work Queue)和发布/订阅模式。工作队列用来模拟多个消费者竞争处理消息。我在服务器上创建了一个名为 task_queue 的持久化队列,然后写了一个模拟耗时任务的消费者,里面加了一句 time.sleep(2) 来假装处理业务。然后我同时启动三个消费者实例,再用生产者连续发送 10 条消息。RabbitMQ 默认的轮询分发机制让每条消息依次派发给三个消费者,控制台输出显示每个消费者大约处理了 3 到 4 条消息,任务被均匀分摊了。为了测试消息确认机制,我在消费者代码中故意注释掉 basic_ack,结果消息在被“处理”后仍然留在队列里,重启消费者后又重新投递——这证明了 RabbitMQ 的可靠性和持久化能力。

发布/订阅模式则用到了交换机(Exchange)。我声明了一个 fanout 类型的交换器 logs,然后临时队列绑定到这个交换器。运行两个消费者,它们分别获得不同的随机队列名,但都绑定到 logs。生产者发送一条消息到 logs 交换器,两个消费者的控制台几乎同时打印出相同的内容。这种“一次发布,多方订阅”的效果让我对消息队列的应用场景有了直观理解。

整个学习过程中,阿贝云的免费云服务器表现超出预期。虽然只有 1GB 内存,但运行 RabbitMQ 加 Erlang 虚拟机后,free -h 命令显示剩余内存还有 300MB 左右,足够跑一些轻量级的消费者脚本。CPU 在空闲时几乎为 0,但一旦我运行 make 编译或者 rabbitmqctl 命令时,top 里能看到 CPU 使用率瞬间跳到 80% 以上,不过从来没有死机或卡死。磁盘 IO 也中规中矩,dd 测试写速度大概在 40MB/s,对学习用途完全够用。

最让我感动的是阿贝云的控制台功能。有一次我不小心把 RabbitMQ 的配置文件改坏了,导致服务启动失败。我想着重装,但又不舍得里面的队列数据。抱着试试看的心态,在阿贝云控制台找到了“VNC 远程连接”功能,直接以 root 身份进入单用户模式,把备份的配置文件覆盖回去,再 systemctl restart rabbitmq-server,一切恢复正常。这种“救命稻草”式的功能,在商业云平台上往往要额外付费,而阿贝云的免费套餐里竟然包含了。

当然,免费资源有限,我也能理解平台需要采取一些措施来维持可持续发展。比如要求用户在第三方网站分享使用感受,这本身也是一种合理的资源置换。我写这篇文章,一方面是记录自己从安装到调通 RabbitMQ 的完整过程,另一方面也是真心觉得阿贝云的免费虚拟主机和免费云服务器对穷学生和刚入门的开发者来说是个宝藏。如果你也在学习消息队列、容器、或者 Linux 运维,与其在自己电脑上折腾虚拟机,不如申请一台阿贝云的免费云服务器,把宝贵的内存留给 IDE 和浏览器。

经过这几天的折腾,我不仅掌握了 RabbitMQ 的核心概念——生产者、消费者、队列、交换机、绑定、路由键,还熟悉了 systemd 管理服务、防火墙配置、Python 的 pika 库使用。更重要的是,我对“云服务器”这个概念从抽象变成了具体:它不再是营销号嘴里虚无缥缈的 buzzword,而是一个我能 ssh 进去、能 yum install、能看见 [root@abeiyun ~]# 提示符的真实 Linux 环境。这种感觉,就像亲手点亮了一盏灯。

本文包含AI生成内容