MQ对比FeignClient
原创
2025-03-12 14:51
6
MQ(消息队列)和 FeignClient(远程调用)是两种不同的服务间通信方式,使用场景也不同,不能直接比较谁更好,而要看具体的业务需求。 **MQ 适用于异步、解耦、削峰填谷的场景**。 例如订单支付后,异步通知库存系统扣减库存;日志收集、消息通知、事件驱动架构;高并发秒杀系统,削峰填谷;邮件、短信、推送等异步任务。 使用 RabbitMQ 实现生产者: ```java rabbitTemplate.convertAndSend("orderQueue", orderJson); ``` 消费者: ```java @RabbitListener(queues = "orderQueue") public void processOrder(String orderJson) { // 处理订单 } ``` MQ 具有高可靠性,支持失败重试,避免服务间的强依赖,适合流量洪峰处理,如秒杀、日志、通知等场景。 **FeignClient 适用于同步、低延迟、强一致性的场景**。 例如调用用户服务查询用户信息,支付成功后同步更新订单状态,或者需要实时响应的 API 请求。 使用 FeignClient 进行远程调用: ```java @FeignClient(name = "user-service", fallback = UserFallback.class) public interface UserClient { @GetMapping("/users/{id}") User getUserById(@PathVariable("id") Long id); } ``` FeignClient 适用于服务间强依赖的调用,如用户查询、支付等,但需要结合熔断、降级机制,避免服务雪崩。 **MQ 和 FeignClient 不是互斥的,而是可以结合使用**。 在高并发、异步任务中使用 MQ,在低延迟、实时请求中使用 Feign。在重要操作(如支付)时,可以先调用 Feign 确保库存,再用 MQ 进行后续的异步通知。 例如订单服务调用库存服务时,可以先使用 Feign 进行库存扣减,确保库存充足,再用 MQ 异步通知物流系统发货: ```java // 1. 调用库存服务扣减库存(同步 Feign 调用) inventoryClient.deductStock(order.getProductId(), order.getQuantity()); // 2. 发送订单消息到 RabbitMQ(异步通知物流系统) rabbitTemplate.convertAndSend("logisticsQueue", order); ``` MQ 适合异步、削峰填谷的场景,而 Feign 适合同步、强一致性的场景。最优的方案是结合使用,使系统既能保证性能,又能提升稳定性。
评 论
目录