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 最常用,学会了肯定加分,绝对值得学。

项目地址:https://github.com/rabbitmq/rabbitmq-server

posted @ 2026-05-08 12:43  bytebender31  阅读(4)  评论(0)    收藏  举报