CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
RabbitMQ 入门/课时/发布与消费
RawBlame
课时目录12 节

RabbitMQ 入门

  1. 01RabbitMQ 是什么
  2. 02核心概念
  3. 03Docker 运行 RabbitMQ
  4. 04发布与消费
  5. 05Exchange 类型
  6. 06Spring AMQP
  7. 07可靠性与死信
  8. 08常见模式
  9. 09RabbitMQ vs Kafka
  10. 10监控与管理
  11. 11Compose 联调
  12. 12综合练习

发布与消费

basicPublish、basicConsume、ack/nack。

30 分钟

发布与消费

掌握 basicPublish / basicConsume 与 ack / nack,就完成 RabbitMQ 最小闭环。Manual ack 保证「处理成功才删消息」,是任务队列可靠性的基础(对比 kafka-consumer 的 offset 提交)。

学习目标

  • 声明 durable queue 并发送持久化消息
  • 编写 Consumer,basicQos 限制 prefetch
  • 正确使用 basicAck / basicNack 与 requeue

核心内容

发布端

channel.queueDeclare("coderoadmap.export", true, false, false, null);
AMQP.BasicProperties props = new AMQP.BasicProperties.Builder()
    .deliveryMode(2) // persistent
    .contentType("text/plain")
    .build();
channel.basicPublish("", "coderoadmap.export", props,
    "lessonId=99".getBytes(StandardCharsets.UTF_8));

deliveryMode=2 表示消息持久化;还需队列 durable,否则 Broker 重启仍可能丢。业务上先写 MySQL(sb-jpa)再发 MQ,避免「消息发出但事务回滚」。

消费端与 ack

channel.basicQos(10); // 最多 10 条未 ack
DeliverCallback callback = (consumerTag, delivery) -> {
    String body = new String(delivery.getBody(), StandardCharsets.UTF_8);
    try {
        processExport(body);
        channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
    } catch (Exception e) {
        channel.basicNack(delivery.getEnvelope().getDeliveryTag(), false, true);
    }
};
channel.basicConsume("coderoadmap.export", false, callback, _ -> {});

第二个参数 autoAck=false 即 manual ack。basicNack(..., requeue=true) 会重新入队;无限失败应转 死信(rmq-reliability)。

prefetch 与工作队列

多个 Consumer 订阅同一 Queue 时,Broker 轮询分发。basicQos(1) 适合慢任务(大文件导出);过大 prefetch 会导致一个 Worker hoard 消息。类似 Kafka 分区分摊,但 RabbitMQ 靠 队列 + ack 而非 consumer group offset。

Redis List BRPOP 也能做简单队列,但无 Exchange 路由与 DLX;复杂任务仍用 RabbitMQ lab。

练习

  • 起两个 Consumer 进程,观察同一队列的消息如何分摊
  • 故意抛异常,对比 与 的行为
requeue=true
false
  • 说明 auto ack 在「处理中途 kill 进程」时会丢什么
  • 小结

    publish 持久化 + manual ack + prefetch = 工作队列三件套。 下一课讲 direct / topic / fanout 等 Exchange 类型。

    加载本节练习…
    ← 上一课Docker 运行 RabbitMQ下一课 →Exchange 类型