面试必备:SpringMVC并发安全与RabbitMQ实战解析

需积分: 11 0 下载量 24 浏览量 更新于2024-08-05 收藏 4KB MD 举报
"面试常见问题汇总" 面试中常常会遇到各种技术问题,特别是在IT领域,面试官通常会测试候选人的基础知识、实践经验以及问题解决能力。以下是一些常见的面试问题及其详细解答,涵盖了SpringMVC、RabbitMQ、设计模式以及分布式事务。 ### 一、SpringMVC:如何保证Controller的并发安全 在SpringMVC框架中,Controller默认是单例的,这意味着多个请求可能会共享同一个Controller实例。由于Java对象的实例变量在多线程环境下可能存在并发问题,因此Controller中的实例变量不是线程安全的。为了避免数据逻辑混乱,应避免在Controller中定义实例变量。如果确实需要,可以通过`@Scope("prototype")`注解将Controller设置为多例模式,这样每个请求都会创建一个新的Controller实例。 ### 二、RabbitMQ的问题 #### 消息的可靠性 1. **持久化**:Exchange、queue和message都可以设置为持久化,确保即使Broker重启,消息也不会丢失。 2. **生产方确认Confirm**:生产者发送的消息会被RabbitMQ确认,确保消息已送达。 3. **消费方确认ACK**:手动确认机制可以在业务处理成功后签收消息,如果处理失败则拒绝签收,消息将重新投递。 4. **消费者限流机制**:通过`prefetch`属性限制消费端一次性拉取的消息数量,同时必须手动确认。 5. **TTL**:消息存活时间,超过设定时间未被消费则自动删除。 6. **死信队列DLX**:消息成为DeadMessage后,可以路由到死信交换机,进行后续处理。 7. **延迟队列**:适用于需要在特定时间后处理的消息,例如订单超时、短信通知等,可以使用TTL+DLX实现。 8. **消息追踪**:记录消息从生产到消费的完整路径,方便排查问题。 9. **消息的幂等性**:使用乐观锁等策略,确保相同消息多次处理结果一致。 ### 三、设计模式 1. **单例模式**:确保类只有一个实例并提供全局访问点,有多种实现方式,如双重检查锁、饿汉、懒汉、静态内部类和枚举。其中,双重检查锁是线程安全的懒汉式实现。 ### 四、分布式事务 分布式事务是解决跨数据库或服务间事务一致性的问题,常见的解决方案包括TCC(Try-Confirm-Cancel)、SEATA(分布式事务解决方案)和FAT(最终一致性事务)等。 以上只是面试中可能遇到的一些问题及基础解答,实际面试中还需要深入理解和应用这些知识,结合具体项目经验进行讨论。在准备面试时,理解并能灵活运用这些技术概念是非常关键的。