RabbitMQ 入门:轻量可靠消息队列

RabbitMQ 是开源的轻量可靠消息队列,GitHub 星标超过 1.1 万,基于 Erlang 开发,支持多种协议,低延迟消息传递做得好,现在很多中小系统都用它。
我用 RabbitMQ 做过订单异步处理、邮件发送,确实稳定,消息不丢,延迟又低,用着省心。今天聊聊它好在哪。
RabbitMQ 解决了什么问题
服务之间要异步通信,你发我收,直接调用耦合太高,还得等对方处理完。流量突然暴涨,没缓冲直接把服务打挂。多个消费者要订阅同一条消息,自己写分发逻辑太麻烦。
RabbitMQ 帮你搞定这些,生产者发消息到队列,消费者从队列拉,解耦服务,还能削峰填谷。支持发布订阅,多个消费者都能收同一条消息,不用自己写分发。路由规则灵活,按 topic 或者 routing key 分发,想怎么分就怎么分。
基础例子看一下
用 Docker 跑 RabbitMQ 最快:
docker run -d -p 5672:5672 -p 15672:15672 rabbitmq:3-management
5672 是客户端连接端口,15672 是管理界面,打开浏览器 http://localhost:15672 ,用户名密码都是 guest,就能进去看队列和连接。
Go 代码写个生产者:
package main
import (
"log"
"github.com/streadway/amqp"
)
func main() {
conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
if err != nil {
log.Fatalf("Failed to connect: %v", err)
}
defer conn.Close()
ch, err := conn.Channel()
if err != nil {
log.Fatalf("Failed to open channel: %v", err)
}
defer ch.Close()
err = ch.ExchangeDeclare(
"demo-exchange",
"direct",
true,
false,
false,
false,
nil,
)
if err != nil {
log.Fatalf("Failed to declare exchange: %v", err)
}
body := "Hello RabbitMQ"
err = ch.Publish(
"demo-exchange",
"demo-key",
false,
false,
amqp.Publishing{
ContentType: "text/plain",
Body: []byte(body),
},
)
log.Printf("Sent %s", body)
}
消费者:
// ... 连接代码类似
msgs, err := ch.Consume(
q.Name,
"",
true,
false,
false,
false,
nil,
)
for msg := range msgs {
log.Printf("Received a message: %s", msg.Body)
}
跑起来生产者发消息,消费者立刻就能收到,就是这么简单。
核心特性
灵活路由
支持 exchange 路由,direct、fanout、topic 多种路由模式,按 routing key 分发消息,满足各种订阅需求。
消息确认
生产者确认消息发成功,消费者处理完 ack,处理失败 nack 可以重新入队,保证消息不丢。
持久化
队列和消息可以持久化到磁盘,重启不丢消息,重要消息放心存。
多协议支持
AMQP、MQTT、STOMP 都支持,不同场景不同协议都能接,IoT 场景也能用。
分布式高可用
可以搭集群,跨机房镜像队列,一个节点挂了其他节点顶上来,生产环境放心用。
自带管理界面
web 管理界面开箱即用,队列、连接、消费者状态一眼就能看到,排查问题方便。
哪些场景用 RabbitMQ
异步任务处理,用户下单后发消息,后台慢慢处理扣库存发短信,不用等,用户体验好。削峰填谷,活动高峰期请求先放队列里,消费者慢慢处理,不会把数据库打挂。
服务之间发布订阅,多个服务对同一个事件感兴趣,都能收消息,不用硬编码依赖。跨进程通信,不同语言不同服务,通过 RabbitMQ 通信,解耦。低延迟消息传递,要求消息快点传到,RabbitMQ 延迟很低,比 Kafka 更适合这种场景。
RabbitMQ 有哪些优缺点
优点就是轻量,部署简单,单台机器就能跑,新手容易上手。延迟低,消息传递快,低吞吐量低延迟场景比 Kafka 好用。路由灵活,各种路由模式都有,想怎么发就怎么发。社区成熟,资料多,出问题好排查。
缺点呢,吞吐量比 Kafka 低,每秒几万条没问题,几十万上百万就顶不住了,高吞吐量还是选 Kafka。消息积压了会占用内存,得及时处理,分布式集群扩容稍微麻烦点。不过大多数中小公司,几万 QPS 完全够用了。
现在 RabbitMQ 发展得怎么样
出来快十五年了,现在还是中小系统消息队列首选,稳定更新,VMware 现在在维护,功能没啥大变化,一直修 bug 优化,生态稳定,用户也稳定。
现在学 RabbitMQ 值得吗
做后端开发肯定值得学,消息队列是后端基础,不管你用什么架构,早晚要碰到,中小项目用它特别合适。
学起来不难,安装简单,概念也不多,一天就能写出生产者消费者,常用功能几天就摸清楚了。找工作面试也经常问消息队列,RabbitMQ 最常用,学会了肯定加分,绝对值得学。

浙公网安备 33010602011771号