rabbitmq 使用过程中遇到的问题

  1. 连接rabbitmq 地址写法,5672 是连接的端口号,15672是页面访问的端口号

  2. elasticsearch 的访问端口是9200, 不是9300,9300 是后台通信端口号 ,这个页面访问的端口号是一样,

3. rabbitmq 的5种交换接的区别

一、‌**Direct Exchange(直连交换机)**‌

  • ‌路由规则 ‌:

    完全匹配 routing key,只有绑定时指定的 routing key ‌完全等于 ‌ 消息的 routing key 时才会路由到队列。

  • ‌适用场景 ‌:

    点对点精准投递(如订单系统按订单类型分发消息)。

  • ‌示例代码‌:

    // 绑定队列到Direct交换机

  • channel.queueBind("queue.order", "exchange.direct", "order.create");

  • // 发送消息 channel.basicPublish("exchange.direct", "order.create", null, messageBytes);


二、‌**Fanout Exchange(扇出/广播交换机)**‌

  • ‌路由规则 ‌:

    完全忽略 routing key,将消息广播到‌所有绑定到该交换机的队列‌。

  • ‌适用场景 ‌:

    广播通知(如系统公告、日志分发)。

  • // 绑定队列到Fanout交换机(无需指定routing key)

  • channel.queueBind("queue.log", "exchange.fanout", "");

  • // 发送消息(routing key会被忽略)

  • channel.basicPublish("exchange.fanout", "", null, messageBytes);


三、‌**Topic Exchange(主题交换机)**‌

  • ‌路由规则 ‌:

    使用通配符匹配 routing key,支持两种通配符:

    • * 匹配一个单词(例如 order.* 匹配 order.create,不匹配 order.create.paid)
    • # 匹配零或多个单词(例如 order.# 匹配 order.create.paid)
  • ‌适用场景 ‌:

    多条件灵活路由(如根据不同商品类目分发消息)。

  • // 绑定队列到Topic交换机 channel.queueBind("queue.electronics", "exchange.topic", "order.*.electronics"); // 发送消息 channel.basicPublish("exchange.topic", "order.create.electronics", null, messageBytes);


四、‌**Headers Exchange(头交换机)**‌

  • ‌路由规则 ‌:

    不依赖 routing key,而是匹配消息头的键值对(Headers)。

    匹配模式有两种:all(全部匹配)或 any(至少匹配一个键值对)。

  • ‌适用场景 ‌:

    基于消息属性(如消息格式、协议类型)的复杂路由(实际使用较少)。

  • // 绑定队列到Headers交换机 Map<String, Object> headers = new HashMap<>(); headers.put("format", "json"); headers.put("priority", "high"); channel.queueBind("queue.json", "exchange.headers", "", headers); // 发送消息(配置Headers属性) AMQP.BasicProperties props = new AMQP.BasicProperties.Builder() .headers(headers) .build(); channel.basicPublish("exchange.headers", "", props, messageBytes);


五、对比总结

交换机类型 路由依据 通配符 典型场景 性能
‌Direct‌ 精确匹配路由键 无 精准投递(订单处理) 高
‌Fanout‌ 忽略路由键 无 广播通知(日志分发) 高
‌Topic‌ 通配符匹配路由键 * # 多条件路由(商品分类) 中
‌Headers‌ 消息头键值对 无 复杂属性路由(协议过滤) 低

Map<String, Object> dlxArgs = new HashMap<>();

dlxArgs.put("x-dead-letter-exchange", RabbitMQCons.DLX_EXCHANGE);

dlxArgs.put("x-dead-letter-routing-key", RabbitMQCons.DLX_ROUTING_KEY);

dlxArgs.put("x-message-ttl", 60000); // 消息60秒未消费则过期

dlxArgs.put("x-max-length", 1000000); // 队列最大长度限制

// 2. 声明主队列(绑定死信参数)

channel.queueDeclare( RabbitMQCons.INVENTORY_QUEUE_ONE, true, // 持久化 false, false, dlxArgs // 参数正确位置);

  1. ‌**AMQP.BasicProperties 构建**‌

    • .headers(header):将包含 x-delay 的 Header 信息附加到消息。
    • .deliveryMode(2):设置消息为持久化(重启 RabbitMQ 后消息不丢失)。
    • .expiration("10000"):设置消息过期时间为 10 秒(若 10 秒内未被消费,则自动删除)。

关键区别‌

  • ‌**x-delay** ‌:需插件支持,实现‌延迟投递‌(消息暂存于交换机)。
  • ‌**expiration** ‌:RabbitMQ 原生功能,控制消息‌存活时间‌(到期删除,不保证延迟精度)

两种方案对比‌

特性 死信队列 + TTL 延迟消息插件
‌延迟精度‌ 较低(依赖队列扫描间隔) 高(毫秒级)
‌灵活性‌ 每个队列固定 TTL 每条消息可单独设置延迟时间
‌依赖‌ 无需插件 需安装插件
‌实现复杂度‌ 中(需配置死信路由逻辑) 低(直接通过交换机属性控制)
‌适用场景‌ 固定延迟时间的批量消息 需动态调整延迟时间的高精度场景

六、实际使用建议

  1. ‌优先使用前三种‌:Direct、Fanout、Topic 覆盖了 95% 的场景。
  2. ‌避免滥用 Headers‌:匹配性能较低,除非需要复杂的头部匹配。
  3. ‌路由键命名规范 ‌:建议使用 . 分隔层级(例如 order.create.electronics)
相关推荐
kimnoic1 天前
Python数据库学习心得:SQLite、MySQL、PostgreSQL优缺点
开发语言·python
别动我齐刘海1 天前
C++ 工程化学习
java·linux·前端·c++·学习·机器学习·机器人
必须得开心呀1 天前
python编写带界面的软件,需要安装哪些插件
开发语言·python
code2cat1 天前
Java进阶篇之AtomicLongFieldUpdater:把累计额度留在对象字段中
java·cas·并发编程
WeiXin_DZbishe1 天前
基于springboot城市公交实时运营与调度系统-计算机毕设 附源码【课程设计】66173
java·vue.js·spring boot·后端·python·php·课程设计
泡茶喝茶写代码1 天前
A股量化数据工程:从 REST 接口到策略信号(第 18 篇):放量缩量异动扫描
java·python·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
wewowilling1 天前
认识微服务
java·运维·微服务·springcloud
代码什么用1 天前
Java Web 7-10
java·servlet
沫璃染墨1 天前
《Qt从零入门系列(十三):QSS样式表详解——从选择器与层叠规则到控件美化实战》
开发语言·css·c++·qt·ui·qt6.3·qss