rabbitmq 使用过程中遇到的问题

发布于:2025-05-28 ⋅ 阅读:(25) ⋅ 点赞:(0)

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

网站公告

今日签到

点亮在社区的每一天
去签到