1. 配置文件定义多活选项
- 在配置文件中定义使用 MQ 还是 Redis,确保两者的配置参数都预先准备好。
- 通过 Nacos 动态配置管理,可以在运行时根据服务状态选择合适的消息中间件。
# application.yml message.queue.type: mq # 初始使用 MQ,可以动态切换为 redis
import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.cloud.context.config.annotation.RefreshScope; @RefreshScope // 使该服务的配置能够动态刷新 @Service public class MessageService { @Value("${message.queue.type}") private String messageQueueType; @Autowired private MQService mqService; @Autowired private RedisService redisService; public void sendMessage(String message) { if ("mq".equalsIgnoreCase(messageQueueType)) { mqService.sendMessage(message); } else if ("redis".equalsIgnoreCase(messageQueueType)) { redisService.sendMessage(message); } else { throw new IllegalArgumentException("Unsupported message queue type: " + messageQueueType); } } public String receiveMessage() { if ("mq".equalsIgnoreCase(messageQueueType)) { return mqService.receiveMessage(); } else if ("redis".equalsIgnoreCase(messageQueueType)) { return redisService.receiveMessage(); } else { throw new IllegalArgumentException("Unsupported message queue type: " + messageQueueType); } } }
2. MQ 和 Redis 服务实现
@Service public class MQService { // 发送消息到 MQ public void sendMessage(String message) { // MQ 发送逻辑 System.out.println("Sending message to MQ: " + message); } // 从 MQ 接收消息 public String receiveMessage() { // MQ 接收逻辑 return "Message from MQ"; } } @Service public class RedisService { // 发送消息到 Redis public void sendMessage(String message) { // Redis 发送逻辑 System.out.println("Sending message to Redis: " + message); } // 从 Redis 接收消息 public String receiveMessage() { // Redis 接收逻辑 return "Message from Redis"; } }
3. Nacos 动态切换
- 通过 Nacos 实现动态配置切换,将消息队列的处理逻辑从 MQ 切换到 Redis。
- 切换过程中,确保消息的处理顺序、幂等性、ACK,避免重复或丢失。