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 // 参数正确位置);
AMQP.BasicProperties
构建.headers(header)
:将包含x-delay
的 Header 信息附加到消息。.deliveryMode(2)
:设置消息为持久化(重启 RabbitMQ 后消息不丢失)。.expiration("10000")
:设置消息过期时间为 10 秒(若 10 秒内未被消费,则自动删除)。
关键区别
-
x-delay
:需插件支持,实现延迟投递(消息暂存于交换机)。 -
expiration
:RabbitMQ 原生功能,控制消息存活时间(到期删除,不保证延迟精度)
两种方案对比
特性 | 死信队列 + TTL | 延迟消息插件 |
---|---|---|
延迟精度 | 较低(依赖队列扫描间隔) | 高(毫秒级) |
灵活性 | 每个队列固定 TTL | 每条消息可单独设置延迟时间 |
依赖 | 无需插件 | 需安装插件 |
实现复杂度 | 中(需配置死信路由逻辑) | 低(直接通过交换机属性控制) |
适用场景 | 固定延迟时间的批量消息 | 需动态调整延迟时间的高精度场景 |
六、实际使用建议
- 优先使用前三种:Direct、Fanout、Topic 覆盖了 95% 的场景。
- 避免滥用 Headers:匹配性能较低,除非需要复杂的头部匹配。
- 路由键命名规范:建议使用
.
分隔层级(例如order.create.electronics
)