异步处理:订单创建 → 发送短信异步执行
系统解耦:支付服务与物流服务独立演进
流量削峰:应对秒杀活动瞬时流量
可靠传输:网络故障时保证消息不丢失
消息队列 | 吞吐量 | 延迟 | 可靠性 | 适用场景 |
---|---|---|---|---|
RabbitMQ | 万级 | 微秒级 | ★★★★★ | 金融交易、实时通知 |
Kafka | 百万级 | 毫秒级 | ★★★★☆ | 日志收集、流处理 |
RocketMQ | 十万级 | 毫秒级 | ★★★★★ | 电商订单、事务消息 |
# 启动RabbitMQ容器 docker run -d --name rabbitmq \ -p 5672:5672 -p 15672:15672 \ -e RABBITMQ_DEFAULT_USER=admin \ -e RABBITMQ_DEFAULT_PASS=admin123 \ rabbitmq:3-management
步骤1:添加依赖
org.springframework.boot spring-boot-starter-amqp
步骤2:配置连接
spring: rabbitmq: host: localhost port: 5672 username: admin password: admin123 virtual-host: /
// 生产者 @Component public class OrderProducer { @Autowired private RabbitTemplate rabbitTemplate; public void sendOrder(Order order) { rabbitTemplate.convertAndSend( "order.exchange", "order.create", order, message -> { message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT); return message; }); } } // 消费者 @Component @RabbitListener(queues = "order.queue") public class OrderConsumer { @RabbitHandler public void handleOrder(Order order) { // 处理订单逻辑 log.info("收到订单: {}", order); } } // 队列配置 @Configuration public class RabbitConfig { @Bean public Queue orderQueue() { return new Queue("order.queue", true); } @Bean public DirectExchange orderExchange() { return new DirectExchange("order.exchange"); } @Bean public Binding binding() { return BindingBuilder.bind(orderQueue()) .to(orderExchange()) .with("order.create"); } }
version: '3' services: zookeeper: image: zookeeper:3.8 ports: - "2181:2181" kafka: image: bitnami/kafka:3.4 ports: - "9092:9092" environment: KAFKA_CFG_ZOOKEEPER_CONNECT: zookeeper:2181 ALLOW_PLAINTEXT_LISTENER: "yes" depends_on: - zookeeper
步骤1:添加依赖
org.springframework.kafka spring-kafka
步骤2:配置参数
spring: kafka: bootstrap-servers: localhost:9092 producer: key-serializer: org.apache.kafka.common.serialization.StringSerializer value-serializer: org.springframework.kafka.support.serializer.JsonSerializer consumer: group-id: order-group key-deserializer: org.apache.kafka.common.serialization.StringDeserializer value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer properties: spring.json.trusted.packages: "com.example.model"
// 生产者 @Component public class LogProducer { @Autowired private KafkaTemplatekafkaTemplate; public void sendLog(LogMessage log) { kafkaTemplate.send("log.topic", log); } } // 消费者 @Component public class LogConsumer { @KafkaListener(topics = "log.topic", groupId = "log-group") public void consumeLog(LogMessage log) { // 日志存储与分析逻辑 log.info("处理日志: {}", log); } }
配置示例:
@Configuration public class RabbitReliabilityConfig { @Bean public RabbitTemplate.ConfirmCallback confirmCallback() { return (correlationData, ack, cause) -> { if (!ack) { log.error("消息发送失败: {}", cause); } }; } @Bean public SimpleRabbitListenerContainerFactory listenerFactory(ConnectionFactory connectionFactory) { SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); factory.setConnectionFactory(connectionFactory); factory.setAcknowledgeMode(AcknowledgeMode.MANUAL); return factory; } }
// 生产者配置 @Bean public ProducerFactoryproducerFactory() { Map config = new HashMap<>(); config.put(ProducerConfig.ACKS_CONFIG, "all"); config.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, true); config.put(ProducerConfig.RETRIES_CONFIG, 3); return new DefaultKafkaProducerFactory<>(config); } // 消费者配置 @Bean public ConsumerFactory consumerFactory() { Map config = new HashMap<>(); config.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false); config.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); return new DefaultKafkaConsumerFactory<>(config); }
访问管理界面:http://localhost:15672
关键指标监控:
队列积压消息数
消费者连接数
消息吞吐速率
使用Prometheus+Grafana:
# docker-compose监控服务 metrics: image: bitnami/kafka-exporter:1.4 ports: - "9308:9308" environment: KAFKA_BROKERS: kafka:9092
问题现象 | 可能原因 | 解决方案 |
---|---|---|
消息发送后丢失 | 未开启持久化 | 设置deliveryMode为PERSISTENT |
消费者重复消费 | 未正确提交Offset | 关闭自动提交,改为手动提交 |
Kafka吞吐量下降 | 分区数不足 | 动态增加主题分区数 |
RabbitMQ队列堵塞 | 消费者处理能力不足 | 增加消费者实例或提升处理逻辑性能 |
消息顺序错乱 | 多分区导致乱序 | 使用相同分区键保证顺序性 |
生产环境必做:
启用消息持久化
配置死信队列处理失败消息
实施监控告警机制
性能优化技巧:
RabbitMQ:使用多线程消费者
Kafka:合理设置批处理大小
消息设计规范:
定义统一的消息协议(JSON Schema/Avro)
添加消息版本号字段
包含消息唯一ID